【问题标题】:Vectorizing the Sum of a Triple For Loop向量化三重 For 循环的总和
【发布时间】:2015-01-24 08:53:53
【问题描述】:

目前,我正在尝试通过这个三重循环构建矩阵 Alpha:

Alpha = zeros(a_length, b_length);   
for a = 1:a_length
  for b = 1:b_length
      for c = 1:c_length
          Alpha(a,b) = Alpha(a,b) + Beta(c,a) * Gamma(b,c);
      end
  end
end

有没有办法将两个向量传递给 Beta 和 Gamma 矩阵,这样我就可以在一行优雅的向量化代码中构建整个 Alpha?

【问题讨论】:

    标签: matlab matrix vectorization


    【解决方案1】:

    你可以使用简单的matrix multiplication 来拯救你 -

    Alpha = (Gamma*Beta).'
    

    或者这样-

    Alpha = Beta.'*Gamma.'
    

    或者有点复杂的基于bsxfun的方法-

    Alpha = sum(bsxfun(@times,permute(Gamma,[3 1 2]),permute(Beta,[2 3 1])),3)
    

    如果你想避免之前的bsxfun 方法中的permute -

    Alpha = squeeze(sum(bsxfun(@times,Gamma,permute(Beta,[3 1 2])),2)).'
    

    或者这个-

    Alpha = squeeze(sum(bsxfun(@times,Beta.',permute(Gamma,[3 2 1])),2))
    

    【讨论】:

    • 如何合并每次都需要添加的 Alpha(a,b) 项?
    • @jsc123 基本上矩阵乘法结果的每个元素都对应Alpha(a,b)。你测试过代码吗?
    • 为什么在第二个版本中将 Gamma 放在引号中?
    • @jsc123 在Alpha = Beta.'*Gamma.' 中,我将Beta 的转置和Gamma 的转置相乘。所以这些引号实际上是转置。在此处阅读更多信息 - in.mathworks.com/help/matlab/ref/transpose.html
    猜你喜欢
    • 2023-02-08
    • 2014-03-15
    • 2021-04-17
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    相关资源
    最近更新 更多