从距离矩阵中寻找点的坐标

时间:2012-06-09 17:26:03

标签: math geometry triangulation

我有一组点(具有未知坐标)和距离矩阵。我需要找到这些点的坐标,以便绘制它们并显示我的算法的解决方案。

我可以在坐标(0,0)中设置其中一个点来简化,并找到其他点。任何人都可以告诉我是否有可能找到其他点的坐标,如果是,怎么做?

提前致谢!

EDIT 忘了说我只需要x-y上的坐标

4 个答案:

答案 0 :(得分:16)

基于角度的答案实施起来很麻烦,并且不能容易地推广到更高维度的数据。更好的方法是我和WimC的答案here中提到的:给定距离矩阵D(i, j),定义

M(i, j) = 0.5*(D(1, j)^2 + D(i, 1)^2 - D(i, j)^2)

应该是一个正半正定矩阵,其等级等于可以嵌入点的最小欧几里得维k。然后,可以从对应于非零特征值k的{​​{1}}的{​​{1}}特征向量v(i)获取点的坐标:将向量M作为列放置在q(i)矩阵中sqrt(q(i))*v(i);那么n x k的每一行都是一个点。换句话说,X给出了所有点的X分量。

矩阵的特征值和特征向量可以在大多数编程语言中轻松获得(例如,在C / C ++中使用GSL,在Matlab中使用内置函数sqrt(q(i))*v(i),在Python中使用Numpy等)

请注意,此特定方法始终将第一个点放在原点,但点的任何旋转,反射或平移也将满足原始距离矩阵。

答案 1 :(得分:4)

步骤1,任意将一个点P1指定为(0,0)。

步骤2,沿正x轴任意分配一个点P2。 (0,Dp1p2)

步骤3,找到点P3,使其

Dp1p2 ~= Dp1p3+Dp2p3
Dp1p3 ~= Dp1p2+Dp2p3
Dp2p3 ~= Dp1p3+Dp1p2

并在“正”y域中设置该点(如果满足任何这些条件,则该点应放在P1P2轴上。)
使用余弦定律来确定距离:

cos (A) = (Dp1p2^2 + Dp1p3^2 - Dp2p3^2)/(2*Dp1p2* Dp1p3)
P3 = (Dp1p3 * cos (A), Dp1p3 * sin(A))

您现在已经成功构建了一个正交空间,并在该空间中放置了三个点。

步骤4:要确定所有其他点,请重复步骤3,为您提供暂定的y坐标。 (Xn,Yn)。
比较矩阵中的距离{(Xn,Yn),(X3,Y3)}和Dp3pn。如果它相同,则表示您已成功识别点n的坐标。否则,点n为(Xn,-Yn)。

请注意,有一个替代步骤4,但是周六下午的数学太多了

答案 2 :(得分:1)

如果点p,q和r在矩阵中有pq,qr和rp,则表示你有一个三角形。

无论矩阵中有三角形,您都可以计算该三角形的两个解之一(与平面上三角形的欧氏变换无关)。也就是说,对于您计算的每个三角形,它的镜像也是满足p,q和r的距离约束的三角形。即使对于三角形存在两种解决方案这一事实也会导致手性问题:您必须选择每个三角形的手征(方向),并非所有选择都可能导致问题的可行解决方案。

尽管如此,我有一些建议。如果数字条目很小,请考虑使用simulated annealing。您可以将手性纳入退火步骤。对于大型系统来说这将是一个缓慢的过程,它可能无法收敛到一个完美的解决方案,但对于某些问题,它是你做得最好的。

第二个建议不会给你一个完美的解决方案,但会分发错误:method of least squares。在您的情况下,目标函数将是矩阵中距离与点之间的实际距离之间的误差。

答案 3 :(得分:1)

这是一个数学问题。导出仅由距离矩阵给出的坐标矩阵X.

然而,有一个有效的解决方案 - 多维缩放,做一些线性代数。简单地说,它需要成对的欧几里德距离矩阵D,输出是估计的坐标Y(可能是旋转的),这是X的近似。出于编程原因,只需在Python中使用SciKit.manifold.MDS。