How to aggregate rows in a matrix
조회 수: 4 (최근 30일)
이전 댓글 표시
If i have a matrix like the following example (or please see attached file)
2008,5,4,9,40,0,0.0,0.0,0.0,15.9
2008,5,4,9,41,0,0.0,0.0,1.0,16.3
2008,8,5,16,20,0,0.0,0.0,1.0,2.9
2008,8,5,16,21,0,0.0,0.0,1.0,2.9
and so on for a full year. The matrix represents year, month, date of month, hour, minute, zone1,zone2,zone3 and zone4 How can i create a program that takes an hour for example and aggregates zone1,zone2zone3 and zone4 for that full choose hour ? I have to end up with two vectors. One with year,month,date of month, hour, minute and one with the aggregated zone1,zone2,zone3,zone4 The original matrix consists of data for a Whole year. I was think of something with Unique but then i am not sure how i can aggregate the data!
I have use for example [day, ~, subs] = unique(m(:, 1:3), 'rows') Then i get all the days. Then i can use sumdayzone1 = accumarray(subs, m(:, 7), [], @sum) but that only gives me the sum of zone1 on the choosen day. How can i do all zone together so i end up with only one vector to the corrensponding day ? I am a total newbie in this so any kind of help would be nice, thanks
댓글 수: 1
채택된 답변
Guillaume
2014년 12월 2일
편집: Guillaume
2014년 12월 4일
accumarray only operates on vectors, so you have no choice but to call it once per column:
[day, ~, subs] = unique(m(:, 1:3), 'rows');
colzones = [7 8 9 10];
sumdayzones = cell2mat(arrayfun(@(col) accumarray(subs, m(:, col), [], @sum), colzones, 'UniformOutput', false));
or with a loop
[day, ~, subs] = unique(m(:, 1:3), 'rows');
colzones = [7 8 9 10];
sumdayzones = zeros(size(day, 1), numel(colzones));
for colidx = 1:numel(colzones)
sumdayzones(:, colidx) = accumarray(subs, m(:, colzones(colidx)), [], @sum);
end
댓글 수: 8
Guillaume
2014년 12월 4일
day returned by:
[day, ~, subs] = unique(m(:, 1:3), 'rows');
is only three columns. sumdayzones is only 4, therefore the concatenation is only 7 columns.
추가 답변 (2개)
Thorsten
2014년 12월 4일
[day, ~, subs] = unique(m(:, 1:3), 'rows');
zones_colind = [7:10];
for i = 1:size(day, 1)
m_day(i,:) = [day(i, :) sum(m(find(subs == i), zones_colind))];
end
댓글 수: 4
Thorsten
2014년 12월 4일
Like this?
[day, ~, subs] = unique(m(:, 1:3), 'rows');
zones_colind = [7:10];
for i = 1:size(day, 1)
ind = find(subs == i);
m_day(i,:) = [day(i, :) m(ind(1), 4:6) sum(m(ind, zones_colind))];
end
N00TN00t
2017년 6월 19일
편집: N00TN00t
2017년 6월 19일
What if we want to aggregate the time vector, not the zones?
So for aggregating for the months, we want a matrix showing columns [1:6] of the original matrix, but each row showing only one month:
2008,1,0,0,0,0
2008,2,0,0,0,0
2008,3,0,0,0,0
2008,4,0,0,0,0
2008,5,0,0,0,0
2008,6,0,0,0,0
2008,7,0,0,0,0
2008,8,0,0,0,0
2008,9,0,0,0,0
2008,10,0,0,0,0
2008,11,0,0,0,0
2008,12,0,0,0,0
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Logical에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!