繁体   English   中英

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

[英]Distances between two lists of position vectors

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

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

您可以使用此:

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的行数的Points_x
  • distCosine(Points_a[i,], Points_b[j,]) :用于计算由Points_a的第i行和Points_aj行给出的点之间的距离的Points_b
  • function(i, j) :通过两个参数使上述内容成为未命名的函数;
  • Vectorize(...) :确保在给定输入ij长度大于1的情况下,对向量的每个元素仅调用一次上述未命名函数(有关更多信息,请参见此信息)
  • outer(x, y, f) :创建“展开的”向量xy ,以使其元素的所有组合都存在,并使用此输入调用f (请参见上面的链接)。 然后将结果重新组合成一个漂亮的矩阵。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM