[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: counting runs of a certain length in binary data

From: Mike Miller
Subject: Re: counting runs of a certain length in binary data
Date: Fri, 3 Mar 2000 19:06:06 -0600 (CST)

On Fri, 3 Mar 2000, John W. Eaton wrote:

> Would the following work?
>   y = [0; X; 0];
>   find (diff (y) == -1) - find (diff (y) == 1)
> X is the vector of binary digits.  The idea is that prepending and
> appending zeros ensures that the first nonzero element of diff(y) will
> be 1 and that the last nonzero element will be -1, and that there will
> be an equal number of 1 and -1 elements.  Then the results of the two
> find commands should always have the same length, and their difference
> should be the run-lengths for the ones in the original vector.


That was great!  Thanks much.  It wasn't quite what I was looking for, but
it did give me the clue I needed to get what I wanted.

Your code gives run lengths for ones, but I needed run lengths for ones
and for zeros.  I used the 'find' idea you presented and altered it as

     diff (find (diff ([2; X; 2]) ~= 0))

The use of '2' is an arbitrary choice:  I had to put something other than
zeros or ones in there.  That line of code gives me a vector of run
lengths as follows:

octave:1> X=[0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0]';
octave:2> diff (find (diff ([2; X; 2]) ~= 0))
ans =


If I need to count how many runs are length N or longer, as I'd originally
planned, I can use this line of code:

     sum (diff (find (diff ([2; X; 2]) ~= 0)) >= N)

Thanks again.  That was a big help.  It's amazing how much can be done
with Octave in a single compact line.


Octave is freely available under the terms of the GNU GPL.

Octave's home on the web:
How to fund new projects:
Subscription information:

reply via email to

[Prev in Thread] Current Thread [Next in Thread]