我希望有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]
等。但是,我相信这是一个更容易的问题它可以在更短的时间内完美地解决。
答案 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)
会将从0
到2^(r*c)-1
的所有数字都以二进制形式表示,每个数字都在一行中。 -'0'
部分只是将字符串转换为0
和1
值的数字向量。然后reshape
将每个行放入r
x c
形式,以构成每个所需的矩阵。