如何用所有组合填充二进制矩阵?

时间:2014-04-16 17:45:22

标签: arrays matlab matrix binary

我希望有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具有大小(长度(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]等。但是,我相信这是一个更容易的问题它可以在更短的时间内完美地解决。

1 个答案:

答案 0 :(得分:4)

使用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形式,以构成每个所需的矩阵。