2016-07-19 3 views
1

QUESTIONある特定の次元に沿って私は1つの特定の次元に沿って二つの配列を乗算するエレガントな方法を探しています

を行列を掛けます。

類似QUESTION

あり、公式Matlabのフォーラムでsimilar questionはすでにあるが、スレッドが(2004)時代遅れです。

M1 [6x4x4]行列とM2 [6x1]行列、Iは[行列Mを得るために、M1の第3の次元に沿ってM2と(要素ごと)M1を乗算したいです6x4x4]

相当する:

M1 = rand(6,4,4); 
M2 = rand(6,1); 

for ii = 1:size(M1,2) 
    for jj = 1:size(M1,3) 
     M(:,ii,jj) = M1(:,ii,jj).*M2; 
    end 
end 

VISUAL例

multiplication along one particular dimension

あなたがそれを行うためのクールな方法を知っていますか?

+0

あなたのコードは、エラーを与える:示されたサイズの「行列の次元が同意しなければなりません」。また、希望の結果のサイズは? 'M = bsxfun(@times、M1、permute(M2、[2 3 1]));'; 'を試してみてください。' M 'に 'M1'と同じサイズを与えます。 –

+0

コードが機能するためには、すべてのシングルトンの次元を取り除き、対応する列ベクトルを得るために 'M1(ii、jj、:)'に '' squeeze 'を実行します。 – rayryeng

+0

@LuisMendo 'M1(ii、jj、:)'を実行すると、 '1 x 1 x n'ベクトルが得られ、' M2'を要素として掛け合わせると、互換性のない次元になります。ここに「圧搾」が必要です。 – rayryeng

答えて

4

私があなたの質問を正しく解釈しているならば、M1のそれぞれの空間的な場所で各時間的スライス(すなわち)をとり、要素ごとにそれを乗算する必要がありますサイズn x 1のベクターM2である。 bsxfunpermuteはその状況に最適です:

M = bsxfun(@times, M1, permute(M2, [2 3 1])); 
+1

これは私の解釈でもありました –

+0

それは正確に私の質問でした:)ですから、bsxfunやforループの使用を避ける方法はありませんか? – obchardon

+1

@ obchardonどのように表示されるのでしょうか....しかし、MATLAB R2016bは暗黙的な放送をサポートしているので、 'bsxfun'はもはや必要ありません。 – rayryeng

関連する問題