2016-11-11 15 views
1

与えられたベクトルと行列AとB、スカラーとしてAの各要素にBを乗じてforループを使わずに新しい行列をそれぞれ加算する方法。スカラーとしてAの各要素を掛け合わせる方法B

A = [1;2;3] 
B = [1 2;3 4 ;5 6] 

C = (A(1) * B) + (A(2) * B) + (A(3) * B) 

ans = 

6 12 
18 24 
30 36 

C = sum(C) 
C = 

54 72 

が、ベクトルが長すぎるので、私は手動でそれを行うことはできません。私が何を意味するか

です。

答えて

3

次のコマンドを使用することができます。

sum(reshape(sum(B(:)*A.',2),size(B))) 

説明:

B(:)*A' 

Bを平らにし、Aの各要素でそれの各要素を掛けます。

sum(B(:)*A.',2) 

'A'ディメンション(行)を合計します。

reshape(sum(B(:)*A.',2),size(B)) 

Bの元の寸法に戻すための形状。

sum(reshape(sum(B(:)*A.',2),size(B))) 

必要に応じて列を合計します。


編集Aが同様に行ベクトルであるとき、仕事@verbatrosから

提案:

sum(reshape(sum(B(:)*A(:).',2),size(B))) 
+1

あなたが変更する場合があります式を合計する(reshape(sum(B(:)* A(:)。 '、2)、size(B))) Aが行ベクトルまたは列ベクトルの場合。 – verbatross

+0

@verbatross私はあなたの提案で答えを編集しました。 – mpaskov

+0

なぜそうコンパイルされましたか?一歩前に戻り、最初に合計を構築してから乗算することができます – Andy

1

非常に簡単:

A = [1;2;3] 
B = [1 2;3 4 ;5 6] 

C = sum (A(:)) .* sum (B) 
C = 

    54 72 
関連する問題