R:计算大距离矩阵的更快方法
R: Faster way of computing large distance matrix
我正在计算球体上大量位置 (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])))
执行该程序所花费的时间很长。关于如何减少完成这项工作的时间消耗的任何建议!谢谢。
试试geosphere
包中的内置函数?
z <- distm( xy1 )
distm()
的默认距离函数(计算一组点之间的距离矩阵)是 Haversine ("distHaversine"
) 公式,但您可以使用 [=14= 指定另一个公式] 参数。
在我的 2.6GHz Core i7 rMBP 上,这需要大约 5 秒才能获得 5,000 个点。
我在下面添加了一个使用 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
我正在计算球体上大量位置 (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])))
执行该程序所花费的时间很长。关于如何减少完成这项工作的时间消耗的任何建议!谢谢。
试试geosphere
包中的内置函数?
z <- distm( xy1 )
distm()
的默认距离函数(计算一组点之间的距离矩阵)是 Haversine ("distHaversine"
) 公式,但您可以使用 [=14= 指定另一个公式] 参数。
在我的 2.6GHz Core i7 rMBP 上,这需要大约 5 秒才能获得 5,000 个点。
我在下面添加了一个使用 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