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

How can I average a matrix every nth elements in a vectorized way?

在 MATLAB 中,给定一个 36 x 17 矩阵 A,我想对每列的每 6 个元素进行平均,从而创建一个 6 x 17 矩阵 B。我可以使用以下代码实现它:

A = rand(36, 17);

B = [mean(A(1:6:36,:)); mean(A(2:6:36,:)); mean(A(3:6:36,:)); mean(A(4:6:36,:)); mean(A(5:6:36,:)); mean(A(6:6:36,:))];

虽然语法不是很长,但我想知道我是否可以通过更紧凑、更高效的方式(即使用 bsxfunarrayfun?)达到相同的结果

正如评论中提到的,reshape to basically split the first dim into two with the former of length 6 to have a 3D array and then use mean 沿着这两个中的后者,这将是 3D 数组中的第二个 dim 和 2D 的最终 reshape/squeeze输出-

B = squeeze(mean(reshape(A,6,[],size(A,2)),2))

为了完整起见,您可以使用 2D convolution 获得相同的结果,如下所示:

  n = 6; % average every n-th element
  C = zeros(size(A, 1) - n + 1, 1);
  C(1:n:size(A, 1), :) = 1/(size(A, 1) / n);
  B = conv2(A, C, 'valid');

请注意,此结果可能不如 Divakar(以及其评论中的烧杯)提出的基于重塑 3D 的答案有效,但比原始问题更有效。

出于好奇,这也可以通过矩阵乘法来完成(效率接近 ,在某些情况下甚至更快):

N = size(A, 1)/6;
B = (repmat(eye(6), 1, N)*A)./N;