2014-09-22 6 views
5

Attualmente sto cercando di mischiare il contenuto di un 1 x N cella matrice in MATLAB utilizzando il codice follwoing:Mescolare un array di celle (Matlab)

shuffledframes = frames{randperm(NumberOfFrames)}; 
frames=shuffledframes; 

%printing cell array contents 
for i=1:NumberOfFrames 
    frames(i) 
end 

Tuttavia il contenuto dei frame non sembrano Suffle ...

C'è un errore nel codice, che non vedo?

+0

Solo un sidenote, piuttosto che il ciclo si utilizza per la visualizzazione di tutti i valori potresti anche usare: 'frames {:}' –

risposta

7

è necessario sostituire

shuffledframes = frames{randperm(NumberOfFrames)}; 

da uno di questi:

  1. standard, consigliato modo:

    shuffledframes = frames(randperm(NumberOfFrames)); 
    
  2. più complesse alternativi utilizzando gli elenchi:

    [frames{:}] = frames{randperm(NumberOfFrames)}; 
    

Perché? Nel codice originale, frames{randperm(NumberOfFrames)} dà un numero comma-separated list. Matlab prende solo il primo numero di quell'elenco e lo assegna a shuffledframes.

Nell'approccio 1 sopra, frames(randperm(NumberOfFrames)) indicizza l'array di celle originale con un vettore di indice per produrre un nuovo array di celle, che è ciò che si desidera.

L'approccio 2 ha lo stesso effetto desiderato, sebbene sia inutilmente più complicato. Funziona abbinando una lista con un'altra lista. Vale a dire, Matlab riempie rispettivamente ciascun valore della lista frames{:} con ciascun valore della lista frames{randperm(NumberOfFrames)}.

Per vedere più chiaramente, osservare il lato destro della prima riga del codice, e confrontare con l'approccio 1:

>> frames = {1,2,3,4}; 
>> NumberOfFrames = 4; 
>> frames{randperm(NumberOfFrames)} %// Your code. Gives a list of values. 
ans = 
    3 
ans = 
    4 
ans = 
    2 
ans = 
    1 

>> frames(randperm(NumberOfFrames)) %// Approach 1. Gives cell array. 
ans = 
    [3] [1] [4] [2] 
+0

Questo sarebbe ancora valido nel caso di un array di celle ?? – asterix

+0

@asterix Ho modificato la mia risposta per renderlo più chiaro –