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

108 views (last 30 days)
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.

Accepted Answer

Jan
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)

More Answers (2)

Jos (10584)
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)

Image Analyst
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

Categories

Find more on Startup and Shutdown in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!