2012-10-21 17 views
5

Ho un 3d (o in generale n-dimensionale) matrice A con dimensioni3d matrice per vettore colonna moltiplicazione

size(A) = [d1 d2 d3 ... dn]. 

Ora voglio fare una moltiplicazione vettore con un vettore colonna v sopra una delle dimensioni (come farei in 2 dimensioni, dove ottengo un vettore restituito - ad esempio per d1 = 2, d3 = 4 e size(v) = d2), in modo che

(A*d)_i = sum(a_ij*v_j). 

quindi voglio ridurre di una dimensione.

C'è una funzione Matlab (diverso da looping) che restituisce una colonna di d3 dimensionale vettore v

(A*v)_ij = sum(A_ijk*v_k). 

Spero che questo era chiaro.

Grazie!

risposta

3

Potete farlo con un paio di reshape 's:

A=rand(2,3,4); 
v=rand(1,4); 
reshape(reshape(A,[size(A,1)*size(A,2),size(A,3)])*v,[size(A,1) size(A,2)]) 

In sostanza, si rimodellare A in una matrice 2D A2 ((ij), (k)) = A ((i), (j), (k)):

A2=reshape(A,[size(A,1)*size(A,2),size(A,3)]) 

Poi si fa il solito multiplcation:

per tutti (ij) B2 ((ij)) = sum_k A2 ((ij), (k)) * v ((k)):

B2=A2*v 

La si rimodellare indietro:

B ((i), (j)) = B ((ij))

B=reshape(B2,[size(A,1) size(A,2)]) 

Spero che questo sia chiaro

+1

bene - grazie mille. Speravo in qualcosa di più liscio, ma questo è abbastanza giusto, immagino. – user1763302

+1

Questo metodo funziona solo quando la dimensione da moltiplicare è l'ultima dimensione della matrice N-d. Sarebbe bello se il codice funzionasse per qualsiasi dimensione 1 ... N della matrice N-D. Sembra fattibile con 'dimshift' all'inizio e alla fine. – cjh

+0

Sembra fattibile con 'permute' infatti ... Ci vorranno pochi minuti per pensarci. Sentiti libero di modificare la mia risposta o di aggiungere la tua. Presto ho una scadenza. – Oli

3

Si può fare un po 'più liscio. per le matrici reshape richiede solo 1 argomento, l'altro viene automaticamente calcolato se non specificato, il che è molto utile in tali situazioni.

Quindi, la soluzione presentata da Oli può essere più brevemente scritto come

A = rand(2,3,4); 
v = rand(4,1); 

A2 = reshape(A, [], numel(v));  % flatten first two dimensions 
B2 = A2*v; 
B = reshape(B2, size(A, 1), []);