有没有办法可以总结矩阵中每组三行的列值?
我可以手动方式将三行加起来。
例如
% 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))
...
但是如果数据集很大,那就不行了 有没有办法在没有循环的情况下自动执行此操作?
答案 0 :(得分:5)
以下是其他四种方式:
强制性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
使用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));
使用第三维(基于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]);
使用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
均分。
答案 1 :(得分:4)
这个单行reshape
s,以便特定单元格所需的所有值都在列中,sum
,然后reshape
回到预期的形状
reshape(sum(reshape(data, 3, [])), [], size(data, 2))
如果要将不同数量的行相加,可以更改裸3
。确保每组中的行数均匀分配。
答案 2 :(得分:0)
将矩阵切成三块并将它们加在一起:
matrix = data(1:3:end, :) + data(2:3:end, :) + data(3:3:end, :);
如果size(data,1)
不是三的倍数,则会出错,因为这三个部分的大小不同。如果适合您的数据,您可以通过截断data
或在末尾添加一些零来解决此问题。
您还可以使用reshape
和3D数组做些喜欢的事情。但我更喜欢上述内容(除非你需要用变量替换3
...)
答案 3 :(得分: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