私がやりたいのは、これらの座標点をソートすることです:
測定座標 (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
これは、配列内の最小値の最初の出現を見つけるだけの which を使用してここで解決されます。これは、入力データの順序を変えると、もちろん異なる結果が得られることを意味します。これは、等距離の問題に固有のものです。
2 番目の注意: 大きな入力データ マトリックスを使用する場合にこれがどのように動作するかはわかりません。おそらくループのために少し遅くなりますが、これは回避できません。まだ改善の余地がありますが、それはあなた次第です ;)
次のようなものになるように、ポイントからマトリックスを作成します
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」値で順序付けられたポイントである行を含む行列を取得します。ポイントが他の順序付けパラメーター (時間など) に関して順序付けられている場合、それらが作成された順序を覚えていない限り、並べ替えは機能しません。