Построение матрицы Грама точечных произведений, связанных с матрицей расстояний, и ее дальнейшая факторизация, как правило, является отличным методом, который также позволяет вывести размерность реализации координат матрицы расстояний. Однако, если в вашем случае реализация плоская (двумерная), то я думаю, что (возможно) проще (и, возможно, быстрее) просто подойти к ней немного более геометрически (опять же, вы должны быть уверены, что матрица расстояний предназначена для точек в 2D):
import numpy as np
import math
def x_coord_of_point(D, j):
return ( D[0,j]**2 + D[0,1]**2 - D[1,j]**2 ) / ( 2*D[0,1] )
def coords_of_point(D, j):
x = x_coord_of_point(D, j)
return np.array([x, math.sqrt( D[0,j]**2 - x**2 )])
def calculate_positions(D):
(m, n) = D.shape
P = np.zeros( (n, 2) )
tr = ( min(min(D[2,0:2]), min(D[2,3:n])) / 2)**2
P[1,0] = D[0,1]
P[2,:] = coords_of_point(D, 2)
for j in range(3,n):
P[j,:] = coords_of_point(D, j)
if abs( np.dot(P[j,:] - P[2,:], P[j,:] - P[2,:]) - D[2,j]**2 ) > tr:
P[j,1] = - P[j,1]
return P
sqrt_result = 2*math.sqrt(2)
D = np.array([[0, 2, 2, sqrt_result],
[2, 0, sqrt_result, 2],
[2, sqrt_result, 0, 2],
[sqrt_result, 2, 2, 0]])
P = calculate_positions(D)
print(P)
Вы можете добавить некоторые проверки и улучшения, чтобы убедиться, что векторы P [1 ,:] и P [2 ,:] не выровнены, что эквивалентно проверка того, что
abs( P[1,0]*P[2,1] - P[1,1]*P[2,0] ) < 0.0001 (or some more appropriate threshold)
Если они есть, просто выполните while l oop, пока не найдете первый вектор P[j0, :]
, который не выровнен с P[1,0]
. Роль этого первого вектора P[j0,:]
, не выровненного с начальным вектором P[1,:]
, позволяет вам иметь полезное предложение if
в function vector(D)
. Я не включил его, чтобы не затруднить понимание кода.