在Matlab中对坐标点进行排序

use*_*873 3 matlab

我想要做的是对这些坐标点进行排序:

测量坐标(x,y)=(2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3,2), (3,3),(3,1)

我需要通过迭代来获得这些点的序列或轨迹.

Gun*_*uyf 5

data = [2,2 ; 2,3 ; 1,2 ; 1,3 ; 2,1 ; 1,1 ; 3,2 ; 3,3 ; 3 ,1]
% corresponding sort-value, pick one out or make one up yourself:
sortval = data(:,1); % the x-value
sortval = data(:,2); % y-value
sortval = (data(:,1)-x0).^2 + (data(:,2)-y0).^2; % distance form point (xo,y0)
sortval = ...

[~,sortorder] = sort(sortval);
sorted_data = data(sortorder,:);
Run Code Online (Sandbox Code Playgroud)

但是从你的评论中,我知道你实际上需要一些东西来重建路径并迭代地找到最后找到的点的最近邻居(到目前为止重建的路径).

以下是我将如何解决这个问题(使用pdist2来计算所有点之间的距离以便于实现):

data = [2,2 ; 2,3 ; 1,2 ; 1,3 ; 2,1 ; 1,1 ; 3,2 ; 3,3 ; 3 ,1];
dist = pdist2(data,data);

N = size(data,1);
result = NaN(1,N);
result(1) = 1; % first point is first row in data matrix

for ii=2:N
    dist(:,result(ii-1)) = Inf;
    [~, closest_idx] = min(dist(result(ii-1),:));
    result(ii) = closest_idx;
end
Run Code Online (Sandbox Code Playgroud)

这导致:

result =
     1     2     4     3     6     5     9     7     8
Run Code Online (Sandbox Code Playgroud)

是曲线上连续点的指数.这是这个结果的图:

在此输入图像描述

正如@ mathematician1975已经提到的那样,距离点的距离可以相等.这可以通过使用来解决,min它只是在数组中找到第一次出现的最小值.这意味着如果您以不同的方式订购输入数据,当然可以获得不同的结果,这是等距离问题所固有的.

第二条评论:我不知道在使用大型输入数据矩阵时它会如何表现,由于循环可能有点慢,这是你无法避免的.我仍然看到改进的余地,但这取决于你;)