【问题标题】:Distances between two lists of position vectors两个位置向量列表之间的距离
【发布时间】:2013-08-22 14:58:15
【问题描述】:

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

点的向量包含经纬度,任意两点之间的距离可以使用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 并计算每个组合,任何人都可以提出一个更优雅的解决方案吗?

【问题讨论】:

  • Vectorize(distCosine...) 怎么样?
  • @CarlWitthoft 感谢您的建议。您介意更详细地解释一下如何在这里使用 Vectorize 吗?

标签: r matrix distance


【解决方案1】:

你可以用这个:

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,]):计算由Points_ai 行和Points_bj 行给出的点之间距离的表达式;
  • function(i, j):在两个参数中使上述函数成为一个未命名的函数;
  • Vectorize(...):确保在给定长度大于 1 的输入 ij 的情况下,对于向量 (see this for more info) 的每个元素,上述未命名函数仅调用一次;
  • outer(x, y, f):创建“扩展”向量xy,使其元素的所有组合都存在,并使用此输入调用f(参见上面的链接)。然后将结果重新组合成一个漂亮的矩阵。

【讨论】:

  • @FerdinandKraft 感谢您实施 CarlWitthoft 的提示。您介意解释一下代码的不同部分吗?
  • 非常好。我本来打算建议像sapply(1:4,function(x) sapply(1:3,function(y)distCosine(Points_a[y,],Points_b[x,]))) 这样的东西,但这很笨拙。
猜你喜欢
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多