2010-02-26 13 views
5

sto chiedendo se esiste un modo efficiente in MATLAB per generare tutti i vettori di lunghezza fissa con elementi di un insieme finito.Generazione di vettori in MATLAB

Per esempio, come posso costruire tutti i vettori di lunghezza 5 con solo 0 o 1 come elementi?

risposta

3

non proprio quello che ti serve, ma permv genera permutazioni vettoriali. Se non trovi la soluzione esatta, puoi adattare le permutazioni del vettore.

permv

+0

Grazie! Penso che questo sia esattamente ciò di cui ho bisogno. –

+0

@Kiran: tieni presente che devi prima scegliere un vettore a 5 elementi di uno e zero per iniziare, quindi PERMS ti darà ogni permutazione di quello. – gnovice

+0

Grazie per il suggerimento, gnovice. Questo rende il mio codice molto più veloce rispetto a prima e questo è davvero buono. –

1

Nuova risposta:

È possibile accelerare la soluzione DEC2BINsuggested by AB (con assist di woodchips) dal posto utilizzando la funzione BITGET. Ci sono due modi per affrontarlo. Il primo utilizza la funzione REPMAT per rendere gli ingressi uguali dimensioni (entrambe le matrici 32-by-5):

allCombos = bitget(repmat((0:31)',1,5),repmat(5:-1:1,32,1)); 

e la seconda chiama semplicemente BITGET una volta per ogni singolo bit che si desidera ottenere:

vec = (0:31)'; 
allCombos = [bitget(vec,5) bitget(vec,4) bitget(vec,3) ... 
      bitget(vec,2) bitget(vec,1)]; 

e qui ci sono alcuni tempi di esempio:

 Method  | Average Time 
-----------------+------------------ 
    DEC2BIN  | 0.000788 s 
    BITGET+REPMAT | 0.000727 s 
    BITGET x5  | 0.000045 s 

Come si può vedere, la srotolato BITGET è molto veloce.


Vecchia risposta: (per i posteri)

Se si vogliono costruire una matrice di ogni possibile vettore di zero e uno che ha una lunghezza di 5, questo sarebbe un modo di farlo utilizzando le funzioni PERMS e UNIQUE (dal PERMS crea righe ripetute):

allCombos = [0 0 0 0 0; 
      unique(perms([0 0 0 0 1]),'rows'); ... 
      unique(perms([0 0 0 1 1]),'rows'); ... 
      unique(perms([0 0 1 1 1]),'rows'); ... 
      unique(perms([0 1 1 1 1]),'rows'); ... 
      1 1 1 1 1]; 
10

Il modo corretto per costruire tutti i vettori di lunghezza 5 con solo 0 o 1 come elementi è

a = dec2bin(0:31,5) - '0'; 

Spero che tu capisca perché.

+0

+1 Bella risposta. L'unico inconveniente possibile è che DEC2BIN può essere * dolorosamente * lento. – gnovice

+1

@gnovice: Mi hai fatto andare a dare un'occhiata alla sorgente DEC2BIN. Sì, probabilmente non è molto efficiente, ma è davvero carino! Grazie. – AVB

+3

Invece di fare il ciclo, abituarsi a non fare il ciclo. >> tic, a = zeri (10,1024); per x = 0: 1023, a (: x + 1) = str2num (dec2bin (x, 10) '); end, toc Il tempo trascorso è 0,105492 secondi. >> tic, a = dec2bin (0: 1023) - '0'; toc Il tempo trascorso è 0.000868 secondi. –

3

MathWorks' FileExchange è tuo amico:

Quindi, utilizzando la prima funzione, la sua facile come:

VChooseKRO([0 1], 5) 

Si può anche fare il lavoro per un array di celle di stringhe come l'insieme finito:

C = {'a' 'b' 'c' 'd'}; 
C(VChooseKRO(1:numel(C), 2)) 
Problemi correlati