【问题标题】:How to populate binary matrices with all the combinations?如何用所有组合填充二进制矩阵?
【发布时间】:2014-05-31 17:50:09
【问题描述】:

我想要 2^n 个矩阵,其中包含 0 和 1 的所有组合。例如,对于 n=6 (n=#rows x #columns) array{1}=[0 0 0; 0 0 0],array{2}=[0 0 0; 0 0 1]...array{64}=[1 1 1;1 1 1]。我正在使用 MATLAB,遇到了 combn.m (M = COMBN(V,N) 返回向量 V 中元素的 N 个元素的所有组合。M 的大小为 (length(V).^N)-by- N.), dec2bin() 但我不能完全正确。我的另一个想法是创建一个大矩阵,然后将其拆分为 2^n 个矩阵。例如,对于 n=6(2 x 3),我这样做了M=combn([0 1],3),这给了我:

M =

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

然后,使用这个M 创建一个更大的矩阵,比如M2=combn(M,2),但这会产生错误的结果。但是,如果我像这样连接 M 行:

M=combn([000;010;100;001;110;011;101;111],2)' 我得到的东西更接近我的预期,即

M =

Columns 1 through 21

 0     0     0     0     0     0     0     0    10    10    10    10    10    10    10    10   100   100   100   100   100
 0    10   100     1   110    11   101   111     0    10   100     1   110    11   101   111     0    10   100     1   110

 Columns 22 through 42

   100   100   100     1     1     1     1     1     1     1     1   110   110   110   110   110   110   110   110    11    11
11   101   111     0    10   100     1   110    11   101   111     0    10   100     1   110    11   101   111     0    10

  Columns 43 through 63

  11    11    11    11    11    11   101   101   101   101   101   101   101   101   111   111   111   111   111   111   111
  100     1   110    11   101   111     0    10   100     1   110    11   101   111     0    10   100     1   110    11   101

  Column 64

   111
   111 

我可以在其中获取每一列并将其分别转换为 64 个矩阵。因此,例如,第 1 列将从 [0;0] 转换为 [0 0 0;0 0 0] 等。但是,我相信它可以是一个更容易的问题在更短的时间内优雅地解决。

【问题讨论】:

    标签: arrays matlab matrix binary


    【解决方案1】:

    使用dec2bin

    r = 2; %// nunber of rows
    c = 3; %// number of columns
    
    M = dec2bin(0:2^(r*c)-1)-'0'; %// Or: M = de2bi(0:2^(r*c)-1);
    M = reshape(M.',r,c,[]);
    

    M 是一个大小为 r x c x 2^(r*c) 的 3D 数组,因此 M(:,:,1) 是第一个矩阵,M(:,:,2) 是第二个矩阵,依此类推。

    它是如何工作的

    dec2bin 给出数字的二进制字符串表示。所以dec2bin(0:2^(r*c)-1) 给出了从02^(r*c)-1 的所有数字,以二进制表示,每一个都在一行中。 -'0' 部分只是将字符串转换为 01 值的数字向量。然后reshape 将这些行中的每一行放入r x c 表单中,以组成每个所需的矩阵。

    【讨论】:

    • 如何控制n?我的意思是 n 可以是 6 但 2 行乘 3 列。你能把它和上面的例子联系起来吗?
    • @JustCurious 抱歉,我没有仔细阅读您的问题。我现在有,但我不明白你想要什么
    • 我想要 2^n 个二进制矩阵。每个矩阵应该彼此不同,但具有相同的#rows x #columns。重要的是,n=#rows x #columns。所以对于 n=6,我希望有 64 个矩阵,每个矩阵都有不同的 0 和 1 组合。现在清楚一点了吗?
    • 感谢您的回答!十分优雅!正是我想要的!您介意解释一下 dec2bin 和 reshape 在这种情况下是如何工作的吗?
    • @JustCurious 谢谢!我在回答中添加了解释
    猜你喜欢
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2016-06-28
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多