Cumulative Sum for Column of Ones and Zeros

3 Ansichten (letzte 30 Tage)
Kevin Zhang
Kevin Zhang am 5 Dez. 2017
Kommentiert: Ronni Isham am 2 Jan. 2019
I have a column of ones and zeros, and I want to create a second column that takes a cumulative sum of the ones. When a 0 is encountered, the cumulative sum should go to zero, and repeat. For example,
A = [1 1 1 1 1 0 0 1 1]
B = [1 2 3 4 5 0 0 1 2]
Basically, I would like to count the number of consecutive zeros in the first column vector until a zero is reached, and then restart at the next group of ones. I need to output this as a column vector. I have tried using a for loop, but it takes minutes to calculate only a few rows and begins to return zeros after a few rows. Code is below (please excuse the inefficient way I have initialized the vectors):
T1 = [1:43801]'
Tdecl = zeros(size(T1));
UM = randi([0 1],43801,1)
for i = 1:43801
if UM(i)==1
Tdecl(i) = Tdecl(i)+1
else
Tdecl(i) = 0
end
end
  1 Kommentar
Jos (10584)
Jos (10584) am 5 Dez. 2017
You also need to take the previous element into account
if UM(1) == 1, Tdecl(1) = 1 ; end
for i=2:43801
if UM(i)==1,
Tdecl(i) = Tdecl(i-1) + 1 ;
end
end
but note that runindex (see my answer below) is much faster.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Jos (10584)
Jos (10584) am 5 Dez. 2017
A perfect job for runindex:
A = [0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 1 1 0]
B = runindex(A)
B(A==0) = 0
My function RUNINDEX can be downloaded from the File Exhchange:
The code is short and very fast, using a nice index trick and cumsum.
  2 Kommentare
Kevin Zhang
Kevin Zhang am 7 Dez. 2017
Hi Jos,
Thanks for the reply, I managed to figure this out myself - I neglected to use semicolons in my loop and it was causing huge issues.
Ronni Isham
Ronni Isham am 2 Jan. 2019
Could you please upload your final solution?

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!

Translated by