# How to count the number of consecutive identical elements (in both the directions) in a binary vector ?

108 views (last 30 days)

Show older comments

Suppose I have a binary vector

X = [0 0 0 0 1 1 1 0 1 1 1 1]

I want to characterize each element with the number of identical elements occurring in consecutive positions in both the directions. For instance, the desired output should look like:

Y = [4 4 4 4 3 3 3 1 4 4 4 4].

I found a similar thread, but it counts only in the forward direction. Thanks in advance for any sort of assistance.

##### 1 Comment

Guillaume
on 11 Feb 2018

### Accepted Answer

Jan
on 11 Feb 2018

Edited: Jan
on 11 Feb 2018

X = [0 0 0 0 1 1 1 0 1 1 1 1];

[B, N] = RunLength(X);

Y = RunLength(N, N);

If you do not have a C-compiler for the fast C-Mex function, use RunLength_M.

Or with Matlab code:

d = [true, diff(X) ~= 0, true]; % TRUE if values change

n = diff(find(d)); % Number of repetitions

Y = repelem(n, n)

##### 2 Comments

### More Answers (2)

Jos (10584)
on 11 Feb 2018

Edited: Jos (10584)
on 11 Feb 2018

Something like this?

X = [0 0 0 0 1 1 1 0 1 1 1 1] % row vector!

numX = numel(X) ;

Q = find([false diff(X)≈0]) ;

I = zeros(1, numX) ;

I(Q) = 1 ;

I = cumsum(I) ;

N = diff([1 Q numX+1]) ;

result = N(I+1)

##### 0 Comments

Image Analyst
on 11 Feb 2018

Here's yet another way:

X = logical([0 0 0 0 1 1 1 0 1 1 1 1])

Y = zeros(1, length(X)); % Initialize output as the same size as X.

props = regionprops(X, 'Area', 'PixelIdxList');

for k = 1 : length(props)

Y(props(k).PixelIdxList) = props(k).Area;

end

props = regionprops(~X, 'Area', 'PixelIdxList');

for k = 1 : length(props)

Y(props(k).PixelIdxList) = props(k).Area;

end

##### 0 Comments

### See Also

### Community Treasure Hunt

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

Start Hunting!