Finding the durations of states within a matrix

Octave newbie here, one-time Matlab user in the distant past… I’m working on a problem where I have a state matrix of 1s and 0s. From this I want to create a new matrix of the durations of each “on” (i.e. 1) state. For example, if my state matrix is [0 1 1 1 0 1 0 0 1 1 0], the output duration matrix would be [3 1 2]. The duration of the 0s in between isn’t terribly relevant to me at the moment. I’m specifically interested in the most resource-efficient method of tackling this, as once scaled up I’ll be applying it to a matrix tens to hundreds of millions of rows long.

Win 10 / Octave 6.4.0

Try this:

>> [count, value] = runlength([0 1 1 1 0 1 0 0 1 1 0])
count =

   1   3   1   1   2   2   1

value =

   0   1   0   1   0   1   0

>> ones_count = count(value==1)
ones_count =

   3   1   2

as hinted at by @lesb, what you’re doing is a well known compression technique called run length encoding. You are welcome to look at the underlying code in the runlength function (edit runlength) to see how it works. Essentially it’s looking for changes in value, then determining the spacing between those changes. It does this in a vectorized fashion which leverages some efficiencies within octave. As the wikipedia article above suggests, there are numerous algorithms to accomplish this encoding, and whether this is the most resource-efficient method for you will depend a lot on the type and size of data you’re processing. There may be generally more efficient methods for your specific data.


@lesb, @nrjank thanks both not just for the solutions but the useful background info - down the rabbit hole I go. As ever half the challenge is knowing the right name for what you’re looking for!