У меня есть набор кривых, определенных как 2D-массивы (количество точек, количество координат). Я рассчитываю для них матрицу расстояний, используя расстояние Хаусдорфа. Мой текущий код выглядит следующим образом. К сожалению, это слишком медленно с 500-600 кривыми, каждая из которых имеет 50-100 3D-точек. Есть ли более быстрый способ для этого?
def distanceBetweenCurves(C1, C2):
D = scipy.spatial.distance.cdist(C1, C2, 'euclidean')
#none symmetric Hausdorff distances
H1 = np.max(np.min(D, axis=1))
H2 = np.max(np.min(D, axis=0))
return (H1 + H2) / 2.
def distanceMatrixOfCurves(Curves):
numC = len(Curves)
D = np.zeros((numC, numC))
for i in range(0, numC-1):
for j in range(i+1, numC):
D[i, j] = D[j, i] = distanceBetweenCurves(Curves[i], Curves[j])
return D
scipy.spatial.distance.cdist
медленная часть или двойная петля внутриdistanceMatrixOfCurves
? Если эти кривые выпуклые, можно было бы оптимизировать первую возможную медленную часть. Пересекаются ли эти кривые или содержатся внутри других? Я чувствую, что вы могли бы повторно использовать ранее найденные расстояния, чтобы ускорить новые вычисления. Конечно, это просто болтовня, у меня есть аналогичная проблема с минимальными (минимальными (..)) мерами, и мне было трудно обобщить эти соображения, которые я здесь излагаю. Вы пробовали или думали о чем-то помимо кода, который вы разместили? - person mmgp   schedule 04.12.2012cdist
— если вы добавите код, который генерирует небольшой пример данных, это будет проще. чтобы помочь вам. - person YXD   schedule 04.12.2012cdist
(просто используйте форму распространения волны), что может потребовать больше памяти, а в худшем случае это не поможет. Это не означает, что это не может помочь в сокращении времени выполнения, но это проблематично. - person mmgp   schedule 04.12.2012D
или можно обойтись только верхней или нижней треугольной матрицей? ЭтотD[i,j] = D[j,i] =...
определенно не годится для локальности данных; 2. Пробовали ли вы использовать сжатие списка илиmap
вместо двойных циклов? - person ev-br   schedule 04.12.2012