尝试使用mtimesx from the 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 forums 上发布您的问题,将会有很多大师竞相为您提供比我更优雅或更高效的答案!