我想创建长度为n > 2
的二进制向量的所有可能组合,其中该行的1
的最大数量为2
。
例如:
如果n=4
,答案是:
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
1 0 0 0
1 0 0 1
1 0 1 0
1 1 0 0
这很有用,但是当n变大(n> 20)时,内存非常密集且速度很慢:
n <- 4
m <- expand.grid(rep(list(0:1),n))
m <- m[rowSums(m)<3,]
如何更有效地完成这项工作?
答案:
*基于Marat Talipov和akrun的解决方案的组合
n=4
z=rep(0,n)
rbind(unname(z), t(combn(0:n,2, FUN=function(k) {z[k]=1;z})))
答案 0 :(得分:6)
此算法可能比基于expand.grid
的算法更有效:
n <- 3
z <- rep(0,n)
answer <- t(apply(combn(0:n,2),2,function(k) {z[k]=1;z}))
# [,1] [,2] [,3]
# [1,] 1 0 0
# [2,] 0 1 0
# [3,] 0 0 1
# [4,] 1 1 0
# [5,] 1 0 1
# [6,] 0 1 1
[编辑]我注意到我的原始解决方案错过了一个全零的小案例, 这很容易修复:
rbind(unname(z),answer)
# [,1] [,2] [,3] [,4]
# [1,] 0 0 0 0
# [2,] 1 0 0 0
# [3,] 0 1 0 0
# [4,] 0 0 1 0
# [5,] 0 0 0 1
# [6,] 1 1 0 0
# [7,] 1 0 1 0
# [8,] 1 0 0 1
# [9,] 0 1 1 0
# [10,] 0 1 0 1
# [11,] 0 0 1 1