我有两组点,称为path
和centers
。对于 中的每个点path
,我想要一种有效的方法来查找中最近点的 ID centers
。我想在 R 中执行此操作。下面是一个简单的可重现示例。
set.seed(1)
n <- 10000
x <- 100*cumprod(1 + rnorm(n, 0.0001, 0.002))
y <- 50*cumprod(1 + rnorm(n, 0.0001, 0.002))
path <- data.frame(cbind(x=x, y=y))
centers <- expand.grid(x=seq(0, 500,by=0.5) + rnorm(1001),
y=seq(0, 500, by=0.2) + rnorm(2501))
centers$id <- seq(nrow(centers))
x
并且y
是坐标。我想向path
data.frame 添加一列,该列具有给定 x 和 y 坐标的最近中心的 id。然后,我想获取所有唯一 ID。
我目前的解决方案确实有效,但是当问题规模增加时会非常慢。我想要更有效的东西。
path$closest.id <- sapply(seq(nrow(path)), function(z){
tmp <- ((centers$x - path[z, 'x'])^2) + ((centers$y - path[z, 'y'])^2)
as.numeric(centers[tmp == min(tmp), 'id'])
})
output <- unique(path$closest.id)
任何有关加快此过程的帮助将不胜感激。
我认为data.table
可能会有所帮助,但理想情况下,我正在寻找的是一种在搜索方面可能更智能的算法,即不是计算到每个中心的距离,然后只选择最小的一个......来获取 id ...
如果这有助于提高性能,我也很乐意使用Rcpp
/ 。Rcpp11
我执行这种计算的最小可接受时间是 10 秒,但显然更快会更好。