Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace repeated value based on sequence size - Matlab

Tags:

matlab

I have a 2D matrix composed of ones and zeros.

mat = [0 0 0 0 1 1 1 0 0
       1 1 1 1 1 0 0 1 0
       0 0 1 0 1 1 0 0 1];

I need to find all consecutive repetitions of ones in each row and replace all ones with zeros only when the sequence size is smaller than 5 (5 consecutive ones):

mat = [0 0 0 0 0 0 0 0 0
       1 1 1 1 1 0 0 0 0
       0 0 0 0 0 0 0 0 0];

Any suggestion on how to approach this problem would be very welcome.

like image 867
Oiko Avatar asked May 30 '26 07:05

Oiko


1 Answers

You can use diff to find the start and end points of the runs of 1, and some logic based on that to zero out the runs which are too short. Please see the below code with associated comments

% Input matrix of 0s and 1s
mat = [0 0 0 0 1 1 1 0 0
       1 1 1 1 1 0 0 1 0
       0 0 1 0 1 1 0 0 1];
% Minimum run length of 1s to keep   
N = 5;

% Get the start and end points of the runs of 1. Add in values from the
% original matrix to ensure that start and end points are always paired
d = [mat(:,1),diff(mat,1,2),-mat(:,end)];
% Find those start and end points. Use the transpose during the find to
% flip rows/cols and search row-wise relative to input matrix.
[cs,r] = find(d.'>0.5);  % Start points
[ce,~] = find(d.'<-0.5); % End points
c = [cs, ce];            % Column number array for start/end
idx = diff(c,1,2) < N;   % From column number, check run length vs N

% Loop over the runs which didn't satisfy the threshold and zero them
for ii = find(idx.')
    mat(r(ii),c(ii,1):c(ii,2)-1) = 0;
end

If you want to throw legibility out of the window, this can be condensed for a slightly faster and denser version, based on the exact same logic:

[c,r] = find([mat(:,1),diff(mat,1,2),-mat(:,end)].'); % find run start/end points
for ii = 1:2:numel(c)     % Loop over runs
    if c(ii+1)-c(ii) < N  % Check if run exceeds threshold length
        mat(r(ii),c(ii):c(ii+1)-1) = 0; % Zero the run if not
    end
end
like image 186
Wolfie Avatar answered Jun 01 '26 20:06

Wolfie



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!