sum of vector by group

2 Ansichten (letzte 30 Tage)
Yona
Yona am 3 Sep. 2014
Kommentiert: Yona am 3 Sep. 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);

Akzeptierte Antwort

Sean de Wolski
Sean de Wolski am 3 Sep. 2014
Bearbeitet: Sean de Wolski am 3 Sep. 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 Kommentar
Yona
Yona am 3 Sep. 2014
thanks, i didn't think to use cumsum on the difference. just a little improvement:
idx = cumsum([1 abs(diff(sign(a)))==2]);

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by