MATLAB: Replace numbers in a matrix depending on neighbor numbers

MATLABmatrixmatrix arraymatrix manipulationregion growing

Hi community,
I have a 14×9 matrix that contains as values NaN, 1 or 2. I need to "clean" this matrix regarding cells containing number 1. If cells containing number 1 are neighbor to NaN cells (both up, down, left, right and diagonal), I need to change this number to a NaN. However, more than checking individually, I need to check that if I have a block of numbers 1 connected to a NaN, all these numbers 1 must be replaced to a NaN. If a cell containing a number 1 is surrounded in all 8-directions by numbers 2, this cell must remain with a number 1.
For example, my input is a matrix like this one:
[2 2 2 1 2 1 NaN NaN NaN;
2 2 2 1 2 1 NaN NaN NaN;
2 2 2 1 1 1 NaN NaN NaN;
2 2 2 1 1 1 NaN NaN NaN;
2 2 2 1 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 2 1 NaN NaN NaN;
2 1 2 2 2 1 NaN NaN NaN;
2 2 2 2 2 1 NaN NaN NaN];
And the output I´m expecting is:
[2 2 2 NaN 2 NaN NaN NaN NaN;
2 2 2 NaN 2 NaN NaN NaN NaN;
2 2 2 NaN NaN NaN NaN NaN NaN;
2 2 2 NaN NaN NaN NaN NaN NaN;
2 2 2 2 NaN NaN NaN NaN NaN;
2 2 2 2 NaN NaN NaN NaN NaN;
2 2 2 2 NaN NaN NaN NaN NaN;
2 2 2 2 NaN NaN NaN NaN NaN;
2 2 2 2 NaN NaN NaN NaN NaN;
2 2 2 2 NaN NaN NaN NaN NaN;
2 2 2 2 2 NaN NaN NaN NaN;
2 1 2 2 2 NaN NaN NaN NaN;
2 2 2 2 2 NaN NaN NaN NaN];
Thank you very much for your help!!!.

Best Answer

Do you have the Image Processing Toolbox? If so, use isnan() and imreconstruct().
This works:
m = ...
[2 2 2 1 2 1 NaN NaN NaN;
2 2 2 1 2 1 NaN NaN NaN;
2 2 2 1 1 1 NaN NaN NaN;
2 2 2 1 1 1 NaN NaN NaN;
2 2 2 1 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 1 1 NaN NaN NaN;
2 2 2 2 2 1 NaN NaN NaN;
2 1 2 2 2 1 NaN NaN NaN;
2 2 2 2 2 1 NaN NaN NaN]
m2 = m;
m2(isnan(m)) = 1
nansOnly = isnan(m)
mask = imreconstruct(nansOnly, m2 == 1)
% Make 1's nans
m2 = m; % Initialize
m2(mask) = nan % Set 1's touching nans to nan