R中的左序二进制矩阵算法

我正在尝试生成一种算法(最好是R中的函数),以便按如下方式通过左侧的列对任何二进制矩阵进行排序:

首先,重要的是要提到该函数只是对列进行排序。如果不移动所有列,则无法移动特定值。任何行也都移动。通过将二进制矩阵的列从左到右按该列表示的二进制数的大小进行排序(以第一行为最高有效位)来获得此功能。

示例:假设我有一个矩阵,例如$ \ begin {pmatrix} 1&0&0&1&0&1&0 \ 1&1&0&1&0&1&0 \ 0&1&1&0&1&0&0 \ 0&1&1&1&1&0&1 \ end {pmatrix} $,我想将其转换为$ \ begin {pmatrix} 1&1&1&0&0&0&0 \ 1&1&1&1&0&0&0 \ 0&0&0&1&1&1&0 \ 1&0&0&1&1&1&1 \ end {pmatrix} $

实际上,我通过将所有列都以1开头的方式对第一行进行排序。 在第2行中,在第一行的列为1的列之间,我对第一个具有1的列进行排序,并且在第一行的列为0的列之间进行相同的操作。 等到最后一行。

pengmail 回答:R中的左序二进制矩阵算法

只需要处理矩阵列的数值,并适当地使用 order 函数作为“ [,]”矩阵运算符中的第二个参数来对列进行正确排序。在这里:

    # vect is a binary vector
    # returns the value of the vector
    to.value <- function(vect){
       L <- length(vect)
       value <- 0
       for (i in L:1){
           value <- value + 2^(L-i)*vect[i]
      }
      return(value)
  }

  # matrix is a square binary matrix
  # returns the values of the columns in a vector

 column.values <- function(matrix){
     result <- numeric(ncol(matrix))
     for (i in 1:length(result)){
       result[i] <- to.value(matrix[,i])
    }
    return(result)
}

    # matrix is a square binary matrix
    # returns the matrix in the prescribed order

   get.ordered.matrix <- function(matrix){
      vals <- column.values(mat)
      return(matrix[,rev(order(vals))])
  }

    ### Test ###

 l <- 8
 set.seed(20)
 mat <- matrix(floor(runif(l^2,min=0,max=2)),ncol=l)
 mat
 get.ordered.matrix(mat)
本文链接:https://www.f2er.com/2918027.html

大家都在问