Azzera filtri
Azzera filtri

sum of vector by group

1 visualizzazione (ultimi 30 giorni)
Yona
Yona il 3 Set 2014
Commentato: Yona il 3 Set 2014
i have a vector of numbers
a=[1 4 1 -3 -6 9 9 1 1 1 -1 -1 -4]
and i group them by their sign (i don't have zero, only positive and negative number); 3 positive, 2 negative, ext. so:
b=[3 2 5 3]
now i want to find the sum of each group:
res=[6 -9 21 -6]
how can i do it, without using a loop.
Note: the vector "a" can be empty, contain only positive number, only negative number, or both of them when the first number can be positive or negative. in any case it don't contain zeros.
Note2: the way i find "b" is:
b = diff([1 find(diff([0 sign(a)]==1)~=0) length(a)+1]);
b=b(b~=0);

Risposta accettata

Sean de Wolski
Sean de Wolski il 3 Set 2014
Modificato: Sean de Wolski il 3 Set 2014
a=[1 4 1 -3 -6 9 9 1 1 1 -1 -1 -4];
idx = cumsum([0 abs(diff(sign(a)))==2])+1;
res = accumarray(idx.',a.')
  1 Commento
Yona
Yona il 3 Set 2014
thanks, i didn't think to use cumsum on the difference. just a little improvement:
idx = cumsum([1 abs(diff(sign(a)))==2]);

Accedi per commentare.

Più risposte (0)

Prodotti

Community Treasure Hunt

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

Start Hunting!

Translated by