2016-01-03 20 views
5

Ich bin auf der Suche nach einer einfachen Möglichkeit, alle Kombinationen einer binären Matrix zu erhalten. Ich habe schon die Funktion perms() ausprobiert, aber kein ordentliches Ergebnis bekommen.Matlab: Alle Kombinationen der binären Matrix

Ich habe zum Beispiel eine Matrix N x N gefüllt mit 1 und -1. Mit N = 2 würde es 2^4 mögliche Kombinationen sein von 1 und -1 wie

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

Wenn ich perms verwenden() Ich habe nicht zum Beispiel der ersten Matrix.

Wie kann ich das beheben?

Antwort

5

Sie fanden alle Zahlen zwischen 0 und 2^(N^2)-1 als binäre Zahlen darstellen kann, und dann neu zu gestalten:

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

Warum der Downvote? Wenn ich falsch liege, würde ich gerne wissen, warum –

+1

mir gut scheint, außer dem Tippfehler in der ersten Zeile ('2^N-1' statt' 2^N²-1'). Außerdem würde ich darauf hinweisen, dass diese Vorgehensweise Sie nicht zwingt, alle diese Kombinationen im Speicher zu speichern, da es eine 1: 1-Übereinstimmung zwischen Ihren Matrizen und "0: 2^N²-1" ergibt, was bedeutet, dass Sie nur brauchen um zum Beispiel eine dieser Matrizen zufällig zu bekommen, können Sie einfach eine Zahl auswählen und dann die Äquivalenz anwenden – BillBokeey

+1

Das gleiche ist mir passiert !!! Sind wir hier, um zu lernen oder zu kämpfen? – NKN

-1

Ein einfacher Hack ist wie folgt:

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

die Ergebnisse:

A = 

    -1 -1 
    1  1 

... 

Dennoch gibt es einige identische Matrizen in der Folge, die entfernt werden sollen.

+1

Mit Ihrem Ansatz kann ich nicht Erhalten Sie Matrizen mit mehr als zwei 1 oder -1. – Samuel

+0

Sie erhalten nur Matrizen mit einer Kombination aus zwei '-1' und zwei' 1's. Um die Duplikate zu entfernen, schlage ich eine Zeile 'P = unique (P, 'rows')' vor, um Duplikate zu eliminieren. – Adriaan

-1

Ich denke, dass ich eine Lösung für mein Problem

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

Warum der Downvote? Ist meine Lösung falsch? – Samuel

+0

Zwei Dinge: Bitte verwenden Sie nicht "alle löschen" in SO-Codes, da die Leute dazu neigen, diese Codes in ihre eigenen zu kopieren, und ein "klarer" Anruf alles vermasselt. Zweitens: 'p' ist ein 65536x16 Double, was für Ihre Permutationen etwas groß erscheint. Alle gewünschten Permutationen sind da, aber viel zu oft. Du bist ein bisschen über Bord gegangen mit deinen Dimensionen, denke ich. – Adriaan

+0

Auch: 'v' ist nur eine 16x1-Zelle mit 16 mal derselben Matrix:' [-1 1] '. Diese ganze Schleife ist nur eine schwierige Art, diese beiden Zahlen zu schreiben. (Als Nebenbemerkung habe ich über diese Antwort nicht abgestimmt) – Adriaan