# Detecting length and number of occurrences in a logical array

2 views (last 30 days)
Jason MacNaughton on 25 Nov 2019
Edited: Andrei Bobrov on 26 Nov 2019
EX:
array1 = [0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1]
I want to extract the number of times of consecutive 1's in a separate array eg: array2 = [4 2 6 1], where the length of array 2 is equal to the amount of groups of consecutive 1s and the values is the length of the chain of 1s. I also want to ensure that at 1's at the beginning and end of the arrays are captured.

the cyclist on 25 Nov 2019
Edited: the cyclist on 25 Nov 2019
Download Jan's RunLength utility from the File Exchange. It will do exactly what you want.
array1 = [0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1];
[b n] = RunLength(array1);
array2 = n(b==1)
array2 =
4 2 6 1

#### 1 Comment

Jason MacNaughton on 25 Nov 2019
Thank you!

Image Analyst on 25 Nov 2019
Jason, if you want a simple way to do it using built-in Mathworks functions and without using some third party File Exchange submission, and if you have the Image Processing Toolbox, you can simply use regionprops(). Here's an example:
array1 = [0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1]
props = regionprops(logical(array1), 'Area')
allLengths = [props.Area]
regionprops() labels each contiguous run of 1's and then measures each run and puts the results into a structure array.
props =
4×1 struct array with fields:
Area
Using the bracket trick in the third line concatenates all Area fields from the structure into one single vector.
allLengths =
4 2 6 1

#### 1 Comment

Andrei Bobrov on 25 Nov 2019
+1

Andrei Bobrov on 25 Nov 2019
Edited: Andrei Bobrov on 26 Nov 2019
Without Toolboxes and Fileexchanges
a = accumarray(cumsum([0;diff(array1(:))] == 1).*array1(:)+1,1);
out = a(2:end);