如何以矢量化方式平均矩阵中的每个第 n 个元素?

Posted

技术标签:

【中文标题】如何以矢量化方式平均矩阵中的每个第 n 个元素?【英文标题】:How can I average every nth element in a Matrix in a vectorized way? 【发布时间】:2020-03-25 12:38:27 【问题描述】:

在 Matlab 中,我有一个 64x64x256x256 矩阵 A。我想对最后 2 个维度的每个第 4 个元素进行平均,以获得一个 64^4 的矩阵。以前我使用 2 个 for 循环来完成此操作,但是速度很慢,我想加快速度。

for n2 = 1:pts
    tmp_Matrix(:,:,:,n2) = sum(Matrix_A(:,:,:,(1+numAvg*(n2-1):n2*numAvg)),4)/numAvg;
end
for n1 = 1:pts
    Final_Matrix(:,:,n1,:) = sum(tmp_Matrix(:,:,(1+numAvg*(n1-1):n1*numAvg),:),3)/numAvg;
end

还有一些其他类似的问题,但他们处理的是二维矩阵,并没有扩展到更高的维度。任何建议将不胜感激!

【问题讨论】:

您的代码平均了 N 个元素的组,而不是每个第 N 个元素。您是否预先分配了输出数组?预分配是加快循环速度的关键。 【参考方案1】:

您可以使用movmean

tmp_Matrix = movmean (                       ...
  Matrix_A,                                  ...
  [0 numAvg-1],                              ...
  4,                                         ...
  'Endpoints', 'discard',                    ...
  'SamplePoints', 1:numAvg:size(Matrix_A, 4) ...
);

Final_Matrix = movmean (                     ...
  tmp_Matrix,                                ...
  [0 numAvg-1],                              ...
  3,                                         ...
  'Endpoints', 'discard',                    ...
  'SamplePoints', 1:numAvg:size(Matrix_A, 3) ...
);

【讨论】:

以上是关于如何以矢量化方式平均矩阵中的每个第 n 个元素?的主要内容,如果未能解决你的问题,请参考以下文章

将矩阵转换为矢量

Python:计算具有不同长度的列表列表中第 n 个元素的平均值

带有滑动窗口元素的矩阵

matlab如何将两个矩阵的指定元素相加放入一个空矩阵中

更新的矢量元素不打印

利用矩阵进行坐标系转换