Я хотел бы сопоставить точки в трехмерном пространстве.
Поэтому я использую венгерский метод, описанный в этом вопросе: лучшие совпадающие попарные точки из 2 векторов
Вот мой пример с использованием R:
# packages
library(rgl)
library(clue)
library(plyr)
library(fields)
set.seed(1)
a <- c(rep(2,7), 3,4,5,6,3,4,5,6,7,7,7,7,7,7) # x values
b <- c(rep(3,7),3,3,3,3, 3,3,3,3,3,3,3,3,3,3) # y values
c <- c(seq(1,7),1,1,1,1,7,7,7,7,1,2,3,4,5,6) # z values
# transform the points
set.seed(2)
a1 <- a + seq(1,length(a))
b1 <- b + 8
c1 <- c + 9
# plot the data
plot3d(a,b,c, col="red", pch=16,size=10)
plot3d(a1,b1,c1, lwd=10, col="blue", pch=16,size=10, add=TRUE)
# run the Hungarian Method
A <- cbind(a,b,c)
B <- cbind(a1,b1,c1)
distances <- rdist(A,B) # calculate Euclidean Distance between points
min.dist <- solve_LSAP(distances) # minimizing the sum of distance
min.dist.num <- as.numeric(min.dist)
# plot the minimized lines between point sets
for (ii in 1:dim(B)[1]){
D <- c(A[ii,1], B[min.dist.num[ii],1])
R <- c(A[ii,2], B[min.dist.num[ii],2])
W <- c(A[ii,3], B[min.dist.num[ii],3])
segments3d(D,R,W,col=2,lwd=1)
}
# calculate the share of points that is matched correctly
sum(1:dim(B)[1]==min.dist.num)/dim(B)[1]* 100
Проблема здесь в том, что только 5% точек совпадают правильно (см. последнюю строку кода). На мой взгляд, главная беда в том, что алгоритм не учитывает структуру объекта (квадрата).
Вопрос: есть ли какой-либо метод, который лучше работает с этими примерами данных?
В моих исходных данных размерная структура точек намного сложнее. У меня есть облако данных, и в этом облаке есть несколько субфигур.
Я ищу в первую очередь решение в R, но другие реализации (например, MATLAB, Excel, Java) также приветствуются.
optmatch
и связанные с ним документы Пола Розенбаума и соавторов. Этот метод пытается минимизировать общую функцию сетевого расстояния. - person lmo   schedule 18.11.2016