2016-08-23 100 views
0

我試圖向量化某個加權和,但無法弄清楚如何去做。我在下面創建了一個簡單的最小工作示例。我猜這個解決方案涉及到bsxfun或重塑和克羅內克產品,但我仍然沒有設法使它工作。向量化加權和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; 

回答

3

你可以使用的bsxfunreshapepermute的組合來完成這個任務。

我們首先使用permuteN尺寸移至A的第三維。然後,我們乘以w1w2的轉置以創建權重網格。然後,我們可以使用bsxfun來執行此網格與A的每個「切片」之間的元素方式乘法(@times)。然後,我們可以將3D結果重塑爲M x N並在第一維上進行求和。

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

更新

實際上,有哪些會使用矩陣乘法來執行求和爲您簡單的方法。不幸的是它必須被分解成

% 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(:); 

或者你可以使用kron創建權重的扁平化網格:

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

哇。那很快。這工作完美。我曾嘗試使用bsxfun並重塑,但沒有弄清楚。非常感謝你!我只能在6分鐘內接受答案:) – phdstudent

+0

我已經稍微編輯過這個問題。這個答案是否容易推廣爲三維和? – phdstudent

+0

@volcompt它看起來像這個解決方案適用於你的二維加權問題,但真正的3D問題是一個不同的野獸。最好接受這個問題(如果它對你有用)和[問另外一個問題](http://meta.stackexchange.com/a/43485/318672)與你的新問題。 – Suever