2016-08-23 7 views
0

私は一定の加重和をベクトル化しようとしましたが、それを行う方法を理解できませんでした。私は以下の簡単な作業例を作成しました。ソリューションにはbsxfunやreshape、kroneckerのいずれかの製品が含まれていると思いますが、まだそれを稼働させることはできませんでした。重み付き合計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の組み合わせを使用することができます。

最初にpermuteを使用してNディメンションをAの3番目のディメンションに移動します。次に、w1と転置のw2を乗算して、重みのグリッドを作成します。次に、bsxfunを使用して、このグリッドと各「スライス」との間の要素ごとの乗算(@times)をAとします。次に、3D結果をM×Nに再整理し、第1次元全体にわたって合計することができる。

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

更新

あなたのための加算を実行するために行列の乗算を使用する簡単な方法は、実際にあります。うわー

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

:それは残念ながら

% 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を使用することができますに分割する必要があります。それは速かった。これは完全に機能します。私はbsxfunを使用して再構成しようとしましたが、それを理解しませんでした。どうもありがとうございました!私は6分で答えを受け入れることができます:) – phdstudent

+0

私は少し質問を編集しました。答えは3次元の和に対して簡単に一般化可能ですか? – phdstudent

+0

@volcomptこのソリューションは2D加重質問にはうまくいきましたが、実際には3D質問は違う獣です。あなたの新しい質問でこれを受け入れることが(あなたのために働く場合)、[別の質問をする](http://meta.stackexchange.com/a/43485/318672)が最善です。 – Suever

関連する問題