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

时间:2013-08-20 14:02:24

标签: 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.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

我正在努力想出一种生成矩阵的方法,而不仅仅是循环使用Points_a和Points_b并计算每个组合,有人能提出更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:4)

您可以使用:

outer(seq(nrow(Points_a)),
      seq(nrow(Points_b)),
      Vectorize(function(i, j) distCosine(Points_a[i,], Points_b[j,]))
      )

(根据@CarlWitthoft提示)

根据您发布的所需输出,您可能需要转置t(),或者只需将_a替换为_b以上。

编辑:一些解释:

  • seq(nrow(Points_x)):创建一个从1到Points_x行数的序列;
  • distCosine(Points_a[i,], Points_b[j,]):用于计算iPoints_ajPoints_b给出的点之间距离的表达式;
  • function(i, j):在上面的两个参数中使用了一个未命名的函数;
  • Vectorize(...):确保在长度大于1的输入ij的情况下,上面的未命名函数仅对向量(see this for more info)的每个元素调用一次;
  • outer(x, y, f):创建“展开的”向量xy,以便显示其元素的所有组合,并使用此输入调用f(请参阅上面的链接) 。然后将结果重新组合成一个漂亮的矩阵。