我想要做的是对这些坐标点进行排序:在Matlab中对坐标点进行排序
测量坐标(x,y)=(2,2),(2,3),(1,2), (1,3),(2,1),(1,1),(3,2),(3,3),(3,1)
我需要得到这个点的序列或轨迹通过迭代遵循它们。
我想要做的是对这些坐标点进行排序:在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
来解决,它只是在数组中找到最小值的第一个出现。这意味着如果您以不同的方式对输入数据进行排序,当然可以得到不同的结果,这是等距离问题所固有的。
第二条评论:我不知道如何使用大输入数据矩阵时会出现这种情况,可能会因为循环而变慢,这是您无法避免的。我仍然看到有待改进的空间,但这取决于你;)
创建一个从您的点矩阵,让你有类似
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'值。如果你的观点是相对于勒令一些其他的排序参数(如时间),然后排序,除非你还记得他们在创建顺序将无法正常工作。
对他们进行排序? x或y? – mathematician1975 2012-07-24 13:32:42
实际上,我有一个函数的坐标点,但以无序的方式,如何排序这个点,使序列(近邻)?我的意思是,如果我想按顺序绘制每个坐标点,我需要从第一个点开始并继续最近的点。 – user1310873 2012-07-24 13:41:05
好吧,这将是棘手。一开始你的许多点都是等距的(例如(2,3)和(2,1)距离(2,2)相同的距离),你也需要定义一个起点。我不认为matlab有内置任何东西 - 你需要以艰难的方式去做,并决定如何处理等距点 – mathematician1975 2012-07-24 13:46:30