finding neighbor value

1 Ansicht (letzte 30 Tage)
Mohammad Golam Kibria
Mohammad Golam Kibria am 12 Mai 2011
Hi,
suppose I have a large matrix A of size 200X200
I need to know the neighbor value and also the neighbor position of distance 3 of the position (50,50)
can it be done easily
A =
1 2 3
3 3 6
4 6 8
4 7 7
here (2,2) value is 3. its one distance neighbor is 1,2,3,3,6,4,6,8 and position is (1,1),(1,2),(1,3),(2,1),(2,3), (3,1),(3,2),(3,3)

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 12 Mai 2011
variant
A = randi(170,200);
sz = size(A);
center = [50 50];
N = 3;
Outnum = A(max(abs(repmat(1:sz(2),size(A,1),1) - center(1)) ,...
abs(repmat((1:sz(1))',1,size(A,2)) - center(2))) == fix(N/2));
more with bwdist from Image Processing Toolbox
A = randi(170,200);
sz = size(A);
center = [50 50];
N = 3;
AA = zeros(sz);
AA(center(1),center(2)) = 1;
Outnum = A(bwdist(AA,'chessboard')==fix(N/2));
Hi Oleg! Variant for N > 3
A = randi(170,17,13);
sz = size(A);
center = [8 7];
N = 5;
ons = ones(N);
ons(2:end-1,2:end-1) = 0;
ij = bsxfun(@plus, center.'-fix(N/2),0:N-1);
Outnum = A(ij(1,:),ij(2,:)).*ons;
Outnum = Outnum(Outnum>0);
  2 Kommentare
Oleg Komarov
Oleg Komarov am 12 Mai 2011
Too complicated IMHO.
Sean de Wolski
Sean de Wolski am 12 Mai 2011
I'd roll with bwdist or A(imdilate(A == 3,ones(3)))

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Oleg Komarov
Oleg Komarov am 12 Mai 2011
EDITED
To make it flexible n = distance from center
A = randi(170,17,13);
center = [8 7];
n = 2;
% Boundary check
if all(pos - n) && all(pos + n <= size(A))
B = A(center(1)-2:center(1)+2, center(2)-n:center(2)+n).';
B = B([1:2*n*(n+1) 2*(n^2 + n + 1):end]);
end

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by