2016-07-19 3 views
1

ВОПРОСАматрица Умножение по одному конкретному аспекту

Я ищу элегантный способ для умножения двух массивов вдоль одной конкретной размерности.

Похожий вопрос

Существует уже similar question на официальном форуме MatLab, но нить устарел (2004).

ПРИМЕР

M1 а [6x4x4] матрица и M2 а [6x1] матрица, Я хотел бы, чтобы умножить (поэлементно) M1 с M2 по 3-м измерении M1, чтобы получить матрицу М [ 6x4x4]

эквивалентом:

M1 = rand(6,4,4); 
M2 = rand(6,1); 

for ii = 1:size(M1,2) 
    for jj = 1:size(M1,3) 
     M(:,ii,jj) = M1(:,ii,jj).*M2; 
    end 
end 

наглядного примера

multiplication along one particular dimension

вы знаете прохладный способ сделать это делать? (нет петли, 1 или 2 линии раствора, ...)

+0

Ваш код выдает ошибку: «размеры матрицы должны договориться» с указанными размерами. Кроме того, каков размер желаемого результата? Возможно, попробуйте 'M = bsxfun (@times, M1, permute (M2, [2 3 1]));', который дает 'M' тот же размер' M1' –

+0

. Для того, чтобы ваш код работал, вам технически необходимо использовать 'squeeze' на' M1 (ii, jj, :) ', чтобы удалить все размеры синглтона и получить соответствующий вектор-столбец. – rayryeng

+0

@ LuisMendo Выполнение 'M1 (ii, jj, :)' даст вам вектор «1 x 1 x n» и умножение по методу «M2» дает несовместимые измерения. 'squeeze' требуется здесь. – rayryeng

ответ

4

Если я правильно истолковываю ваш вопрос, вы хотите, чтобы каждый временный срез (то есть 1 x 1 x n) в каждом пространственном местоположении в M1 и умножал его на части с вектором M2 размера n x 1. bsxfun и permute идеально подходят для этой ситуации:

M = bsxfun(@times, M1, permute(M2, [2 3 1])); 
+1

Это была моя интерпретация –

+0

И это был именно мой вопрос :), поэтому нет способа избежать использования bsxfun или цикла for? – obchardon

+1

@obchardon Я не вижу никакого способа, как .... но MATLAB R2016b поддерживает неявное вещание, поэтому 'bsxfun' больше не требуется. – rayryeng

Смежные вопросы