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