[英]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_a
第j
行给出的点之间的距离的Points_b
; function(i, j)
:通过两个参数使上述内容成为未命名的函数; Vectorize(...)
:确保在给定输入i
和j
长度大于1的情况下,对向量的每个元素仅调用一次上述未命名函数(有关更多信息,请参见此信息) ; outer(x, y, f)
:创建“展开的”向量x
和y
,以使其元素的所有组合都存在,并使用此输入调用f
(请参见上面的链接)。 然后将结果重新组合成一个漂亮的矩阵。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.