2012-07-24 121 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'值。如果你的觀點是相對於勒令一些其他的排序參數(如時間),然後排序,除非你還記得他們在創建順序將無法正常工作。