在 Matlab 中进行 vector/array 乘法的快速方法

Fast way for vector/array multiplication in Matlab

我正在寻找一种无需循环即可在 Matlab 中计算以下内容的快速灵活的方法:

c = 1:5;
A = reshape(1:5^3,5,5,5);
res= c(1)*A(:,:,1)+...+c(5)*A(:,:,5) 

我认为,与

一起工作
sum(A,3) 

只要我能够沿三维执行乘法,这可能是一个不错的方法。一种解决方案(但有循环)是:

val = zeros(length(c),length(c))
for i = 1:length(c)
    val = val+c(i)*A(:,:,i)
end

我只是想知道是否可以通过更简单(更优雅)的方式避免循环。

是的,这对 bsxfun and permute 来说是一份完美的工作:

res = sum(bsxfun(@times,A,permute(c,[3,1,2])),3)

您使用 permute(c,[3,1,2])c 发送到三维空间。然后,通过调用 bsxfunA 中的每个矩阵都乘以相应的(置换的)c。最后,你可以在三维上做一个sum

您可以将 A3D 重塑为 2D,使用 very efficient matrix-multiplication,这将为您提供一个 1D 数组,最后重塑回2D 为最终输出,像这样 -

res = reshape(reshape(A,[],size(A,3))*c(:),size(A,1),[])