2016-11-11 5 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) 

Суммировать по размеру «А» (строки).

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

перекроить, чтобы вернуться к первоначальным размерам B.

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

Сумму по столбцам, как вы хотели.


Редактировать

Предложение от @verbatros, которые работают, когда A является вектор-строка, а также:

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

Вы можете изменить выражение для суммы (изменить (сумма (B (:) * A (:). ', 2), размер (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