2016-01-03 120 views
5

Sto cercando un modo semplice per ottenere tutte le combinazioni di una matrice binaria. Ho provato già la funzione perms() ma non ho ottenuto un risultato corretto.Matlab: tutte le combinazioni di matrice binaria

Ho ad esempio una matrice N x N piena di 1 e -1. Con N = 2 ci sarebbero 2^4 possibili combinazioni di 1 e -1 come

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

Quando uso perm() che non ottengono ad esempio la prima matrice.

Come posso risolvere il problema?

risposta

5

È possibile rappresentare tutti i numeri compresi tra 0 e 2^(N^2)-1 come numeri binari, e poi rimodellare:

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

Perché il downvote? Se ho torto mi piacerebbe sapere perché –

+1

mi sembra buono, tranne l'errore di battitura sulla prima riga ('2^N-1' invece di' 2^N²-1'). Inoltre, vorrei sottolineare che questo approccio non ti obbliga a memorizzare tutte queste combinazioni in memoria, in quanto fornisce una corrispondenza 1: 1 tra le tue matrici e '0: 2^N²-1', ovvero se hai solo bisogno per ottenere una di queste matrici a caso, ad esempio, puoi semplicemente scegliere un numero e quindi applicare l'equivalenza – BillBokeey

+1

Lo stesso è successo a me !!! Siamo qui per imparare o combattere? – NKN

-1

Un semplice trucco è il seguente:

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

che si traduce in:

A = 

    -1 -1 
    1  1 

... 

Ancora ci sono alcune matrici identiche nel risultato che dovrebbe essere rimosso.

+1

Con il vostro approccio non lo faccio ottieni matrici con più di due 1 o -1. – Samuel

+0

Ottieni solo matrici con una combinazione di due '-1's e due' 1's. Per rimuovere i duplicati suggerisco una riga 'P = unique (P, 'rows')' per eliminare i duplicati. – Adriaan

-1

penso che ho trovato una soluzione al mio problema

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

Perché il downvote? La mia soluzione è sbagliata? – Samuel

+0

Due cose: per favore non usare "cancella tutto" nei codici SO, dato che le persone tendono a copiare questi codici da soli e una chiamata "chiara" rovina tutto. Secondo: 'p' è un doppio 65536x16, che sembra un po 'grande per le tue permutazioni. Tutte le permutazioni desiderate ci sono, ma troppo spesso. Sei un po 'esagerato con le tue dimensioni, penso. – Adriaan

+0

Inoltre: 'v' è solo una cella 16x1 con 16 volte la stessa matrice:' [-1 1] '. L'intero ciclo è solo un modo difficile di scrivere quei due numeri. (Come nota a margine, non ho votato su questa risposta) – Adriaan