求 R 中矩阵列之间的角度

问题描述 投票:0回答:1

我'试图将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)
r matrix vector matrix-multiplication angle
1个回答
0
投票

您可以尝试如下

outer
+
Vectorize

outer(
    asplit(X, 2),
    asplit(Y, 2),
    Vectorize(\(x, y) angle(c(x), c(y)))
)
© www.soinside.com 2019 - 2024. All rights reserved.