从距离矩阵计算(x,y)坐标

2024-04-28 04:35:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我在计算距离矩阵D的坐标时遇到问题:

D :   R   D4    D6
R   [[0.  234.  150.]
D4  [234.   0.  231.]
D6  [150. 231.   0.]]

我的python代码如下所示:

import numpy
from numpy import linalg as LA
import matplotlib.pyplot as plt
import math 

def calc_points_and_plot():
    distance_matric = numpy.zeros((3, 3))

    weight_router_to_dongle_04 =  234
    weight_router_to_dongle_06 =  150
    weight_dongle_04_to_dongle_06 =  231

    distance_matric[0][1] = weight_router_to_dongle_04
    distance_matric[0][2] = weight_router_to_dongle_06
    distance_matric[1][0] = weight_router_to_dongle_04
    distance_matric[1][2] = weight_dongle_04_to_dongle_06
    distance_matric[2][0] = weight_router_to_dongle_06
    distance_matric[2][1] = weight_dongle_04_to_dongle_06

    print(f"dist matric \n {distance_matric}")
    m_matrix = numpy.zeros((3, 3))
    for i in range(3):
        for j in range(3):
            m_matrix[i][j] = 0.5 * ((distance_matric[1][j]**2) + (distance_matric[i][1]**2) -(distance_matric[i][j]**2))

    print(f"m_matrix \n {m_matrix}")
    eigvals, eigvecs = LA.eig(m_matrix)
    print(f"eigen vals  : \n {eigvals}")
    print(f"eigen vectors  : \n {eigvecs}")

    results = []
    for i in range(3):
        if eigvals[i] != 0:
            results.append(math.sqrt(eigvals[i])*eigvecs[i])

    print(f"results \n {results}")
    coords = numpy.reshape(results, (2,3)).T

    print(coords)
    X_vals = [coords[i][0] for i in range(3)]
    Y_vals = [coords[i][1] for i in range(3)]

    plt.annotate(f"Roouter",  xy=(X_vals[0], Y_vals[0]))
    plt.annotate(f"device 4", xy=(X_vals[1], Y_vals[1]))
    plt.annotate(f"device 6", xy=(X_vals[2], Y_vals[2]))

    plt.scatter(X_vals , Y_vals, s=230, c="black", marker="D")
    plt.scatter(X_vals , Y_vals, s=180, c="red", marker="D" )
    plt.plot([X_vals[0], X_vals[1]], [Y_vals[0], Y_vals[1]], c="red", linewidth=1, linestyle='--')
    plt.plot([X_vals[0], X_vals[2]], [Y_vals[0], Y_vals[2]], c="red", linewidth=1, linestyle='--')
    plt.plot([X_vals[1], X_vals[2]], [Y_vals[1], Y_vals[2]], c="red", linewidth=1, linestyle='--')

    # Verify distances to given distance matrix
    dist1 = math.sqrt((X_vals[0]-X_vals[1])**2 + (Y_vals[0]- Y_vals[1])**2)
    dist2 = math.sqrt((X_vals[0]-X_vals[2])**2 + (Y_vals[0]- Y_vals[2])**2)
    dist3 = math.sqrt((X_vals[1]-X_vals[2])**2 + (Y_vals[1]- Y_vals[2])**2)

    print(f"dist1 : {dist1}" )
    print(f"dist2 : {dist2}" )
    print(f"dist3 : {dist3}" )
    plt.show()


if __name__ == "__main__":

    calc_points_and_plot()

以下图片是实际输出和预期的Actual outputExpected output

我遵循了这个链接finding-the-coordinates-of-points-from-distance-matrix,但仍然没有获得正确的(x,y)点

  • 从实际输出来看,从路由器到设备4的距离为440点到点的距离,即使给定的距离矩阵中另有说明

Tags: toinnumpyforplotpltmathmatrix