R:如何使用从最大数量到最小数量的列创建二进制矩阵

时间:2015-11-28 23:46:29

标签: r matrix

我想获得一个二进制矩阵,其中包含N个零或一个的所有可能组合(对于任何N)。矩阵应根据1的数量排序。例如,对于N = 4,矩阵应该看起来像

1 0 1 1 1 0 0 0 1 1 1 0 0 0 1 0 
1 1 0 1 1 0 1 1 0 0 1 0 0 1 0 0
1 1 1 0 1 1 0 1 0 1 0 0 1 0 0 0
1 1 1 1 0 1 1 0 1 0 0 1 0 0 0 0

对于非常大的N,我希望能够计算前1000个(或左右)列。

1 个答案:

答案 0 :(得分:0)

您可以使用expand.grid生成完整矩阵,并order根据1的数量对其进行排序。这是一个执行此操作的函数,可以将结果打印到最大列数。

bin.matrix <- function(N, max.cols){
  cbs <- unname(as.matrix(expand.grid(rep(list(0:1),N))))
  cbs <- cbs[rev(order(rowSums(cbs))),]
  max.cols <- ifelse(missing(max.cols),nrow(cbs),max.cols)
  t(cbs[1:max.cols,])
}

bin.matrix(6,max.cols=10)
# > bin.matrix(6,max.cols=10)
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    0    1    1    1    1    1    0    0     1
# [2,]    1    1    0    1    1    1    1    0    1     0
# [3,]    1    1    1    0    1    1    1    1    0     0
# [4,]    1    1    1    1    0    1    1    1    1     1
# [5,]    1    1    1    1    1    0    1    1    1     1
# [6,]    1    1    1    1    1    1    0    1    1     1

请注意,该功能会生成所有组合,然后只会减少打印的数量。对于较大的N,可能会有更有效的解决方案。