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

时间:2017-04-25 19:54:38

标签: matlab matrix vectorization mean bsxfun

在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?)

3 个答案:

答案 0 :(得分:8)

正如评论中所提到的,reshape基本上将第一个dim拆分为两个,前者长度为6,以便有一个3D数组,然后使用mean这两者中的后者,3D数组中的第二个暗淡和2D输出的最终重塑/挤压 -

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

答案 1 :(得分:7)

对于好奇,这也可以通过矩阵乘法来实现(效率接近Divakar's answer,在某些情况下甚至更快一点):

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

答案 2 :(得分:3)

为了完整起见,您可以使用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重塑的答案(以及其评论中的烧杯),但效率高于原始问题。