在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
?)
答案 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重塑的答案(以及其评论中的烧杯),但效率高于原始问题。