Pre-allocazione
I for
loop e i while
loop che aumentano in modo incrementale la dimensione di una struttura di dati a ogni iterazione possono influire negativamente sulle prestazioni e sull'utilizzo della memoria. Il ridimensionamento ripetuto degli array spesso richiede a MATLAB® di impiegare tempo aggiuntivo per cercare blocchi contigui di memoria più grandi e quindi spostare l'array in tali blocchi. Spesso è possibile migliorare i tempi di esecuzione del codice pre-allocando la quantità massima di spazio richiesta per l'array.
Il codice seguente mostra il tempo necessario per creare una variabile scalare x
e quindi aumentare gradualmente la dimensione di x
in un for
loop.
tic x = 0; for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.301528 seconds.
Se si pre-alloca un blocco di memoria per x
di 1x1.000.000 e lo si inizializza a zero, il codice viene eseguito molto più rapidamente, poiché non è necessario riallocare ripetutamente la memoria per la struttura di dati in crescita.
tic x = zeros(1,1000000); for k = 2:1000000 x(k) = x(k-1) + 5; end toc
Elapsed time is 0.011938 seconds.
Utilizzare la funzione di pre-allocazione appropriata per il tipo di array che si desidera inizializzare:
zeros
per gli array numericistrings
per gli array di stringhecell
per gli array di celletable
per gli array di tabelle
Pre-allocazione di una matrice non doppia
Quando si pre-alloca un blocco di memoria per contenere una matrice di un tipo diverso da double
, evitare di utilizzare il metodo
A = int8(zeros(100));
Questa dichiarazione pre-alloca una matrice 100x100 di int8
, creando prima una matrice completa di valori double
e poi convertendo ogni elemento in int8
. Creare l'array come valori int8
consente di risparmiare tempo e memoria. Ad esempio:
A = zeros(100,'int8');