[英]Sort Coordinates Points in Matlab
我想要做的是對這些坐標點進行排序:
測量坐標(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
來解決, 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
值或x
排序的點
B = sortrows(A,2)
獲得一個矩陣,其行是您的'y'值排序的點。 如果您的點數是根據其他一些訂購參數(例如時間)訂購的,那么除非您記住它們的創建順序,否則排序將無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.