3D матричное умножение с вектором - PullRequest
10 голосов
/ 15 апреля 2011

Это немного беспокоит меня:

Предположим, у вас есть матрица с тремя слоями.

Есть ли простой способ умножить эту матрицу на вектор из трех элементов, чтобы первый слой(все элементы) умножается на первый элемент вектора и так далее ...

Теперь мне нужно использовать функцию, чтобы сделать это так:

function out=fun(matrix,vector)

out=matrix;
for k=1:3
    out(:,:,k)=out(:,:,k)*vector(k);
end

Есть лиэффективный способ сделать это всего за одну строку без необходимости использования функции?

Ответы [ 4 ]

17 голосов
/ 15 апреля 2011

Одним из очень кратких решений является преобразование vector в матрицу 1 на 1 на 3 и использование функции BSXFUN для выполнения поэлементного умножения (он будет реплицировать размеры по мере необходимости, чтобы соответствовать размерам двух входных аргументов):

newMatrix = bsxfun(@times,matrix,reshape(vector,[1 1 3]));
2 голосов
/ 15 апреля 2011

Есть функция Matlab с именем repmat, которая поможет вам в этом.

M = [1 2 3]
M * repmat([1 2 3], 3,1)
ans =

 6    12    18
 6    12    18
 6    12    18

M = [1 2 3]
M .* repmat([1 2 3], 3,1)
ans =

 1     4     9
 1     4     9
 1     4     9

В зависимости от того, как именно вы хотите организовать свои матрицы.

1 голос
/ 15 апреля 2011

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

A=randn(1000,1000,3);%# this is your matrix
vector=[1,2,3];%# this is your vector

[dim1 dim2 ~]=size(A);
replicatedVector=repmat(reshape(vector,1,1,3),[dim1,dim2,1]);
out=A.*replicatedVector;
1 голос
/ 15 апреля 2011

Другой способ - повторить вектор, чтобы он соответствовал матрице по размеру:

out = out.*shiftdim(repmat(vector(:),[1 size(out(:,:,1))]),1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...