【问题标题】:Compute euclidean distance with R用 R 计算欧几里得距离
【发布时间】:2016-03-22 03:42:19
【问题描述】:

我有两个坐标和长度不同的数据帧,我正在尝试计算从第一个日期帧的每个点(例如 2 个点)到第二个数据帧的每个点(例如 4 个点)的欧几里得距离:

结果:

point[1] dist1, dist2, dist3, dist4

point[2] dist1, dist2, dist3, dist4

这是我的脚本:

i=1
for (i in dim(coordinates)[1]) {
  result[i]<- 
  sqrt((coordinates[i,1] - reference[,1])^2 + 
  (coordinates[i,2] - reference[,2])^2 + 
  (coordinates[i,3] - reference[,3])^2)
}        

但它只返回到最后一点的距离 (point[2]) 我怎样才能修复脚本??任何帮助都会很棒

提前致谢

【问题讨论】:

    标签: r


    【解决方案1】:

    我总是犯这个错误。 dim 返回单个数字,因此您需要从 1dim 循环 i

    我将您的第二行更改为循环遍历序列 1:dim(coordinates)[1]。

    i=1
    for (i in 1:dim(coordinates)[1]) {
      result<- 
      sqrt((coordinates[i,1] - reference[,1])^2 + 
      (coordinates[i,2] - reference[,2])^2 + 
      (coordinates[i,3] - reference[,3])^2)
    } 
    

    现在您只需要确保您的 result 向量有两个插槽。如果不行,把这个放在开头。

     result <- rep(NA, 1:dim(coordinates)[1])
    

    【讨论】:

    • Jajajaja,谢谢你,非常感谢克里斯,我还没看过。谢谢
    • 是的,我把结果放在最开始,错误在于 1:dim(coordinates)[1]。谢谢克里斯,你帮了我很多
    【解决方案2】:

    可以利用矩阵代数计算没有循环的距离。

    对于两个矩阵 A、B,其中行表示实例,列表示坐标(即,在 3 维中,两个矩阵都有 3 列),平方距离矩阵可以计算为

    d^2(A,B) = ||A-B||^2 = A^2 + B^2 - 2*A*B

    这可以翻译成R,例如,如下:

    d <- sqrt(    matrix(diag(A %*% t(A)), nrow=dim(A)[1], ncol=dim(B)[1])
              + t(matrix(diag(B %*% t(B)), nrow=dim(B)[1], ncol=dim(A)[1]))
              - 2*A %*% t(B) )
    

    生成的距离矩阵对于 A 中的每个实例都有一行,对于 B 中的每个实例都有一列。

    【讨论】:

      猜你喜欢
      • 2021-01-31
      • 1970-01-01
      • 2015-09-23
      • 2018-01-28
      • 2013-04-07
      • 2020-11-29
      • 2018-02-14
      • 2014-11-03
      相关资源
      最近更新 更多