2013-07-12 12 views
5

C'è un modo per vettorizzare il seguente:Trasformare un (4D matrice * 1D vettore) il funzionamento in (a matrice 3D * 0D scalare) indipendente operazioni senza loop

for i = 1:6 
     te = k(:,:,:,i).*(c(i)); 
    end 

sto cercando di moltiplicare una matrice 4D , k, con un vettore, c, suddividendolo in operazioni indipendenti (a matrice 3D * scalare). Ho già altri due loop inevitabili all'interno di un ciclo while in questo file di funzione, e sto facendo del mio meglio per evitare i loop.

Qualsiasi commento su questo sarà molto apprezzato!

-SC

+0

Un ciclo for è probabilmente l'opzione migliore per qualcosa di più della matrice 2D. – Bee

+0

Avevo paura che potesse essere il caso. Ho provato a giocare con l'indicizzazione della matrice; per esempio. 'k ([3, 3; 3 3])' per vedere cosa sarebbe successo, ma è diventato super confuso. Non so se è il vialetto giusto per scendere comunque. –

risposta

5

È possibile farlo utilizzando MTIMESX - uno strumento di moltiplicazione di matrici veloce con il supporto multidimensionale da James Tursa, si trovano in scambio di file di Matlab.

E 'semplice come:

C = mtimesx(A,B) 

esegue il calcolo C = A * B

+0

Questo sembra promettente - grazie! –

1

A meno che non mi manca qualcosa, questo è un caso per bsxfun:

te=bsxfun(@times, k, permute(c,[3 4 1 2])); % c is a row vector 

O

te=bsxfun(@times, k, permute(c,[3 4 2 1])); % c is a column vector 

Si presume che la quarta dimensione di k abbia le stesse dimensioni di c. In caso contrario, è possibile utilizzare l'indicizzazione per sottotitoli:

te=bsxfun(@times, k(:,:,:,1:length(c)), permute(c,[3 4 2 1])); % c is a column vector 
+0

+1 per lo sforzo anche se la realtà è che rimuovere un ciclo for e sostituirlo con un codice a una riga non è sempre più veloce dell'originale. Ad esempio il tuo codice impiega il 75% in più per essere eseguito rispetto all'originale per il codice di loop. – Bee

+0

Per 10000 test su una matrice 10x10x10x10 e 10x10x10x5000, bsxfun gira circa il 10% più lentamente del ciclo for. D'accordo non è più veloce, ma non sono d'accordo sulla grandezza;) –