我有一个非常大的矩阵(216行,31286列)的双打.由于特定于数据的原因,我想平均每9行产生一个新行.因此,新矩阵将具有216/9 = 24行.
我是一名Matlab初学者,所以我想知道我提出的这个解决方案是否可以改进.基本上,它遍历每个组,总结行,然后将新行除以9.这是我写的简化版本:
matrix_avg = []
for group = 1:216/9
new_row = zeros(1, 31286);
idx_low = (group - 1) * 9 + 1;
idx_high = idx_low + 9 - 1;
% Add the 9 rows to new_row
for j = idx_low:idx_high
new_row = new_row + M(j,:);
end
% Compute the mean
new_row = new_row ./ 9
matrix_avg = [matrix_avg; new_row];
end
Run Code Online (Sandbox Code Playgroud)
您reshape的大矩阵可以从216 x 31286到9 x(216/9*31286).
然后你可以使用mean,它对每列进行操作.由于矩阵每列只有9行,因此需要9行平均值.
然后你可以reshape回到你的矩阵.
% generate big matrix
M = rand([216 31286]);
n = 9 % want 9-row average.
% reshape
tmp = reshape(M, [n prod(size(M))/n]);
% mean column-wise (and only 9 rows per col)
tmp = mean(tmp);
% reshape back
matrix_avg = reshape(tmp, [ size(M,1)/n size(M,2) ]);
Run Code Online (Sandbox Code Playgroud)
在单行中(但你为什么会这样?):
matrix_avg = reshape(mean(reshape(M,[n prod(size(M))/n])), [size(M,1)/n size(M,2)]);
Run Code Online (Sandbox Code Playgroud)
注意 - 如果行中的行数M不能被9整除,则会出现问题,但原始代码也是如此.