2017-02-13 8 views
3

У меня есть следующая проблема и я не могу думать об обратном пути без циклов.Матричное умножение строки и столбца без цикла в matlab

Рассмотрим две матрицы:

a=rand(N,3), b=rand(3,N)

То, что я хочу получить является: b(:, i)*a(i, :) (матрица 3 * 3) сцепляются третьего измерения для всех i.

Таким образом, для приведенного выше примера результатом должна быть матрица (3 * 3 * N).

+0

Нет это '(3x1) * (1x3) -> 3x3' Ь имеет N столбцов, которые являются векторами 3x1 и имеет N строк, которые являются векторами 1x3 – Paramar

+0

Я уверен, что есть очень приятное решение, использующее 'kron' и' reshape', но я не могу понять это. Else just loop it –

+0

Вы уверены, что исправленные вами исправления верны? Я думаю, что это умножение 1x3 x 3x1 -> 1x1. Кстати, продукт кронекера, кажется, делает больше вычислений, чем необходимо здесь. Вы можете видеть это по своим размерам 3x3xN и 3Nx3N. – Paramar

ответ

6

Matlab R2016b версия:

c = reshape(a.',[1,3,N]) .* reshape(b,[3,1,N]); 

Ранее Matlab версии:

c = repmat(reshape(a.',[1,3,N]),[3,1,1]) .* repmat(reshape(b,[3,1,N]),[1,3,1]); 

редактировать: Вот быстрый тест на Matlab R2016b (Win7x64). Ускорение векторизации вокруг фактора 50.

Benchmark on R2016b (Win7x64)

+0

ах! используя радиовещание! аккуратный. –

+1

Спасибо! :) Я добавил тест, чтобы показать ускорение. Я думаю, что это того стоит ... – Florian

+0

@AnderBiguri Что транслирует? Никогда не слышал об этом раньше. Это [это] (https://mathworks.com/help/distcomp/broadcast-variables.html) определение? Просто любопытно. Благодарю. – codeaviator