2016-08-23 11 views
0

Ich habe versucht, eine bestimmte gewichtete Summe zu vektorisieren, konnte aber nicht herausfinden, wie es geht. Ich habe unten ein einfaches minimales Arbeitsbeispiel erstellt. Ich nehme an, die Lösung beinhaltet entweder bsxfun oder reshape und kronecker Produkte, aber ich habe es immer noch nicht geschafft, es zum Laufen zu bringen.Vectorized gewichtete Summe Matlab

rng(1); 
N = 200; 
T1 = 5; 
T2 = 7; 

A = rand(N,T1,T2); 
w1 = rand(T1,1); 
w2 = rand(T2,1); 

B = zeros(N,1); 

for i = 1:N 
for j1=1:T1 
for j2=1:T2 
    B(i) = B(i) + w1(j1) * w2(j2) * A(i,j1,j2); 
end 
end 
end 

A = B; 

Antwort

3

Sie könnten eine Kombination aus bsxfun, reshape verwenden und permute dies zu erreichen.

Wir verwenden zuerst permute, um die N Dimension in die 3. Dimension von A zu verschieben. Wir multiplizieren dann w1 und die Transponierung von w2, um ein Raster von Gewichten zu erstellen. Wir können dann bsxfun verwenden, um eine elementweise Multiplikation (@times) zwischen diesem Gitter und jedem "Stück" von A durchzuführen. Wir können dann das 3D-Ergebnis in M ​​x N umformen und über die erste Dimension summieren.

B = sum(reshape(bsxfun(@times, w1 * w2.', permute(A, [2 3 1])), [], N)).'; 

aktualisieren

ist es eigentlich ein einfacher Ansatz, der Matrixmultiplikation verwenden würde für Sie die Summierung durchzuführen. Es hat leider in

% Create the grid of weights 
W = w1 * w2.'; 

% Perform matrix multiplication between a 2D version of A and the weights 
B = reshape(A, N, []) * W(:); 

gebrochen werden oder Sie kron verwenden könnte das abgeflachte Raster von Gewichten zu erstellen:

B = reshape(A, N, []) * kron(w2, w1); 
+0

Wow. Das war schnell. Das funktioniert perfekt. Ich habe versucht, bsxfun zu verwenden und umzuformen, habe es aber nicht herausgefunden. Vielen Dank! Ich kann die Antwort nur in 6 Minuten annehmen :) – phdstudent

+0

Ich habe die Frage etwas bearbeitet. Ist die Antwort leicht verallgemeinerbar für eine dreidimensionale Summe? – phdstudent

+0

@volcompt Es sieht so aus, als ob diese Lösung gut für Ihre 2D-Gewichtungsfrage funktioniert hat, aber die 3D-Frage ist wirklich ein anderes Biest. Am besten akzeptieren Sie dies (wenn es für Sie funktioniert) und [stellen Sie eine andere Frage] (http://meta.stackexchange.com/a/43485/318672) mit Ihrer neuen Frage. – Suever