2016-01-03 192 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