1

我正在计算球体上大量位置(5000)之间的距离矩阵(使用Haversine距离函数)。

这是我的代码:

require(geosphere)
x=rnorm(5000)
y=rnorm(5000)
xy1=cbind(x,y)

计算距离矩阵的时间为

 system.time( outer(1:nrow(xy1), 1:nrow(xy1), function(i,j) distHaversine(xy1[i,1:2],xy1[j,1:2])))

执行此程序所需的时间很长。任何建议如何降低完成这项工作的时间!谢谢。

4

2 回答 2

3

试试包中的内置功能geosphere

z <- distm( xy1 )

默认距离函数distm()- 计算一组点之间的距离矩阵 - 是 Haversine ( "distHaversine") 公式,但您可以使用fun参数指定另一个。

在我的 2.6GHz Core i7 rMBP 上,这需要大约 5 秒才能获得 5,000 分。

于 2016-05-24T07:42:57.820 回答
1

我在下面添加了一个使用 spatialrisk 包的解决方案。此包中的关键函数是用 C++ (Rcpp) 编写的,因此速度非常快。

library(geosphere)
library(spatialrisk)
library(data.table)

x=rnorm(5000)
y=rnorm(5000)
xy1 = data.table(x,y)

# Cross join two data tables
coordinates_dt <- optiRum::CJ.dt(xy1, xy1)

system.time({
  z <- distm( xy1 )
})
# user  system elapsed 
# 14.163   3.700  19.072 

system.time({
  distances_m <- coordinates_dt[, dist_m := spatialrisk::haversine(y, x, i.y, i.x)]
})
# user  system elapsed 
# 2.027   0.848   2.913 
于 2019-11-11T11:27:28.353 回答