sum of vector by group

2 vues (au cours des 30 derniers jours)
Yona
Yona le 3 Sep 2014
Commenté : Yona le 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);

Réponse acceptée

Sean de Wolski
Sean de Wolski le 3 Sep 2014
Modifié(e) : Sean de Wolski le 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 commentaire
Yona
Yona le 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]);

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by