Sum only consecutive positive numbers...

6 ビュー (過去 30 日間)
IGOR RIBEIRO
IGOR RIBEIRO 2017 年 10 月 30 日
コメント済み: ANKUR KUMAR 2017 年 10 月 30 日
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.

回答 (3 件)

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

サインインしてコメントする。


Image Analyst
Image Analyst 2017 年 10 月 30 日
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 2017 年 10 月 30 日
編集済み: Andrei Bobrov 2017 年 10 月 30 日
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;

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by