如何以矢量化方式平均每第 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,:))];
虽然语法不是很长,但我想知道我是否可以通过更紧凑、更高效的方式(即使用 bsxfun
或 arrayfun
?)达到相同的结果
正如评论中提到的,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;
在 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,:))];
虽然语法不是很长,但我想知道我是否可以通过更紧凑、更高效的方式(即使用 bsxfun
或 arrayfun
?)达到相同的结果
正如评论中提到的,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;