2014-12-27 2 views
0

Добро пожаловать!Matlab - поиск ближайшего соседа в трехмерной системе координат

У меня есть набор п Matlab матрицы со следующей структурой:

xyz_1 -3,37200000000000 2,80000000000000 5,03400000000000 

xyz_2 -2,21700000000000 1,74500000000000 7,45300000000000 

.... .................. ................ ................ 

xyz_n -1,39300000000000 0,00700000000000000 6,35500000000000 

где первый столбец является имя матрицы, а следующие три столбца являются XYZ координаты. Я ищу эффективный способ найти ближайшего соседа. Я хотел бы дать название матрицы и К потенциальным соседям в качестве входного параметра, то программа будет найти ближайшие сосед, давая мне матрицу результата в следующем виде:

[nearest_neighbor_name_1; distance_between_quoted_element_and_nearest_neigbor_1 

nearest_neighbor_name_2; distance_between_quoted_element_and_nearest_neigbor_2 

nearest_neighbor_name_....; distance_between_quoted_element_and_nearest_neigbor_.... 

nearest_neighbor_name_k; distance_between_quoted_element_and_nearest_neigbor_k] 

Я пытался использовать knnsearch, к сожалению, без эффекта. Спасибо за помощь!

+0

Пожалуйста, переформатируйте вопрос, используя \ 'для сегментов кода. Также: Что вы подразумеваете под: * Я пытался использовать 'knnsearch' без эффекта *? Почему этот подход неудовлетворительный? – knedlsepp

+0

Я нашел описание, как искать двухмерные координаты. К сожалению, я понятия не имею, как использовать «knnseach» в случае трехмерной системы. Кроме того, входной параметр для 'knneseach' - это одиночные матрицы (X и Y), а не, как в моем случае, множество многоа массированных. – destrudos

+0

Посмотрите на [этот пост] (http://stackoverflow.com/questions/27475978/finding-k-nearest-neighbour-with-matlab/27476929#27476929) для понимания. Убедитесь, что вы форматируете данные таким образом, чтобы каждая строка была точкой, а каждый столбец - переменной. – rayryeng

ответ

0

Является ли традиционный способ неудовлетворительным в некотором роде? Оцените расстояние от каждой точки до контрольной точки, а затем отсортируйте расстояния ...

%define the "k" entries that you are interested in assessing 
mydata_xyz = [-3.37200000000000 2.80000000000000 5.03400000000000; 
       -2.21700000000000 1.74500000000000 7.45300000000000; 
         <the rest of your data here> 
       -1.39300000000000 0.00700000000000000 6.35500000000000]; 

%define the point about which you are looking for the nearest neighbors 
mypoint_xyz = [ <whatever your xyz coordinate is]; 


%compute the distance from the given point to all of the other test points. 
%Note the use of the transpose (apostrophe) to ensure that it sums in the 
% correct direction 
distance = sqrt(sum(((mydata_xyz - ones(size(mydata_xyz,1),1)*mypoint_xyz).^2)')); 

%sort to get the nearest neighbor followed by the next nearest neighbors 
[sorted_distance, Isort] = sort(distance); 

%print out each one of the points, from closest to farthest 
for I=1:length(Isort) 
    disp(['Point ' num2str(Isort) ... 
      ', dist = ' num2str(distance(Isort(I))) ... 
      ', xyz = ' num2str(mydata_xyz(Isort(I),:))]); 
end