2012-10-21 18 views
5

mam 3d (lub ogólnie n-wymiarowej) matrycy A o wymiarach3d matrycy przez kolumnę mnożenie wektorowe

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

Teraz chce wykonać mnożenie wektorów zawierających wektor kolumny v przez jeden z wymiarów (jak to zrobić w 2 wymiarach, gdzie mogę dostać wektor zwrócony - na przykład dla d1 = 2, d3 = 4 i size(v) = d2), tak że

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

dlatego chcę, aby zmniejszyć o jeden wymiar.

Czy istnieje funkcja Matlab (inne niż zapętlenie), która zwraca na d3 wymiarowa kolumny wektor v

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

Mam nadzieję, że to było jasne.

Dzięki!

Odpowiedz

3

Można to zrobić z kilku 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)]) 

Zasadniczo, zmiany kształtu w 2D matrycy A2 ((ij), (k)) = A ((I), (j), (k)):

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

Następnie zrobić zwykły multiplcation:

dla wszystkich (ij) B2 ((ij)) = sum_k A2 ((ij), (k)) * v ((k)):

B2=A2*v 

Ci przekształcić z powrotem:

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

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

Mam nadzieję, że to jest jasne

+1

Alright - dzięki. Miałem nadzieję na coś gładszego, ale to chyba wystarczy. – user1763302

+1

Ta metoda działa tylko wtedy, gdy wymiar, który ma zostać pomnożony, jest ostatnim wymiarem macierzy N-d. Byłoby miło, gdyby kod działał dla dowolnego wymiaru 1 ... N macierzy N-D. Wydaje się być w stanie z 'dimshift' na początku i na końcu. – cjh

+0

Wydaje się, że jest to wykonalne z 'permutacją' rzeczywiście .... Zajęło by to kilka minut, aby o tym pomyśleć. Możesz edytować moją odpowiedź lub dodać własną. Wkrótce mam termin. – Oli

3

Można to zrobić nieco płynniej. dla macierzy reshape wymaga tylko 1 argumentu, a drugi jest ustalany automatycznie, jeśli nie jest określony, co jest bardzo przydatne w takich sytuacjach.

Więc, rozwiązanie przedstawione przez Oli może być bardziej zwięźle napisany jako

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), []);