Find neighboring nodes in a list of node positions

1 vue (au cours des 30 derniers jours)
Raldi
Raldi le 8 Mar 2018
I have two vectors of X and Y positions
x = randn(10,1);
y = randn(10,1);
So x(1) with y(1) together make the position of node 1
What I want to do is find all other nodes that are lets say in a distance of d=.3 from that node, and do this for all nodes in the list.
What is a good vectorized way of doing this without having a double for loop?

Réponse acceptée

Image Analyst
Image Analyst le 9 Mar 2018
If you have the Statistics and Machine Learning Toolbox, you can simply use pdist2() to find distances between all possible pairs of x,y locations:
% Set up:
x = randn(10,1);
y = randn(10,1);
xy = [x, y];
% Find distances between every possible pair of points:
distances = pdist2(xy, xy)
% Find distances less than 0.3
closeDistances = distances < 0.3 & distances > 0
% Get indexes of those close distances.
[rows, columns] = find(closeDistances)
% Done! Now, for info, print out those nodes that are close
for k = 1 : length(rows)
fprintf('Node %d and %d are close, with a distance between them of %.3f.\n',...
rows(k), columns(k), distances(rows(k), columns(k)));
end

Plus de réponses (1)

David Fletcher
David Fletcher le 8 Mar 2018
Something like this:
x = randn(10,1);
y = randn(10,1);
%set desired distance
maxDistance=1.6;
%set node of interest
node=4;
pos=[x y];
nodeCoords=pos(node,:);
%Calculate distance from specified node (euclidean)
distFromNode=sqrt((pos(:,1)-nodeCoords(1,1)).^2+(pos(:,2)-nodeCoords(1,2)).^2);
%Create index to points within specified maxDistance
ind=distFromNode<=maxDistance;
%List of node indexes within specified distance
indexes=1:length(x);
isWithin_Index=indexes(ind)
%List of node coords within specified distance
isWithin_Position=pos(ind,:)
Though you may want to modify it so that the node doesn't report that it is within maxDistance of itself

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by