【问题标题】:Angle between two nearly identical vectors两个几乎相同的向量之间的角度
【发布时间】:2019-12-04 09:02:42
【问题描述】:

我发现使用

angle <- (acos(sum(a*b) / (sqrt(sum(a * a)) * sqrt(sum(b * b)))))  

是在 R 中获得两个向量 ab 之间角度的最常用方法。

不幸的是,我不断在某些向量上遇到错误,这些向量似乎彼此重叠或彼此之间的角度约为 180 度。

例如:

a <- c(-7.6942088429381328e-01, 2.4999999999999989e-01)  
b <- c(-5.4146791834239578e+08, 1.7593359143824694e+08)  

不工作。

我在使用其他计算角度的方法时遇到了类似的问题。

【问题讨论】:

    标签: r angle


    【解决方案1】:

    我会使用向量运算。

    让我们定义一个合适的函数angle,它接受两个向量x1x2作为参数

    angle <- function(x1, x2, tol = 1e-6) {
        cost <- as.numeric((x1 %*% x2) / (sqrt(x1 %*% x1) * sqrt(x2 %*% x2)))
        if (abs(cost - 1) < tol) return(0) else return(acos(cost))
    }
    

    请注意,我们会进行数值稳定性检查,以确保对于接近 0 的角度,我们会得到数值结果(而不是 NA)。

    然后计算两个向量之间的角度(以弧度为单位),例如

    x1 <- c(1, 1)
    x2 <- c(0.5, 2)
    

    我们这样做

    angle(x1, x2)
    #[1] 0.5404195
    

    在你的情况下,

    angle(a, b)
    #[1] 0
    

    请注意,这也适用于更高维的向量,例如

    x1 <- c(1, 1, 1)
    x2 <- c(0.5, 2, 0)
    angle(x1, x2)
    #[1] 0.7952027
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 2017-10-03
      • 1970-01-01
      相关资源
      最近更新 更多