How to aggregate data based on values in a vector?

14 vues (au cours des 30 derniers jours)
HeadInTheClouds
HeadInTheClouds le 14 Déc 2017
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!

Réponse acceptée

Jos (10584)
Jos (10584) le 14 Déc 2017
Modifié(e) : Jos (10584) le 14 Déc 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 commentaires
HeadInTheClouds
HeadInTheClouds le 15 Déc 2017
This works great! Thank you!
Lateef Adewale Kareem
Lateef Adewale Kareem le 7 Avr 2019
Modifié(e) : Lateef Adewale Kareem le 7 Avr 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{:})

Connectez-vous pour commenter.

Plus de réponses (0)

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by