2012-10-02 13 views
5

Sono nuovo di Matlab, quindi non sono sicuro se questo è possibile. Ho un semplice ciclo for:Come vectorize per loop con indice personalizzato

for i=1:n 
    B.x(indexB(i)) += A.x(i); 
end 

Dove A.x e B.x sono due vettori di lunghezza n, e indiceB, specificati è un vettore di lunghezza n che contiene la mappatura appropriata da elementi in A.x a B.x.

È possibile vettorizzare questo ciclo?

risposta

8

Credo di sì, seguendo questo esempio:

a = [1 2 3 4 5]; 
b = a; 
idx = [5 4 3 2 1]; 
a(idx) = a(idx) + b(1:5); 

che dovrebbe dare:

a = 

6  6  6  6  6 

Quindi nel tuo caso, se indexB ha dimensioni n si può scrivere:

B.x(indexB) = B.x(indexB) + A.x(1:n); 

E in caso contrario:

B.x(indexB(1:n)) = B.x(indexB(1:n)) + A.x(1:n); 
+0

Questo funzionerebbe ancora se entrambi A e B non fossero della stessa lunghezza? –

+0

Sì, ma ci deve essere una mappatura uno-a-uno tra gli indici sinistro e destro, o in questo caso, il vettore indice 'indexB' usato per B.x e il vettore indice '[1: n]' usato per A.x. E ovviamente, gli elementi a cui si riferiscono gli indici, devono esistere. – Maurits

Problemi correlati