Sum only consecutive positive numbers...
4 views (last 30 days)
Show older comments
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.
Answers (3)
ANKUR KUMAR
on 30 Oct 2017
A = [1 2 -3 4 -5 6 7 -8 9 10 11 12];
A(A<=0)=nan;
nansum(A)
2 Comments
Walter Roberson
on 30 Oct 2017
No, this gives a grand total of the positive values, rather than giving the required output vector.
Image Analyst
on 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)
0 Comments
Andrei Bobrov
on 30 Oct 2017
Edited: Andrei Bobrov
on 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;
0 Comments
See Also
Categories
Find more on NaNs in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!