首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有for循环的二进制穷举列表

没有for循环的二进制穷举列表
EN

Stack Overflow用户
提问于 2015-09-24 03:07:33
回答 2查看 70关注 0票数 2

我试图在一个列表中找出1和0的每一个可能的组合,没有任何重叠。我希望列表包含一系列矩阵。

我提出了以下代码,实现了这个目标,例如,如果您想要2x2矩阵中的2值为1和2为0:

代码语言:javascript
复制
z<-0
 for(i in 1:(4-1)){
   for(j in (i+1):(4)){
     x<-rep(0,4)
     x[c(i,j)]<-1
     x<-matrix(x,nrow=2,byrow=TRUE)
     z<-z+1
     k[[z]]<-x
}}

这很好,但我希望能够创建一个涉及更多的0和1的列表。

我知道怎么做的唯一方法就是为循环嵌套越来越多。

例如,为了在一个3x3矩阵中的9个总空间中打印出每个非重复的31‘s组合:

代码语言:javascript
复制
for(i in 1:(9-2)){
for(j in (i+1):(9-1)){
for(k in (j+1):9){
x<-rep(0,9)
x[c(i,j,k)]<-1
x<-matrix(x,nrow=3,byrow=TRUE)
print(x)
}}}

我觉得必须有一个更优雅和更快的解决方案(特别是在处理更多的数字时)。即使一个简单的解可以给出向量,也很容易给出矩阵的列表。我希望列表中列出1和0的可变数量,以便我可以使用它们来进一步操作。

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-24 04:06:36

这是一个函数来做它。第一个参数是矩阵边的大小,第二个参数是想要的边数:

代码语言:javascript
复制
makematrix <- function(n, k){
  z <- as.data.frame(t(expand.grid(rep(list(c(0,1)), n * n))))
  z <- z[ ,colSums(z) == k]
  lapply(z, function(x){matrix(x, nrow = n)})
}

首先利用expand.grid将数据帧中0和1的所有组合,由正确数目为1s的集合进行子集,然后用lapply将它们重新排列成矩阵列表。

代码语言:javascript
复制
makematrix(2, 2)
$V4
     [,1] [,2]
[1,]    1    0
[2,]    1    0

$V6
     [,1] [,2]
[1,]    1    1
[2,]    0    0

$V7
     [,1] [,2]
[1,]    0    1
[2,]    1    0

$V10
     [,1] [,2]
[1,]    1    0
[2,]    0    1

$V11
     [,1] [,2]
[1,]    0    0
[2,]    1    1

$V13
     [,1] [,2]
[1,]    0    1
[2,]    0    1
票数 2
EN

Stack Overflow用户

发布于 2015-09-24 07:54:10

您还可以直接使用库combinat,其中的permn函数提供了一个直接列表:

代码语言:javascript
复制
library(combinat)

unique(permn(c(1,1,0,0),function(x) matrix(x,nrow=sqrt(length(x)))))

#[[1]]
#     [,1] [,2]
#[1,]    1    0
#[2,]    1    0

#[[2]]
#     [,1] [,2]
#[1,]    1    1
#[2,]    0    0

#[[3]]
#    [,1] [,2]
#[1,]    0    1
#[2,]    1    0

#[[4]]
#     [,1] [,2]
#[1,]    0    0
#[2,]    1    1

#[[5]]
#     [,1] [,2]
#[1,]    1    0
#[2,]    0    1

#[[6]]
#     [,1] [,2]
#[1,]    0    1
#[2,]    0    1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32752658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档