Sum only consecutive positive numbers...

6 vues (au cours des 30 derniers jours)
IGOR RIBEIRO
IGOR RIBEIRO le 30 Oct 2017
Commenté : ANKUR KUMAR le 30 Oct 2017
Hi all, I need help. So, I have this vector:
l = [1 2 -3 4 -5 6 7 -8 9 10 11 12];
I need sum only consecutive positive numbers. when picking up a negative number, put NaN. So, the results correct is:
a = [3 NaN 4 NaN 13 NaN 42];
Thank you!
Best regards.

Réponses (3)

ANKUR KUMAR
ANKUR KUMAR le 30 Oct 2017
A = [1 2 -3 4 -5 6 7 -8 9 10 11 12];
A(A<=0)=nan;
nansum(A)
  2 commentaires
Walter Roberson
Walter Roberson le 30 Oct 2017
No, this gives a grand total of the positive values, rather than giving the required output vector.
ANKUR KUMAR
ANKUR KUMAR le 30 Oct 2017
Ops, Sorry. I misread the question.

Connectez-vous pour commenter.


Image Analyst
Image Analyst le 30 Oct 2017
Here's one way:
m = [1 2 -3 4 -5 6 7 -8 9 10 11 12]
dm = [1. diff(m)]
mask = (m > 0) & (dm >= 0)
props = regionprops(mask, m, 'Area', 'MeanIntensity');
sums = [props.Area] .* [props.MeanIntensity]
% Add in nan's
sums = [sums; nan(1, length(sums))]
sums = sums(:)'
% Get rid of last nan.
sums = sums(1:end-1)

Andrei Bobrov
Andrei Bobrov le 30 Oct 2017
Modifié(e) : Andrei Bobrov le 30 Oct 2017
l = [1 2 -3 4 -5 6 7 -8 9 10 11 12];
lo = l > 0;
h = cumsum(diff([0;lo(:)]) == 1).*lo(:);
S = accumarray(h + 1,l);
out = nan(numel(S)*2-1,1);
out(1:2:end) = S;
or
l = [1 2 -3 4 -5 6 7 -8 9 10 11 12];
lo = l > 0;
h = diff([~lo(1),lo])~=0;
out = accumarray(cumsum(h(:)),l);
out(out < 0) = nan;

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by