我'试图将R中两个向量之间的角度中两个向量之间角度的计算推广到寻找矩阵X的所有列之间或X和另一个矩阵Y的列之间的角度的情况。
我的下面的尝试失败了,但我不明白为什么
len <- function(X) {
if (!is.numeric(X)) stop("X must be numeric")
if (is.vector(X)) X <- matrix(X, ncol=1)
sqrt(colSums(X^2))
}
angle <- function(x, y, degree = TRUE) {
if(missing(y)) y <- x
if(is.vector(x) && is.atomic(x)) {
theta <- acos(x %*% y / (len(x) * len(y)))
}
else {
theta <- acos(t(x) %*% y / outer(len(x), len(y)))
}
if(degree) theta <- r2d(theta)
theta
}
这些似乎有效:
> x <- c(-2,1)
> y <- c(1,1)
> angle(x, y) # degrees
[,1]
[1,] 108.4349
> angle(x, y, degree = FALSE) # radians
[,1]
[1,] 1.892547
> angle(x) # for one arg case
[,1]
[1,] 1.207418e-06
这些失败或错误:
X <- matrix(
c(1, 0, 1, 1, -2, 1),
ncol = 2,
byrow = TRUE)
Y <- matrix(
c(1, 1, -1, -1, 0, 0),
ncol = 2,
byrow = TRUE)
angle(X, Y)
angle(X)
您可以尝试如下
outer
+ Vectorize
outer(
asplit(X, 2),
asplit(Y, 2),
Vectorize(\(x, y) angle(c(x), c(y)))
)