我应该如何平均矩阵中的行组来生成一个新的更小的矩阵?

bgo*_*man 3 matlab

我有一个非常大的矩阵(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)

mat*_*fee 8

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整除,则会出现问题,但原始代码也是如此.