6 views (last 30 days)

Show older comments

Lets just say that I have a matrix v as following:

v =

0 0 0 0 0 0

1 1 0 1 1 0

1 0 1 0 1 0

0 0 1 0 1 0

0 0 0 1 1 1

I want to get rows where alternating ones and zeros are occuring which are 3rd and 4th rows. By alternating ones and zeros, I mean a sequence of [1 0 1 0] at least.

Devanuj Deka
on 14 Jul 2021

Edited: Devanuj Deka
on 14 Jul 2021

% Get the dimensions of 'v'

sz = size(v); % Gives two numbers. sz(1) is the number of rows; sz(2) is the number of columns

% Initialize a zero vector, having as many elements as the number of rows

% in v. After the code is run, the i'th element of this vector will be 1 if

% the i'th row of 'v' has an alternating pattern

rows = zeros(1,sz(1));

% Look for the pattern

for i=1:sz(1) % Iterating through rows

count = 0; % Count increments if the next element in the row is different

for j=1:sz(2)-1 % Iterating through the elements of each row

if v(i,j)~=v(i,j+1) % If current element and next element are unequal, increment count

count = count+1;

else % If next element is equal to the current element, count is reset

count = 0;

end

if count==3 % Minimum 3 changes back to back are required for your pattern (0->1->0->1, or 1->0->1->0)

rows(j) = 1; % If pattern detected in i'th row, row(i) is set to 1

break; % Since pattern detected, no need to look for more in the same row.

end

end

end

rows_with_pattern = find(rows); % A vector containing the rows which have the alternating pattern

find(X) gives the indices of non-zero elements in an array X, which is why we initialized rows as a vector of zeroes.

Stephen
on 15 Jul 2021

v =[ 0 0 0 0 0 0; ...

1 1 0 1 1 0; ...

1 0 1 0 1 0; ...

0 0 1 0 1 0; ...

0 0 0 1 0 1; ... Walter Roberson's suggestion,

1 0 1 0 0 0; ... and reversed also.

0 1 0 1 0 1; ... Entire row alternating.

0 0 0 1 1 1];

X = any(diff(v,3,2)>3 | diff(~v,3,2)>3, 2)

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

Start Hunting!