2010-01-28 12 views
6

stavo facendo la seguenteConsiderate preallocare per la velocità

for i = 1:m, 
    index = 0; 
    for j = 1:n, 
     index = index+values(i,j)*2^(j-1); 
     if (j==1) 
      symbol_chip = chip_values(index+1,:); 
     else 
      symbol_chip = [symbol_chip chip_values(index+1,:)]; 
     end 
    end 
end 

mi dice il seguente:

symbol_chip potrebbe essere in crescita all'interno del ciclo. Prendi in considerazione la preallocazione per la velocità.

Qualche idea?

+3

Per evitare la ripetizione, in una domanda correlata: http://stackoverflow.com/questions/1548116/matrix-of-unknown-length-in-matlab/1549094#1549094, ho mostrato un modo per migliorare le prestazioni allocare memoria pur essendo efficiente in termini di spazio aggiungendo più spazio di memoria quando necessario – Amro

+2

Hai mai provato l'Aiuto Matlab ??? Basta premere F1 in una finestra di Matlab, digitare 'preallocazione' nel campo di modifica della ricerca e premere INVIO. Otterrai esattamente ciò di cui hai bisogno !!! – Mikhail

+3

Solo un commento: è meglio [non usare 'i' e' j' come nomi di variabili in Matlab] (http://stackoverflow.com/questions/14790740/using-i-and-j-as-variables- in mATLAB). – Shai

risposta

10

Sì. Ogni volta che vai in giro, il tuo blocco elseif sta ridimensionando symbol_chip, che è costoso. Invece, riscrivi il tuo codice in modo da avere (diciamo) symbol_chip = zeros(max_size, 1); prima del ciclo. Quindi, modificare il contenuto ma non le dimensioni di symbol_chip.

Avrai bisogno di cambiare leggermente approccio, ma sarà molto più veloce se lo fai. Se non ti infastidisce la velocità attuale, non cambiare nulla!

+0

spiacenti ho corretto dovrebbe leggere il resto non elseif –

+0

diciamo prima del ciclo for esterno metto il symbol_chip = zeri (m * 32,1); allora come potrei cambiare la mia dichiarazione if-else? –

2

M-Lint genera questo avviso se si dispone di una variabile che cresce all'interno di un loop senza essere preallineata. È possibile rimuovere questo errore pre-allocando la variabile di raccolta.

Per esempio, se si sapeva che lo symbol_chip variabile sarebbe avere al massimo i * elementi j, si potrebbe preallocare con l'affermazione:

symbol_chip = zeros(i*j); 

Tuttavia, per la maggior parte delle applicazioni preallocazione avrà solo un effetto trascurabile sulle prestazioni dell'algoritmo. Mi preoccuperei solo se hai a che fare con set di dati molto grandi.

+1

zeri (i * j) creeranno un array 2D con le colonne i * j e i * j. Per correggere questo utilizzare gli zeri (i * j, 1) – George

Problemi correlati