我想要做的是对这些坐标点进行排序:
测量坐标(x,y)=(2,2),(2,3),(1,2),(1,3),(2,1),(1,1),(3, 2),(3,3),(3,1)
我需要通过迭代来获得这些点的序列或轨迹。
答案 0 :(得分: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,:);
但是从你的评论中,我知道你实际上需要一些东西来重建路径并迭代地找到最后找到的点的最近邻居(到目前为止重建的路径)。
以下是我如何解决这个问题(使用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
来解决,{{1}}只是在数组中找到第一次出现的最小值。这意味着如果您以不同的方式订购输入数据,当然可以获得不同的结果,这是等距离问题所固有的。
第二句话:我不知道在使用大型输入数据矩阵时它会如何表现,由于循环可能有点慢,这是你无法避免的。我仍然看到改进的余地,但这取决于你;)
答案 1 :(得分:3)
从您的积分创建矩阵,以便您有类似
的内容 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'值排序的点。如果您的点数是根据其他一些订购参数(例如时间)订购的,那么除非您记住它们的创建顺序,否则排序将无效。