我想要做的是对这些坐标点进行排序:
测量坐标 (x,y)= (2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3,2), (3,3),(3 ,1)
我需要获取这些点的序列或轨迹,以便通过迭代来跟踪它们。
我想要做的是对这些坐标点进行排序:
测量坐标 (x,y)= (2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3,2), (3,3),(3 ,1)
我需要获取这些点的序列或轨迹,以便通过迭代来跟踪它们。
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,:);
但是根据您的评论,我知道您实际上需要一些东西来重建路径并迭代地找到最后找到的点(到目前为止的重建路径)的最近邻居。
以下是我将如何解决这个问题(使用 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
这导致:
result =
1 2 4 3 6 5 9 7 8
是曲线上连续点的索引。这是这个结果的图表:
正如@mathematician1975 已经提到的,到一个点的距离可以相等。这是通过使用min
它来解决的,它只找到数组中最小值的第一次出现。这意味着如果您对输入数据进行不同的排序,当然可以获得不同的结果,这是等距离问题所固有的。
第二条评论:我不知道在使用大型输入数据矩阵时这会如何表现,因为循环可能有点慢,这是你无法避免的。我仍然看到改进的空间,但这取决于你;)
从你的点创建一个矩阵,这样你就有了类似的东西
A = [2 2 1 1 2 1 3 3 3;
2 3 2 3 1 1 2 3 1]';
然后尝试
B = sortrows(A,1);
得到一个矩阵,其中的行是您按x
值排序的点或
B = sortrows(A,2)
得到一个矩阵,其中的行是你的点,按它们的 'y' 值排序。如果您的点是相对于其他一些排序参数(例如时间)进行排序的,那么排序将不起作用,除非您记住它们的创建顺序。