2016-01-03 256 views
5

我正在寻找一种简单的方法来获得二元矩阵的所有组合。我已经尝试了perms()功能,但没有得到正确的结果。我有例如矩阵N×N填充1和-1。与N = 2当我使用烫发()我没有得到例如第一矩阵将有2^4 1和可能的组合-1等Matlab:二元矩阵的所有组合

 (1 1)   (1 1)   (-1 -1) 
M(1) = (1 1) , M(2) = (1 -1) , M(3) = (1 1) and so on... 

我该如何解决这个问题?

回答

5

可以代表所有的数字02^(N^2)-1二进制数字之间,然后重塑:

N = 2; 
v = (1:2^(N^2))-1; 
A = dec2bin(v)' - '0'; %'// Or use: decimalToBinaryVector(v)'; 
A(A==0) = -1; 
A = reshape(A,N,N,2^(N^2)); 
+0

为什么downvote?如果我错了,我想知道为什么 –

+1

对我来说似乎很好,除了第一行的拼写错误('2^N-1'而不是'2 ^N²-1')。另外我会指出,这种方法并不强制你将所有这些组合存储在内存中,因为它可以在矩阵和“0:2 ^N²-1”之间建立1:1的对应关系,这意味着如果你只需要例如,随机获得这些矩阵之一,您可以选择一个数字,然后应用等值 – BillBokeey

+1

同样发生在我身上!我们在这里学习还是打架? – NKN

-1

甲简单的黑客如下:

v = [1 -1 1 -1]; 
P = perms(v); 
for ii = 1:size(P,1) 
    A = reshape(P(ii,:),2,2) 
end 

这导致:

A = 

    -1 -1 
    1  1 

... 

仍然存在其中应除去的结果相同的一些矩阵。

+1

你们的做法我不获得两个以上1或-1的矩阵。 – Samuel

+0

你只能得到两个“-1”和两个“1”组合的矩阵。要删除重复项,我建议一行'P = unique(P,'rows')'以消除重复项。 – Adriaan

-1

我认为我找到了一个解决我的问题

L = 2; 
N = L^2; 
v = cell(N,1); 
for k = 1:N 
    v{k} = linspace(-1,1,2); 
end 

ne=numel(v); 
x=cell(ne,1); 
[x{1:ne,1}]=ndgrid(v{end:-1:1}); 
p=reshape(cat(ne+1,x{:}),[],ne); 

F = cell(length(p),1); 
for k=1:length(p) 
    F{k} = reshape(p(k,:),L,L); 
end 
+0

为什么downvote?我的解决方案错了吗? – Samuel

+0

有两件事:请不要在SO代码中使用'clear all',因为人们倾向于自己复制这些代码,并且“清除”调用会弄乱所有内容。第二:'p'是一个65536x16的双倍,这对您的排列来说似乎有点大。所有需要的排列都在那里,但方式太频繁。你觉得你的尺寸有点太过分了。 – Adriaan

+0

另外:'v'只是一个16×1的单元,有16次相同的矩阵:'[-1 -1]'。整个循环只是编写这两个数字的一​​种困难方式。 (作为一个方面说明,我没有对这个答案进行投票) – Adriaan