たとえば、2つのマトリックスAとBがあります
A = [ 1 2 3; 5 4 3; ...]および B = [ 1; 2; 3; 4; 5; 6] (行行列)
そしてこれが欲しい
A*B = [1*1 2*1 3*1; 5*2 4*2 3*2; ...]ループなし。出来ますか?
たとえば、2つのマトリックスAとBがあります
A = [ 1 2 3; 5 4 3; ...]および B = [ 1; 2; 3; 4; 5; 6] (行行列)
そしてこれが欲しい
A*B = [1*1 2*1 3*1; 5*2 4*2 3*2; ...]ループなし。出来ますか?
数学的に言えば、2つの行列は、それらの次元が一致する場合にのみ乗算できます。行列A
がでm*n
あり、行列B
がである場合、次元を持つn*k
製品を形成できます。したがって、数学的な観点から、後から乗算できない行列は、です。行列が実際にある場合は、次元を持つ製品を作成できます。転置演算子を使用してからここに転置することに注意してください。A*B
m*k
A
m*3
B
6*1
A
6*3
B'*A
1*3
'
B
6*1
1*6
Matlabの行列の乗算(*
演算子を使用)は、行列が適合しているという数学的要件に準拠しています。Matlabは、要素ごとの乗算を実行する別の行列乗算演算子も提供します。これは、を乗算することによって結果.*
の各要素を形成します。@Thorはすでにこれを行う1つの方法を提供しているようです。(i,j)
A(i,j)*B(i,j)
あなたがやろうとしているのが、の行の各要素に別のアプローチの行のスカラーを掛けることi
である場合A
、i
B
A.*(repmat(B,1,size(A,2)))
あるいは、より効率的ですが、おそらく少し直感的ではないものを使用することもできます。
bsxfun(@times, A,B);
これを一般的な方法で行うにA
はB
、同じ数の要素が必要です。これを行う1つの方法は、形状を変更する->乗算->形状を変更することです。例:
[x y] = size(A);
AmB = reshape(A, 1, x*y) .* transpose(B);
AmB = reshape(AmB, x, y);
A
ベクトルの要素と同じ数の行がある場合B
AmB = diag(B) * A
あなたが要求しているのは行のスケーリングであるためです。
この表現はエレガントですが、効率的ではありません。背の高い大きなA
行列の場合は、列AmB(:,i) = A(:,i) .* B
をループすることをお勧めします。