Cumsum function + range of values after cumsum.

1 view (last 30 days)
A 0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 ..... 0 0 1 0 0 0 0 1 0 0 1 0 1 ....
cumsum 0 0 0 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 ..... 159 159 160 0 0 0 0 1 1 1 2 2 3 ....
Delete 0 0 0 1 0 0 2 0 0 0 0 3 0 0 0 0 4 0 0 ..... 0 0 160 0 0 0 0 1 0 0 2 0 3 ....
Ex) When the vaule 'Delete' = 160, I'd like to reset counter 160 -> 1.
for i=1:n;
cumsum=cumsum(A); => some codes should be added to reset...;;
if A(i,1)==A(i+1,1);
0=Delete(i+1,1);
end
end
Thank you.

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 17 Nov 2015
Edited: Andrei Bobrov on 17 Nov 2015
cmsum0 = cumsum(A);
cmsum = rem(cmsum0-1,160)+1;
delte = A;
t = A > 0;
delte(t) = cmsum(t);
  3 Comments
Andrei Bobrov
Andrei Bobrov on 17 Nov 2015
other variant:
cmsum = cumsum(A);
t = cmsum > 160;
cmsum(t) = cmsum(t) - 160;
delte = cmsum.*A;
the cyclist
the cyclist on 17 Nov 2015
Two comments on this variant:
  • I don't think it addresses the reoccurrences of exactly 160 that I mentioned in an earlier comment.
  • You might need to do the "subtract 160" step multiple times, if the cumsum could results in values greater than 320, 480, 640, etc. This is easily done via a while loop.

Sign in to comment.

More Answers (1)

the cyclist
the cyclist on 17 Nov 2015
I think this does what you want. I changed the name of your cumsum variable to c. It's bad practice (and confusing) to name a variable that same as a MATLAB function.
A = [0 0 0 1 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 156 0 0 0 0 1 0 0 1 0 1];
n = numel(A);
c = cumsum(A);
reset = 160;
for i = 2:n
if (c(i) > reset+1) || (c(i-1)==reset && c(i)==reset)
c(i:end) = c(i:end) - reset;
end
end
Delete = c;
Delete([false diff(c)==0]) = 0;

Categories

Find more on Parallel Computing 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!