Clear Filters
Clear Filters

Info

This question is closed. Reopen it to edit or answer.

search multiple results for multiple conditions

1 view (last 30 days)
K VdB
K VdB on 4 Aug 2017
Closed: MATLAB Answer Bot on 20 Aug 2021
THE CONTEXT:
I have a set of points in a virtual 2D space. Every point has its own x and y coordinate in space.
P = [1,2 ; 2 5; 4 6; 7 8; ...] % first column are x coordinates and second column are y coordinates
If I want to find the point that is closest to the first one [1,2] I can find the distance between the first point an the other points:
dis = sqrt((P(:,1)-1).^2 + (P(:,2)-2).^2)
dis = [0 ; 3.1623 ; 5 ; 8.4853 ; ...]
if I then search for the second smallest value in 'dis' I know which point is closest to the first point
THE QUESTION:
To generate the closest point for every point I can use a for loop
for i=1:length(P)
dis = sqrt((P(:,1)-P(i,1).^2 + (P(:,2)-P(i,2).^2);
index = secondsmallest(dis) % find index of second smallest value somehow
P_indices(i) = index; % store index in an array'
end
Is there a way to find these indices without using a for loop?
.
Kind regards
Kjartan

Answers (3)

Star Strider
Star Strider on 4 Aug 2017
I would use the pdist (link) function. You can use ordinary matrix indexing to find the indices of the various values. Also see the sort (link) function, as well as the functions linked in and at the end of the documentation pages.

dpb
dpb on 4 Aug 2017

Jan
Jan on 4 Aug 2017
Edited: Jan on 4 Aug 2017
for i=1:length(P)
dis2 = (P(:,1) - P(i,1).^2 + (P(:,2) - P(i,2).^2; % Omit SQRT() to save time
index = secondsmallest(dis2); % find index of second smallest value somehow
P_indices(i) = index; % store index in an array'
end
function k = secondsmallest(x)
[~, k] = min(x);
x(k) = Inf;
[~, k] = min(x);
end
This is faster than sorting the complete vector.
Be sure that P_indices is pre-allocated before the loop.

This question is closed.

Tags

Community Treasure Hunt

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

Start Hunting!