在 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
发送到三维空间。然后,通过调用 bsxfun
,A
中的每个矩阵都乘以相应的(置换的)c
。最后,你可以在三维上做一个sum
。
您可以将 A
从 3D
重塑为 2D
,使用 very efficient matrix-multiplication
,这将为您提供一个 1D
数组,最后重塑回2D
为最终输出,像这样 -
res = reshape(reshape(A,[],size(A,3))*c(:),size(A,1),[])
我正在寻找一种无需循环即可在 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
发送到三维空间。然后,通过调用 bsxfun
,A
中的每个矩阵都乘以相应的(置换的)c
。最后,你可以在三维上做一个sum
。
您可以将 A
从 3D
重塑为 2D
,使用 very efficient matrix-multiplication
,这将为您提供一个 1D
数组,最后重塑回2D
为最终输出,像这样 -
res = reshape(reshape(A,[],size(A,3))*c(:),size(A,1),[])