【问题标题】:Fast way for vector/array multiplication in MatlabMatlab中向量/数组乘法的快速方法
【发布时间】:2016-08-12 19:16:41
【问题描述】:

我正在寻找一种快速灵活的方法来在 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

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

【问题讨论】:

  • 把你的问题澄清一点。你想要多个什么?
  • 我想在一天结束时获得 res.. 所以换句话说,我想将整个矩阵 A(:,:,1) 与标量 c(1) 相乘,整个矩阵 A(:,:,2) 与标量 c(2) 等等......最后我想总结这五个矩阵中的每一个,这样 res 就是一个矩阵。

标签: matlab multidimensional-array vectorization matrix-multiplication


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    是的,这是bsxfunpermute 的完美工作:

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

    您使用permute(c,[3,1,2])c 发送到第三维度。然后,通过调用bsxfunA 中的每个矩阵乘以对应的(置换的)c。最后,您可以在第三维上执行sum

    【讨论】:

      猜你喜欢
      • 2011-11-30
      • 2011-04-10
      • 2020-02-28
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多