尝试使用来自 Matlab 文件交换的 mtimesx http://www.mathworks.com/matlabcentral/fileexchange/25977-mtimesx-fast-matrix-multiply-with-multi-dimensional-support。这是迄今为止我发现的最好的(快速/高效)工具来进行这种 n 维数组乘法,因为它使用mex
. I think你也可以使用bsxfun http://www.mathworks.com.au/help/techdoc/ref/bsxfun.html,但是我的 Matlab-fu 不足以完成这类事情。
你有m x n x k
and m x k
并想要制作一个n x k
.
mtimesx
乘以输入,例如i x j x k
and j x r x k
生产i x r x k
.
把你的问题放进去mtimesx
形式,让G
be m x n x k
,并展开S
to be n x 1 x k
. Then 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 新闻阅读器论坛 http://www.mathworks.com/matlabcentral/newsreader/将会有很多专家竞相为您提供比我更优雅或更有效的答案!