Как добавить вектор-строку в вектор-столбец, например умножение матриц

У меня есть вектор nx1 и вектор 1xn. Я хочу добавить их особым образом, например, умножение матриц эффективным способом (векторизованным):

Пример:

A=[1 2 3]'

B=[4 5 6]

A \odd_add B = 
[1+4 1+5 1+6
 2+4 2+5 2+6
 3+4 3+5 3+6
]

С уважением


person remo    schedule 27.07.2012    source источник


Ответы (3)


Вы можете использовать bsxfun:

A=[1 2 3]'

B=[4 5 6]

bsxfun(@plus, A, B)

Результат

ans =

     5     6     7
     6     7     8
     7     8     9
person H.Muster    schedule 27.07.2012
comment
Спасибо, надеюсь решение будет достаточно быстрым. - person remo; 27.07.2012
comment
Насколько я проверял, это примерно в 6 раз медленнее, чем обычное умножение матриц. Я использовал exp(A) и exp(B) и умножил их, а затем получил специальное суммирование с помощью функции log(). Этот подход более быстрый!! Можно ли векторизовать ваш код? - person remo; 27.07.2012
comment
Я не согласен с вашими тестами; Я считаю, что bsxfun во много раз быстрее, чем умножение матриц, для всех размеров вектора, которые я тестировал. Так и должно быть, поскольку вычислительная сложность умножения суперлинейна по количеству матричных элементов. - person Isaac; 28.07.2012
comment
Да, ваш ответ теоретически верен, но конечная скорость зависит от реализации. Вы можете повторить мой тест на своей машине, как показано ниже: tic; еА= ехр(А); еВ = ехр(В); результат = лог(eA*eB); ток; - person remo; 28.07.2012
comment
@remo: Насколько велики матрицы, с которыми вы проводили тесты скорости? У меня сложилось впечатление, что bsxfun превосходит ваш альтернативный подход для больших матриц (я тестировал с A и B, имеющими по 1000 элементов каждый). - person H.Muster; 28.07.2012
comment
Я проверял на матрице 1000x1000!! - person remo; 28.07.2012

Вы можете использовать функцию repmat (реплицировать матрицы):

repmat(A,1,3)+repmat(B,3,1)
person Hari Seldon    schedule 27.07.2012

Из R2016b вы можете просто сделать:

A=[1 2 3]'

B=[4 5 6]

A+B

ans =

     5     6     7
     6     7     8
     7     8     9

Matlab молча расширит оба вектора и выполнит поэлементную сумму. Эта функция не обошлась без споров. Вы можете проверить детали здесь:

Matlab расширяет арифметику

person David    schedule 08.05.2020