Determine adjacent points in a logical matrix

2 vues (au cours des 30 derniers jours)
dormant
dormant le 4 Sep 2023
Déplacé(e) : Stephen23 le 5 Sep 2023
I have a 2-D matrix of logical values, eg
000000000
010000000
000000000
000000000
000000000
000001000
000000000
000000000
100000000
How can I create a similar sized matrix with True in all the locations adjacent to the Trues in the first matrix, eg
111000000
101000000
111000000
000000000
000011100
000010100
000011100
110000000
010000000
If a location is assigned True from two or more adjacent locations, then it should be True.
  1 commentaire
dormant
dormant le 4 Sep 2023
Déplacé(e) : Stephen23 le 5 Sep 2023
Thanks everyone. I knew it would be trivial, but I don't have much experience with manipulating 2D arrays.

Connectez-vous pour commenter.

Réponse acceptée

John D'Errico
John D'Errico le 4 Sep 2023
Modifié(e) : John D'Errico le 4 Sep 2023
Trivial. Learn to think in terms of MATLAB operations. I've added another 1 in there, just to make it clear what the problem is.
A = [0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0];
For example, what does this do? Does it get you close to what you want?
B = conv2(A,ones(3),'same')
B = 9×9
1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 1 0 0 0 0 0 1 2 2 1 0 0 0 0 0 1 2 2 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
Close, but we can fix that.
B = conv2(A,[1 1 1;1 0 1;1 1 1],'same')
B = 9×9
1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 2 2 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
Next, we need to be careful, as two elements near each other can create something bigger than 1 due to the convolution. This next will correct that.
B = conv2(A,[1 1 1;1 0 1;1 1 1],'same') ~= 0
B = 9×9 logical array
1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
The ones are adjacent to each other in the original array, and that meant that it filled in the ones in the result. We can zap them out too.
B = (conv2(A,[1 1 1;1 0 1;1 1 1],'same') ~= 0) & (~A)
B = 9×9 logical array
1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
  2 commentaires
dormant
dormant le 4 Sep 2023
This is perfect. Many thanks.
John D'Errico
John D'Errico le 4 Sep 2023
Thank you. I hope the explanations made sense. The important point is to think of conv and conv2 when you have problems like this.

Connectez-vous pour commenter.

Plus de réponses (1)

DGM
DGM le 4 Sep 2023
This can also be done succinctly with image processing tools:
% a logical array
A = [0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0];
A = logical(A);
% output is a logical array
B = imdilate(A,ones(3)) & ~A
B = 9×9 logical array
1 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0

Catégories

En savoir plus sur Shifting and Sorting Matrices dans Help Center et File Exchange

Produits


Version

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by