Попробуйте использовать mtimesx из Matlab File Exchange . Это лучший (быстрый / эффективный) инструмент, который я нашел на сегодняшний день для такого рода умножения n-мерных массивов, поскольку он использует mex
. Я думаю вы также можете использовать bsxfun
, но моего Matlab-fu недостаточно для такого рода вещей.
У вас есть m x n x k
и m x k
, и вы хотите произвести n x k
.
mtimesx
умножает входные данные, такие как i x j x k
и j x r x k
, чтобы получить i x r x k
.
Чтобы поместить вашу проблему в форму mtimesx
, пусть G
будет m x n x k
, а расширение S
будет n x 1 x k
. Тогда mtimesx(G,S)
будет m x 1 x k
, который затем можно будет сплющить до m x k
.
m=3;
n=4;
k=2;
G=rand(m,n,k);
S=rand(n,k);
% reshape S
S2=reshape(S,n,1,k);
% do multiplication and flatten mx1xk to mxk
Ans_mtimesx = reshape(mtimesx(G,S2),m,k)
% try loop method to compare
Answer=zeros(m,k);
for Index=1:k
Answer(:,Index)=G(:,:,Index)*S(:,Index);
end
% compare
norm(Ans_mtimesx-Answer)
% returns 0.
Итак, если вы хотите однострочник, вы можете сделать:
Ans = reshape(mtimesx(G,reshape(S,n,1,k)),m,k)
Кстати, если вы опубликуете свой вопрос на форумах Matlab Newsreader , будет много гуру, которые будут соревноваться, чтобы дать вам ответы более элегантные или эффективные, чем мои!