将函数应用于行 R 的每个组合

apply function to every combination of rows R

假设我有一个 1802 x 2 坐标矩阵 (longitude/latitude) coord 每一行代表 space.

中的一个点
   [,1]     [,2]
[1,] -90.0   -5
[2,] -87.5   -5
[3,] -85.0   -5
[4,] -82.5   -5
[5,] -80.0   -5
[6,] -77.5   -5

我使用 geospheredistGeo 函数计算两点 p1 和 p2 之间的测地线距离,即

distGeo(coord[1,],coord[2,])

我想在 coord

中的每个点之间建立一个对称度量矩阵(因此为 1802*2,1802*2)

尝试循环

for (i in 1:nrow(coord)){ 
 for (j in 1:nrow(coord)){
  distGeo(coord[i,],coord[j,])
 }
 }

需要永远(即使使用 doMPI 和分块),据我所知 outer 只能使用长度为 1 的参数。

有什么想法吗?

我没有在 R 中找到解决方案,而是通过 Rcpp 求助于 C++ 循环解决方案,只用了 0.3 秒就达到了 运行。

基本步骤:

1/将lat/lon坐标转换成n个向量(每个点都是一个3d向量)

2/ 创建一个函数,用 C++ 为每个 point_i,j 计算两者的叉积、点积和 atan2(遵循描述的算法 here)。输入是具有每个点 n 向量的 NumericMatrix。结果是一个 NumericMatrix,其中包含每个点之间的角度(以弧度为单位)。

3/使用 Rcpp,您只需从 R 调用函数,瞧!