我想获得一个二进制矩阵,其中包含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个(或左右)列。
答案 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
,可能会有更有效的解决方案。