Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:计算大距离矩阵的更快方法_R_Geosphere - Fatal编程技术网

R:计算大距离矩阵的更快方法

R:计算大距离矩阵的更快方法,r,geosphere,R,Geosphere,我正在计算球体上大量位置(5000)之间的距离矩阵(使用哈弗森距离函数) 这是我的密码: 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]))) 执行此程序所需的时间很长。任何关于如何减少做这项工作的时间

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

这是我的密码:

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 )

z是否尝试
geosphere
软件包中的内置功能

z <- distm( xy1 )

z我在下面添加了一个使用spatialrisk包的解决方案。这个包中的关键功能是用C++编写的,因此非常快。
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 
库(geosphere)
图书馆(空间风险)
库(数据表)
x=rnorm(5000)
y=rnorm(5000)
xy1=数据表(x,y)
#交叉连接两个数据表

坐标_dt我在下面添加了一个使用空间风险包的解决方案。这个包中的关键功能是用C++编写的,因此非常快。
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 
库(geosphere)
图书馆(空间风险)
库(数据表)
x=rnorm(5000)
y=rnorm(5000)
xy1=数据表(x,y)
#交叉连接两个数据表

您可以尝试另一种实现方式。看到@Leo的时候,我没有冒犯的意思,但是我必须指出链接的文章很糟糕!作者使用
for
循环遍历向量,以重复调用已向量化的函数(
distHaversine()
)!!他们编写了更多的代码,同时也将执行速度降低了约300倍!!!不要理会这篇文章!一次调用一个函数就可以了,但你不能调用10000次!你好@SimonO'Hanlon,谢谢你的提醒。:-)您可以尝试另一种实现。看到@Leo的时候,我没有冒犯的意思,但是我必须指出链接的文章很糟糕!作者使用
for
循环遍历向量,以重复调用已向量化的函数(
distHaversine()
)!!他们编写了更多的代码,同时也将执行速度降低了约300倍!!!不要理会这篇文章!一次调用一个函数就可以了,但你不能调用10000次!你好@SimonO'Hanlon,谢谢你的提醒。:-)谢谢你的建议。这个执行比我的代码花费的时间少了一半。谢谢你的建议。这个执行比我的代码花费的时间少了一半。