2012-07-24 118 views
3

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

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

我需要得到这个点的序列或轨迹通过迭代遵循它们。

+3

对他们进行排序? x或y? – mathematician1975 2012-07-24 13:32:42

+0

实际上,我有一个函数的坐标点,但以无序的方式,如何排序这个点,使序列(近邻)?我的意思是,如果我想按顺序绘制每个坐标点,我需要从第一个点开始并继续最近的点。 – user1310873 2012-07-24 13:41:05

+0

好吧,这将是棘手。一开始你的许多点都是等距的(例如(2,3)和(2,1)距离(2,2)相同的距离),你也需要定义一个起点。我不认为matlab有内置任何东西 - 你需要以艰难的方式去做,并决定如何处理等距点 – mathematician1975 2012-07-24 13:46:30

回答

3
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 

是该指数以曲线上的连续点。下面是这个结果的一个情节:

enter image description here

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

第二条评论:我不知道如何使用大输入数据矩阵时会出现这种情况,可能会因为循环而变慢,这是您无法避免的。我仍然看到有待改进的空间,但这取决于你;)

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) 

得到一个矩阵,其行数是由您ir'y'值。如果你的观点是相对于勒令一些其他的排序参数(如时间),然后排序,除非你还记得他们在创建顺序将无法正常工作。