Math 从距离矩阵求点的坐标

Math 从距离矩阵求点的坐标,math,geometry,triangulation,Math,Geometry,Triangulation,我有一组点(坐标未知)和距离矩阵。我需要找到这些点的坐标,以便绘制它们并显示我的算法的解决方案 我可以将坐标(0,0)中的一个点设置为simpify,然后找到其他点。有人能告诉我是否有可能找到其他点的坐标吗?如果有,如何找到 提前谢谢 编辑 忘了说我只需要x-y上的坐标步骤1,任意指定一个点P1为(0,0) 步骤2,沿正x轴任意指定一个点P2。(0,Dp1p2) 第3步,找到点P3,以便 Dp1p2 ~= Dp1p3+Dp2p3 Dp1p3 ~= Dp1p2+Dp2p3 Dp2p3 ~= Dp1

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

我可以将坐标(0,0)中的一个点设置为simpify,然后找到其他点。有人能告诉我是否有可能找到其他点的坐标吗?如果有,如何找到

提前谢谢

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

步骤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步还有一个替代方案,但对于周六下午来说,这是一个太多的数学问题

如果对于p、q和r点,矩阵中有pq、qr和rp,那么就有一个三角形

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

不过,我有一些建议。如果数字条目很小,请考虑使用。你可以在退火步骤中加入手性。这对于大型系统来说会很慢,并且可能不会收敛到一个完美的解决方案,但对于某些问题,这是您和您所做的最好的选择


第二个建议不会为您提供完美的解决方案,但它会分散错误:错误。在您的情况下,目标函数将是矩阵中的距离与点之间的实际距离之间的误差。

基于角度的答案很难实现,并且很难推广到更高维度的数据。更好的方法是my和WimC的答案中提到的方法:给定距离矩阵
D(i,j)
,定义

M(i, j) = 0.5*(D(1, j)^2 + D(i, 1)^2 - D(i, j)^2)
它应该是一个半正定矩阵,秩等于可以嵌入点的最小欧几里德维数
k
。然后可以从
M
k
特征向量
v(i)
中获得与非零特征值
q(i)
对应的点坐标:将向量
sqrt(q(i))*v(i)
作为列放置在
nxk
矩阵
x
;然后,
X
的每一行都是一个点。换句话说,
sqrt(q(i))*v(i)
给出所有点的
i
th分量

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


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

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


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

那是。。。需要大量的蛮力…考虑三点(一个三角形)。有两个方向和无限多个旋转,它们将给出相同的距离矩阵。更进一步,我们说的是一维空间,还是两个,还是三个,还是四个。。。。答案在每种情况下都会改变。通过(0,0),我们应该接受它的二维吗?一旦你确定了方向和角度,第三个之后的所有点不是都是明确的吗?(在2D空间中,因为OP给出了2D零。)@KevinReid一般来说,是的。但是,如果前三个点位于一条直线上,您有两个选择(通过在直线上反射彼此获得),直到您选择了不位于该直线上的第一个点。谢谢您的回答。我不知道这是否是最好的方法,因为在一些场景中,我有很多o点,而元启发式并不总是返回最优解,或者在这种情况下,返回可行解。所以我可能会花很多时间在这个问题上,但仍然没有得到一个可行的答案。@DeepYellow:我喜欢你的答案,部分原因是它可能有助于回答一个不同的、更难的问题,这个问题昨天由不同的用户发布。我试图回答另一个问题,但失败了。如果你对这个挑战感兴趣,下面是URL:@thb:谢谢你指出这个问题。我发布了我认为正确的解决方案,让我知道你的想法。@BrunoBruck余弦定律给出了P1P2和P1P3之间的角度(第一个方程)。下一部分是获得P3在P1P2轴上的投影。知道距离P1P3,并将其设置为三角形的斜边,X和Y值分别是斜边的cos和sine倍。你对P2所做的是可以的,但在P3的情况下,我不能选择集合中的一个点,这不是I