【问题标题】:Summing a 4D matrix without for loops in matlab在matlab中对没有for循环的4D矩阵求和
【发布时间】:2014-08-21 22:10:38
【问题描述】:

我有一个大小为 m × n × p × q 的 4D 矩阵 A。考虑B = A(:,:,1,1),它是一个m × n 矩阵。我想将B 的所有元素相加得到一个数字。我想为所有A 的所有此类B 矩阵执行此操作,所以最后我将有一个p by q 矩阵。

如果没有 for 循环,我怎么能做到这一点?

作为 3D 矩阵的示例(例如 A 是一个 3D 矩阵)我认为这是可行的,

sum(squeeze(sum(A,1)),1)

但我不知道如何为 4D 矩阵执行此操作...

【问题讨论】:

  • 在性能方面,最好对尾随维度(即第三和第四)而不是前向维度(即第一和第二)求和。因此,如果您可以构建矩阵,使其具有[p q m n] 的形状,然后对第三维和第四维求和 - 它会更快。
  • 差别很大吗?据我所知,您拥有的解决方案适用于 N 维矩阵。除此之外,如果不是您的解决方案在清晰度方面更有意义,我会建议 shais 建议首先对尾随维度求和。我猜 Reshape 也可能更快,但它的可读性略有下降。

标签: matlab for-loop sum


【解决方案1】:

怎么了

[m n p q] = size( A );
squeeze( sum( reshape( A, [], p, q ), 1 ) )

或者,

squeeze( sum( sum( A, 2 ), 1 ) )

【讨论】:

    【解决方案2】:

    可能最快:

    permute(sum(sum(A)), [3 4 1 2]);
    

    编辑:不,Shai 的第一个解决方案更快:)

    【讨论】:

    • 我想permute 复制内存中的元素是因为数据的重新排序,而reshape 只更改了A 的标题,而不是它在内存中的内部表示...
    • @Shai:也许……我个人怀疑对sum 的双重调用,因为您的 secnod 解决方案与我的性能相当。
    • 您所说的可比性能是什么意思?是关于计算速度的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多