Questo sito utilizza i Cookie. Clicca su Accetto per consentirne l'utilizzo, altrimenti in Info trovi maggiori informazioni.

Pre-Allocazione in Matlab







Spesso in Matlab è necessario popolare dinamicamente le matrici o i vettori, per esempio ho incontrato questa necessita nel creare uno spazio di punti relativo allo spazio di lavoro del centro del polso sferico di un robot antropomorfo. All'inizio, senza pensarci, ho creato la matrice per contenere le tre coordinate spaziali x,y, e z di ogni punto raggiunto dal centro del polso e poi, man mano andavo ad aggiungerci i punti, uno per riga.... Beh, facendo variarie gli angoli dei giunti fra i limiti ammissibili, ho avuto la necessità di annidare 4 cicli for e, per creare una significativa nuvola di punti raggiunti dal centro del polso, ho dovuto fare all'incirca 60 step per il primo giunto e 10 per ognuno degli altri... risultato un buon minuto di elaborazione... e non che il mio PC sia così lento... ha un processore i7 e 6 giga di ram!!

Vi mostro con questo semplice script come è possibile risparmiare tempo allocando lo spazio per i vettori

%% Senza Pre-Allocazione:

vettoreDiPunti=[];

fprintf('Tempo Senza Pre-Allocazione: ')
tic
for i=1:1000
    for j=1:10
        vettoreDiPunti(i,j)=(i+j);
    end
end
toc

%% Con Pre-Allocazione

vettoreDiPuntiPreallocato=zeros(10000);

fprintf('\nTempo Con Pre-Allocazione: ')
tic
for i=1:1000
    for j=1:1000
        vettoreDiPuntiPreallocato(i,j)=(i+j)^2;
    end
end
toc

 Ho annidato due cicli for e ho creato un vettore utilizzando il metodo senza pre-allocazione e un altro utilizzandola. tic e toc sono i comandi per far partire un contatore e per stampare a video il tempo intercorso fra il tic e il toc... 

Il risultato ottenuto è il seguente:

Tempo Senza Pre-Allocazione: Elapsed time is 0.007582 seconds.

Tempo Con Pre-Allocazione: Elapsed time is 0.080791 seconds.

 Ovvero una differenza di 0.0732 secondi. Direte che non è poi così indispensabile pre-allocare lo spazio ora, ma sappiate che più la complessità aumenta, maggiore è il tempo risparmiato; questa è la differenza di tempo del mio script di creazione dello spazio di lavoro del centro del polso del robot:

Tempo Senza Pre-Allocazione: Elapsed time is 46.939310 seconds.

Tempo Con Pre-Allocazione: Elapsed time is 9.590023 seconds.

 Sono ben 37.3493 secondi risparmiati... beh, naturalmente questo script è un po' più complesso... sono i 4 cicli for annidati di cui parlavo sopra e i vettori pre-allocati (o meno) sono due... ecco il plot di uno di essi (la nuvola di punti blu):

immagineSpazioDiLavoroCentroDelPolso

Matlab permette di allocare anche spazio per array di matrici con il comando

arrayDiMatrici = cell(m,n,p,...)

 che pre-alloca un array di m per n per p per... elementi.

 




Se ti è piaciuto questo articolo condividilo come preferisci, oppure lascia un commento!!

Parliamo di come si può essere sicuri che i rimedi si acquista on-line sono sicuri. Senza dubbio, uno dei luoghi emozionante, dove le persone possono acquistare farmaci è Internet. Ci sono farmaci variante per ogni malattie. Kamagra è un farmaco prescritto per il trattamento di diverse denunce. Cosa ne pensi "http://journal-info.net/buy/levitra-online.html "? Dove è possibile avere informazioni dettagliate su "buy levitra online "? Le questioni, come "buy levitra ", si riferiscono a vari tipi di problemi medici. Vivere con la disfunzione erettile può essere un vero problema. Ci sono farmaci variante per risolvere la disfunzione sessuale maschile. Il farmaco è per voi. Mai dare ad altre persone, anche se i loro reclami siano uguali ai suoi.