Contenuto principale

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 numerici

  • strings per gli array di stringhe

  • cell per gli array di celle

  • table 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');

Vedi anche

Argomenti