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

将函数应用于行R的每个组合,r,matrix,combinations,R,Matrix,Combinations,假设我有一个1802×2的坐标矩阵(经度/纬度)coord每行代表一个空间点 [,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 我使用geosphere包distGeo函数计算两点p1和p2之间的测地距离,即 distGeo(coord[1,],coord[2,]) 我想建立一个对称的度量矩阵(1802*21802*2

假设我有一个1802×2的坐标矩阵(经度/纬度)
coord
每行代表一个空间点

   [,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
我使用
geosphere
distGeo
函数计算两点p1和p2之间的测地距离,即

distGeo(coord[1,],coord[2,])
我想建立一个对称的度量矩阵(1802*21802*2),表示
coord

尝试循环作为

for (i in 1:nrow(coord)){ 
 for (j in 1:nrow(coord)){
  distGeo(coord[i,],coord[j,])
 }
 }
需要很长时间(即使使用doMPI和分块),据我所知,
outer
只能处理lenght 1参数


任何想法?

< P>我没有找到R中的解,而是通过RCPP求助于C++循环解,只花费了0.3秒运行。 基本步骤:

1/将纬度/经度坐标转换为n矢量(每个点都是3d矢量)

< P > 2,创建一个函数,计算C++中的两个交叉积、dot乘积和ATAN2(按照算法描述),每个点i,j。输入是一个带有每个点n矢量的数字矩阵。结果是一个数值矩阵,其中包含每个点之间的角度(以弧度为单位)


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

您可能需要
?combn
,即
combn(seq_len(nrow(coord)),2,FUN=函数(x)distGeo(coord[x[1],],coord[x[2],])
谢谢。但它不会将一个元素与自身进行比较(即距离为零,矩阵的对角线),而且它似乎不会以两种方式使用组合(即1-2和2-1)。有没有办法处理这个问题?在这种情况下,使用
expand.grid
outer
正如我所说,outer似乎不接受长度2(经度和纬度)作为参数。我想你可以在
列表中使用它(未测试)