2

我正在尝试获取一个包含两个列表中点之间距离的矩阵。

点的向量包含纬度和经度,可以使用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 并计算每个组合,有人可以提出更优雅的解决方案吗?

4

1 回答 1

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))Points_x: 创建一个从 1 到;的行数的序列
  • distCosine(Points_a[i,], Points_b[j,])i: 计​​算由 row ofPoints_a和 row jof给出的点之间距离的表达式Points_b
  • function(i, j):使上面的两个参数成为一个未命名的函数;
  • Vectorize(...):确保给定输入ij长度大于一,上述未命名函数仅对向量的每个元素调用一次(有关更多信息,请参阅此)
  • outer(x, y, f): 创建“扩展”向量xy使其元素的所有组合都存在,并f使用此输入进行调用(参见上面的链接)。然后将结果重新组合成一个很好的矩阵。
于 2013-08-20T14:49:04.730 回答