R 两个位置向量列表之间的距离

R 两个位置向量列表之间的距离,r,matrix,distance,R,Matrix,Distance,我试图得到一个矩阵,其中包含两个列表中点之间的距离 点的矢量包含纬度和经度,可以使用geosphere包中的函数distCosine计算任意两点之间的距离 > Points_a lon lat 1 -77.69271 45.52428 2 -79.60968 43.82496 3 -79.30113 43.72304 > Points_b lon lat 1 -77.67886 45.48214 2 -77.67886 45.482

我试图得到一个矩阵,其中包含两个列表中点之间的距离

点的矢量包含纬度和经度,可以使用geosphere包中的函数distCosine计算任意两点之间的距离

> Points_a
    lon      lat
1 -77.69271 45.52428
2 -79.60968 43.82496
3 -79.30113 43.72304

> Points_b
       lon      lat
1   -77.67886 45.48214
2   -77.67886 45.48214
3   -77.67886 45.48214
4   -79.60874 43.82486
我想得到一个矩阵,它看起来像:

d_11 d_12 d_13
d_21 d_22 d_23
d_31 d_32 d_33
d_41 d_42 d_43
我正在努力想一种方法来生成矩阵,而不只是在点a和点b上循环并计算每个组合,有人能提出一个更优雅的解决方案吗

您可以使用:

outer(seq(nrow(Points_a)),
      seq(nrow(Points_b)),
      Vectorize(function(i, j) distCosine(Points_a[i,], Points_b[j,]))
      )
(根据@CarlWitthoft提供的提示)

根据您发布的所需输出,您可能需要此文件的转置
t()
,或者简单地用上面的
\u b
替换
\u a

编辑:一些解释:

  • seq(nrow(Points_x))
    :创建从1到
    Points_x的行数的序列
    
  • distCosine(点a[i,],点b[j,])
    :计算点a的行
    i
    和点b的行
    j
    之间距离的表达式
  • 函数(i,j)
    :在两个参数中使上述函数成为未命名函数
  • Vectorize(…)
    :确保给定长度大于1的输入
    i
    j
    ,对于向量的每个元素,上述未命名函数只调用一次
  • outer(x,y,f)
    :创建“扩展”向量
    x
    y
    ,以使其元素的所有组合都存在,并使用此输入调用
    f
    (参见上面的链接)。然后将结果重新组合成一个漂亮的矩阵
您可以使用:

outer(seq(nrow(Points_a)),
      seq(nrow(Points_b)),
      Vectorize(function(i, j) distCosine(Points_a[i,], Points_b[j,]))
      )
(根据@CarlWitthoft提供的提示)

根据您发布的所需输出,您可能需要此文件的转置
t()
,或者简单地用上面的
\u b
替换
\u a

编辑:一些解释:

  • seq(nrow(Points_x))
    :创建从1到
    Points_x的行数的序列
    
  • distCosine(点a[i,],点b[j,])
    :计算点a的行
    i
    和点b的行
    j
    之间距离的表达式
  • 函数(i,j)
    :在两个参数中使上述函数成为未命名函数
  • Vectorize(…)
    :确保给定长度大于1的输入
    i
    j
    ,对于向量的每个元素,上述未命名函数只调用一次
  • outer(x,y,f)
    :创建“扩展”向量
    x
    y
    ,以使其元素的所有组合都存在,并使用此输入调用
    f
    (参见上面的链接)。然后将结果重新组合成一个漂亮的矩阵

矢量化(远余弦…)怎么样?@CarlWitthoft感谢您的建议。您是否介意更详细地解释一下如何在这里使用矢量化?关于
Vectorize(distCosine…
?@CarlWitthoft谢谢您的建议。你介意更详细地解释一下矢量化在这里是如何使用的吗?@FerdinandKraft感谢CarlWitthoft提供的提示。你介意解释一下代码的不同部分吗?很好。我想建议一些类似于
sappy(1:4,函数(x)sappy(1:3,函数(y)二余弦(点a[y,],点b[x,])的东西。
,但这太笨拙了。@FerdinandKraft感谢CarlWitthoft提供的提示。你介意解释一下代码的不同部分吗?很好。我想建议一些类似于
sapply(1:4,函数(x)sapply(1:3,函数(y)远余弦(点a[y,],点b[x,]))