2012-10-21 9 views
5

Ich habe eine 3D (oder allgemein n-dimensional) Matrix A mit Abmessungen3D-Matrix, die durch Spaltenvektormultiplikation

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

Jetzt möchte ich mit einem Spaltenvektor v über eine der Dimensionen eine Vektormultiplikation tun (wie ich in 2 Dimensionen tun würde, wo ich einen Vektor zurück bekommen - zum Beispiel für d1 = 2, d3 = 4 und size(v) = d2), so dass

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

Daher ich um eine Dimension reduzieren will.

Gibt es eine Matlab-Funktion (andere als Looping), die

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

Ich hoffe, das war klar für eine d3 -dimensional Spaltenvektor v zurück.

Danke!

Antwort

3

Sie können das tun, mit ein paar 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)]) 

Grundsätzlich Sie A in eine 2D-Matrix A2 umformen ((ij), (k)) = A ((i), (j), (k)):

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

Dann tun Sie das übliche multiplcation:

für alle (ij) B2 ((ij)) = sum_k A2 ((ij), (k)) * v ((k)):

B2=A2*v 

Die umformen Sie zurück:

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

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

Ich hoffe, das ist klar

+1

in Ordnung - vielen Dank. Ich habe auf etwas Glatteres gehofft, aber das ist fair genug, denke ich. – user1763302

+1

Diese Methode funktioniert nur, wenn die zu multiplizierende Dimension die letzte Dimension der N-d-Matrix ist. Es wäre schön, wenn der Code für jede Dimension 1 ... N der N-D-Matrix funktioniert. Scheinbar möglich mit "dimshift" am Anfang und am Ende. – cjh

+0

Es scheint in der Tat machbar zu sein mit "Permutieren". Es würde ein paar Minuten dauern, darüber nachzudenken. Fühlen Sie sich frei, meine Antwort zu bearbeiten oder Ihre eigene hinzuzufügen. Ich habe bald eine Frist. – Oli

3

Sie dagegen tun können ein bisschen glatter. für Matrizen reshape erfordert nur 1 Argument, das andere wird automatisch erkannt, wenn nicht angegeben, was in genau solchen Situationen sehr nützlich ist.

Also, die Lösung von Oli präsentiert mehr wird kurz geschrieben als

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