# Determine adjacent points in a logical matrix

2 ビュー (過去 30 日間)
dormant 2023 年 9 月 4 日

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 件のコメント-1 件の古いコメントを表示-1 件の古いコメントを非表示
dormant 2023 年 9 月 4 日

Thanks everyone. I knew it would be trivial, but I don't have much experience with manipulating 2D arrays.

サインインしてコメントする。

### 採用された回答

John D'Errico 2023 年 9 月 4 日

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 件のコメントなしを表示なしを非表示
dormant 2023 年 9 月 4 日
This is perfect. Many thanks.
John D'Errico 2023 年 9 月 4 日
Thank you. I hope the explanations made sense. The important point is to think of conv and conv2 when you have problems like this.

サインインしてコメントする。

### その他の回答 (1 件)

DGM 2023 年 9 月 4 日
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

サインインしてコメントする。

### カテゴリ

Help Center および File ExchangeShifting and Sorting Matrices についてさらに検索

R2023a

### Community Treasure Hunt

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

Start Hunting!

Translated by