è necessario sostituire
shuffledframes = frames{randperm(NumberOfFrames)};
da uno di questi:
standard, consigliato modo:
shuffledframes = frames(randperm(NumberOfFrames));
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]
fonte
2014-09-22 14:00:26
Solo un sidenote, piuttosto che il ciclo si utilizza per la visualizzazione di tutti i valori potresti anche usare: 'frames {:}' –