R 两个位置向量列表之间的距离
我试图得到一个矩阵,其中包含两个列表中点之间的距离 点的矢量包含纬度和经度,可以使用geosphere包中的函数distCosine计算任意两点之间的距离R 两个位置向量列表之间的距离,r,matrix,distance,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.482
> 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
我正在努力想一种方法来生成矩阵,而不只是在点a和点b上循环并计算每个组合,有人能提出一个更优雅的解决方案吗 您可以使用:
outer(seq(nrow(Points_a)),
seq(nrow(Points_b)),
Vectorize(function(i, j) distCosine(Points_a[i,], Points_b[j,]))
)
(根据@CarlWitthoft提供的提示)
根据您发布的所需输出,您可能需要此文件的转置t()
,或者简单地用上面的\u b
替换\u a
编辑:一些解释:
:创建从1到seq(nrow(Points_x))
Points_x的行数的序列李>
:计算点a的行distCosine(点a[i,],点b[j,])
和点b的行i
之间距离的表达式李>j
:在两个参数中使上述函数成为未命名函数李>函数(i,j)
:确保给定长度大于1的输入Vectorize(…)
和i
,对于向量的每个元素,上述未命名函数只调用一次李>j
:创建“扩展”向量outer(x,y,f)
和x
,以使其元素的所有组合都存在,并使用此输入调用y
(参见上面的链接)。然后将结果重新组合成一个漂亮的矩阵f
outer(seq(nrow(Points_a)),
seq(nrow(Points_b)),
Vectorize(function(i, j) distCosine(Points_a[i,], Points_b[j,]))
)
(根据@CarlWitthoft提供的提示)
根据您发布的所需输出,您可能需要此文件的转置t()
,或者简单地用上面的\u b
替换\u a
编辑:一些解释:
:创建从1到seq(nrow(Points_x))
Points_x的行数的序列李>
:计算点a的行distCosine(点a[i,],点b[j,])
和点b的行i
之间距离的表达式李>j
:在两个参数中使上述函数成为未命名函数李>函数(i,j)
:确保给定长度大于1的输入Vectorize(…)
和i
,对于向量的每个元素,上述未命名函数只调用一次李>j
:创建“扩展”向量outer(x,y,f)
和x
,以使其元素的所有组合都存在,并使用此输入调用y
(参见上面的链接)。然后将结果重新组合成一个漂亮的矩阵f
Vectorize(distCosine…
?@CarlWitthoft谢谢您的建议。你介意更详细地解释一下矢量化在这里是如何使用的吗?@FerdinandKraft感谢CarlWitthoft提供的提示。你介意解释一下代码的不同部分吗?很好。我想建议一些类似于sappy(1:4,函数(x)sappy(1:3,函数(y)二余弦(点a[y,],点b[x,])的东西。
,但这太笨拙了。@FerdinandKraft感谢CarlWitthoft提供的提示。你介意解释一下代码的不同部分吗?很好。我想建议一些类似于sapply(1:4,函数(x)sapply(1:3,函数(y)远余弦(点a[y,],点b[x,]))
。