【问题标题】:How to generate a matrix to store all non-empty subsets of a set如何生成一个矩阵来存储集合的所有非空子集
【发布时间】:2013-11-07 22:31:21
【问题描述】:

假设我有一个集合 N={1,2,3},那么我们可以列出它的所有 7 个非空子集。

    n=3 # number of elements in a set
    a=2^n-1 # number of non-empty subsets for that set
    subsets=lapply(1:n, function(x) combn(n, x)) # list all the non-empty subest
    subsets

现在我想将这些子集放入一个矩阵并组织如下:

    if n=3     or in an index matrix:    
    1 0 0      1 0 0
    0 2 0      0 1 0
    0 0 3      0 0 1

    1 2 0      1 1 0
    1 0 3      1 0 1
    0 2 3      0 1 1

    1 2 3      1 1 1

任何人都知道如何编写可以轻松扩展到任意 n (=4, 5, 6...) 的代码吗?我试过这个:

    subindex=matrix(c(0), nrow=a, ncol=n)

    i=1
      while(i<=a){

       j=n
       b=2^(n-1)
       N=i
          while(N>0){
             if(b<=N) {subindex[i,j]=1}&{N=N-b}
             b=trunc(b/2)
             j=j-1
          }

       i=i+1
       }
      subindex

但是我得到的索引矩阵在第 3 行和第 4 行是错误的。如果 n=4,那么会有更多错误...有人可以纠正这个或简化这个代码吗?或者只是编写一个全新的代码。真的很感激。

【问题讨论】:

  • downvote 似乎有点不合理,不是吗?
  • 是的。我想我是在高速公路上偶然做的。它不会让我现在扭转它。

标签: r matrix while-loop subset


【解决方案1】:
n <- 4
lapply(seq_len(n), function(i)t(combn(n, i, FUN = tabulate, nbins = n)))

# [[1]]
#      [,1] [,2] [,3] [,4]
# [1,]    1    0    0    0
# [2,]    0    1    0    0
# [3,]    0    0    1    0
# [4,]    0    0    0    1
# 
# [[2]]
#      [,1] [,2] [,3] [,4]
# [1,]    1    1    0    0
# [2,]    1    0    1    0
# [3,]    1    0    0    1
# [4,]    0    1    1    0
# [5,]    0    1    0    1
# [6,]    0    0    1    1
# 
# [[3]]
#      [,1] [,2] [,3] [,4]
# [1,]    1    1    1    0
# [2,]    1    1    0    1
# [3,]    1    0    1    1
# [4,]    0    1    1    1
# 
# [[4]]
#      [,1] [,2] [,3] [,4]
# [1,]    1    1    1    1

【讨论】:

  • 我能说什么...@_@~~ Orz...感激和崇拜泪流满面。非常感谢@flodel
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2014-04-23
  • 2020-06-10
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多