4

有什么方法可以总结矩阵中每组三行的列值?
我可以手动总结三行。

例如

% matrix is the one I wanna store the new data.
% data is the original dataset.
matrix(1,1:end) = sum(data(1:3, 1:end))
matrix(2,1:end) = sum(data(4:6, 1:end))
...

但如果数据集很大,这是行不通的。
有没有办法在没有循环的情况下自动执行此操作?

4

4 回答 4

5

以下是其他四种方式:

  1. 强制for循环:

    % for-loop over each three rows
    matrix = zeros(size(data,1)/3, size(data,2));
    counter = 1;
    for i=1:3:size(data,1)
        matrix(counter,:) = sum(data(i:i+3-1,:));
        counter = counter + 1;
    end
    
  2. 用于平铺mat2cell

    % divide each three rows into a cell
    matrix = mat2cell(data, ones(1,size(data,1)/3)*3);
    
    % compute the sum of rows in each cell
    matrix = cell2mat(cellfun(@sum, matrix, 'UniformOutput',false));
    
  3. 使用第三维(基于this):

    % put each three row into a separate 3rd dimension slice
    matrix = permute(reshape(data', [], 3, size(data,1)/3), [2 1 3]);
    
    % sum rows, and put back together
    matrix = permute(sum(matrix), [3 2 1]);
    
  4. 使用accumarray

    % build array of group indices [1,1,1,2,2,2,3,3,3,...]
    idx = floor(((1:size(data,1))' - 1)/3) + 1;
    
    % use it to accumulate rows (appliead to each column separately)
    matrix = cell2mat(arrayfun(@(i)accumarray(idx,data(:,i)), 1:size(data,2), ...
        'UniformOutput',false));
    

当然,到目前为止的所有解决方案都假设行数可以被3.

于 2013-09-14T00:33:53.627 回答
4

这种单行reshapes 使特定单元格所需的所有值都在列中sum,然后reshape执行 s ,然后返回到预期的形状。

reshape(sum(reshape(data, 3, [])), [], size(data, 2))

3如果您想将不同数量的行加在一起,可以更改裸数据。确保每组中的行数平均分配是您的责任。

于 2013-09-13T23:53:49.033 回答
0

将矩阵切成三块并将它们相加:

matrix = data(1:3:end, :) + data(2:3:end, :) + data(3:3:end, :);

size(data,1)如果不是三的倍数,这将给出错误,因为这三个部分的大小不同。如果适合您的数据,您可以通过截断data或在末尾附加一些零来解决此问题。

你也可以用reshape3D 数组做一些花哨的事情。但我更喜欢上面的(除非你需要3用变量替换......)

于 2013-09-13T23:04:31.623 回答
0

Prashant 之前回答得很好,但我有一个简单的修改:

fl = filterLength;
A = yourVector (where mod(A,fl)==0)
sum(reshape(A,fl,[]),1).'/fl;

即使 fl==1(原始值),也有“,1”使行运行。我在 for 循环中运行它时发现了这一点,如下所示:

... read A ...
% Plot data
hold on;

averageFactors = [1 3 10 30 100 300 1000];
colors = hsv(length(averageFactors));
clear legendTxt;


for i=1:length(averageFactors)
% ------ FILTERING ----------
clear Atrunc;
clear ttrunc;
clear B;
fl = averageFactors(i); % filter length
Atrunc = A(1:L-mod(L,fl),:);
ttrunc = t(1:L-mod(L,fl),:);

B = sum(reshape(Atrunc,fl,[]),1).'/fl;
tB = sum(reshape(ttrunc,fl,[]),1).'/fl;
length(B)
plot(tB,B,'color',colors(i,:) )
%kbhit ()
endfor
于 2013-11-08T14:11:57.820 回答