2010-05-19 26 views
11

Sto cercando qualsiasi buon tutorial sulla vettorizzazione (loop) in MATLAB.Introduzione alla vettorizzazione in MATLAB - qualche buon tutorial?

Ho un algoritmo abbastanza semplice, ma utilizza due loop for. So che dovrebbe essere semplice da vettorializzare e vorrei imparare come farlo invece di chiederti la soluzione.

Ma per farvi sapere che cosa problema che ho, in modo che sarebbe in grado di suggerire le migliori tutorial che mostrano come risolvere i problemi simili, ecco il profilo del mio problema:

B = zeros(size(A)); % //A is a given matrix. 
for i=1:size(A,1) 
    for j=1:size(A,2) 
     H = ... %// take some surrounding elements of the element at position (i,j) (i.e. using mask 3x3 elements) 
     B(i,j) = computeSth(H); %// compute something on selected elements and place it in B 
    end 
end 

Così, ho' NON sto chiedendo la soluzione. Sto chiedendo un buon tutorial, esempi di cicli di vettorizzazione in MATLAB. Mi piacerebbe imparare come farlo e farlo da solo.

risposta

6

Qui ci sono un paio di MathWorks tutorial spesso mi collego a come riferimenti sul tema:

Ed ecco uno dei post del blog di Loren che ha una bella walkthrough di vettorizzazione del codice per un particolare problema di esempio:

Il particolare tipo di problema che ha dato come campione, che coinvolge sottomatrici di elaborazione di una data matrice, potrebbero essere vettorializzare in modi diversi a seconda fortemente dal tipo di operazione che si sta facendo. Potrebbe essere possibile utilizzare CONV2 o FILTER2 invece dei loop nidificati. Esistono inoltre un numero di funzioni nello Image Processing Toolbox che gestisce neighborhood and block processing of matrices, ad esempio NLFILTER e BLOCKPROC. La documentazione di queste funzioni dovrebbe aiutarti a capire come usarli come mezzo per vettorializzare il tuo codice.

+2

Contro fortemente l'utilizzo di blockproc se riesci ad evitarlo: è molto lento (inoltre, ha subito un cambiamento incompatibile dal 2009a al 2009b). Se hai abbastanza RAM, è sempre preferibile eseguire "im2col" e applicare la funzione in un colpo solo. – Jonas

+0

@Jonas: Buono a sapersi. In realtà non utilizzo BLOCKPROC abbastanza spesso da aver riscontrato tali problemi. Lo stavo elencando come una delle numerose opzioni che l'OP potrebbe voler esaminare. – gnovice

1

La regola generale è che è necessario utilizzare le funzioni MATLAB incorporate che operano su array al posto di cicli quando possibile. Ad esempio, mi sembra che il problema che hai descritto possa essere formulato come una convoluzione, e quindi puoi utilizzare le funzioni di matlab conv2() o filter() per implementarlo senza il ciclo.

Un altro trucco generale è provare a formulare il problema in termini di operazioni con le matrici.

Si consiglia inoltre di preferire lo spazio di trading per il tempo. Diciamo che hai un vettore n-dimensionale v e una matrice m x n M, dove ogni riga è anche un vettore n-dimensionale. Diciamo che vuoi le distanze euclidee tra v e ogni riga di M. In questo caso è necessario utilizzare repmat() per creare una matrice contenente m copie di v e calcolare le distanze utilizzando operazioni di array element-element senza un ciclo.

3

C'è un po 'di riscrittura che ho fatto un anno fa per spiegare un trucco che ho trovato dopo aver trascorso 3 anni a scrivere il codice Matlab ogni giorno, spendendo spesso troppo tempo per vettorizzare tutto.

http://www.gyomalin.com/reasonable_vectorization.html

L'idea principale è che si può ottenere una lunga strada semplicemente vettorizzazione il codice lungo una sola dimensione. Alcuni di voi potrebbero aver già scoperto questo trucco, ma penso che valga la pena di essere chiamato modello di design Matlab.

+0

bello, grazie! – Gacek

Problemi correlati