How to aggregate data based on values in a vector?
6 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
HeadInTheClouds
am 14 Dez. 2017
Bearbeitet: Lateef Adewale Kareem
am 7 Apr. 2019
I have matrix A containing 128 columns and m rows. I want to aggregate columns in matrix A based on values in a vector B containing n columns. In the instance that:
A = rand(1000,128);
B = [32 45 58 62 73 84 103 112];
I would want to sum columns 1:32 33:45 46:58 59:62 63:73 74:84 85:103 104:112 and 113:128 of matrix A to create a new 1000x9 matrix C. Right now, my code to perform this process is:
C = horzcat(...
sum(A(:,1:B(1)),2),...
sum(A(:,B(1)+1:B(2)),2),...
sum(A(:,B(2)+1:B(3)),2),...
sum(A(:,B(3)+1:B(4)),2),...
sum(A(:,B(4)+1:B(5)),2),...
sum(A(:,B(5)+1:B(6)),2),...
sum(A(:,B(6)+1:B(7)),2),...
sum(A(:,B(7)+1:B(8)),2),...
sum(A(:,B(8)+1:end),2));
I would like to automate this process so that I can change the number of columns in vector B without altering my aggregation code
Many thanks!
0 Kommentare
Akzeptierte Antwort
Jos (10584)
am 14 Dez. 2017
Bearbeitet: Jos (10584)
am 14 Dez. 2017
Here is one flexible approach:
A = cumsum(ones(3,10),2) % a simple example, easy to check
B = [2 5 6]
B2 = [0 B size(A,2)]
C = arrayfun(@(k) sum(A(:,(B2(k)+1):B2(k+1)),2), 1:numel(B2)-1,'un',0)
C = cat(2,C{:})
2 Kommentare
Lateef Adewale Kareem
am 7 Apr. 2019
Bearbeitet: Lateef Adewale Kareem
am 7 Apr. 2019
Another way to look at it is to define starting and ending B(s)
B1 = [1,B+1]; B2 = [B,size(A,2)];
C = arrayfun(@(k1,k2)sum(A(:,k1:k2),2),B1,B2,'un',0);
C = cat(2,C{:})
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Portfolio Optimization and Asset Allocation finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!