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



在 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基本上将第一个 dim 分成两个,前者的长度6有一个3D数组,然后沿着这两个数组中的后者使用mean,这将是3D数组中的第二个 dim 和最终的整形/挤压以2D输出 -

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

对于好奇的人来说,这也可以通过矩阵乘法来完成(效率接近Divakar的答案,在某些情况下甚至快一点):

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

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

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的答案效率低(以及其评论中的烧杯),但比原始问题更有效。

相关内容

  • 没有找到相关文章

最新更新