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:
zerosper gli array numericistringsper gli array di stringhecellper gli array di celletableper 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');