两个几乎相同的向量之间的角度
Angle between two nearly identical vectors
我发现使用
angle <- (acos(sum(a*b) / (sqrt(sum(a * a)) * sqrt(sum(b * b)))))
是在 R 中获取两个向量 a
和 b
之间角度的最常用方法。
不幸的是,我总是在某些似乎彼此重叠或彼此之间有大约 180 度角的向量上出错。
例如:
a <- c(-7.6942088429381328e-01, 2.4999999999999989e-01)
b <- c(-5.4146791834239578e+08, 1.7593359143824694e+08)
不工作。
我在使用其他计算角度的方法时遇到了类似的问题。
我会使用向量运算。
让我们定义一个适当的函数 angle
以两个向量 x1
和 x2
作为参数
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
我发现使用
angle <- (acos(sum(a*b) / (sqrt(sum(a * a)) * sqrt(sum(b * b)))))
是在 R 中获取两个向量 a
和 b
之间角度的最常用方法。
不幸的是,我总是在某些似乎彼此重叠或彼此之间有大约 180 度角的向量上出错。
例如:
a <- c(-7.6942088429381328e-01, 2.4999999999999989e-01)
b <- c(-5.4146791834239578e+08, 1.7593359143824694e+08)
不工作。
我在使用其他计算角度的方法时遇到了类似的问题。
我会使用向量运算。
让我们定义一个适当的函数 angle
以两个向量 x1
和 x2
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