繁体   English   中英

矢量与R中的矢量列表之间的角度

[英]Angle between vector and list of vectors in R

当比较两个矢量时,计算它们之间的角度很简单,但是在R中,有效地计算矢量和矢量矩阵之间的角度明显更困难。

假设您有2D矢量A =(2,0),然后矩阵B = {(1,3),( - 2,4),( - 3,-3),(1,-4)}。 我有兴趣计算A和B中矢量之间的最小角度。如果我尝试使用

min(acos( sum(a%*%b) / ( sqrt(sum(a %*% a)) * sqrt(sum(b %*% b)) ) ))

它失败了,因为它们是不一致的参数。

有没有类似上面的代码可以处理向量和矩阵?

注意:存在被标记为重复的风险,在这种情况下,在多个来源中找到的解决方案不适用

编辑:原因是我有一个大的矩阵X ,而A只是这一行的一行。 我仅根据每个矢量的角度减少元素的数量。 B的第一个元素是X的第一个元素,然后如果B任何元素与下一个元素X[,2] (此处为A )之间的角度大于某个容差,则将其添加到列表B 我只是使用B<-rbind(B,X[,2])来做这个,所以这导致B是一个矩阵。

您没有详细描述A和B的格式,因此我假设它们是行的矩阵。

(A <- c(2, 0))
# [1] 2 0

(B <- rbind(c(1,3), c(-2,4), c(-3,-3), c(1,-4)))
#      [,1] [,2]
# [1,]    1    3
# [2,]   -2    4
# [3,]   -3   -3
# [4,]    1   -4

使用apply() 解决方案1

apply(B, 1, FUN = function(x){
  acos(sum(x*A) / (sqrt(sum(x*x)) * sqrt(sum(A*A))))
})

# [1] 1.249046 2.034444 2.356194 1.325818

溶液2 sweep()替换sum()上面rowSums()

sweep(B, 2, A, FUN = function(x, y){
  acos(rowSums(x*y) / (sqrt(rowSums(x*x)) * sqrt(rowSums(y*y))))
})

# [1] 1.249046 2.034444 2.356194 1.325818

解决方案3split()mapply

mapply(function(x, y){
  acos(sum(x*y) / (sqrt(sum(x*x)) * sqrt(sum(y*y))))
}, split(B, row(B)), list(A))

#        1        2        3        4 
# 1.249046 2.034444 2.356194 1.325818 

B行与矢量A之间的点积矢量为B %*% A B行的向量长度是sqrt(rowSums(B^2))

要找到最小的角度,您需要最大的余弦,但实际上并不需要计算角度,因此A的长度无关紧要。

因此,具有最小角度的row <- which.max((B %*% A)/sqrt(rowSums(B^2)))将由row <- which.max((B %*% A)/sqrt(rowSums(B^2))) 根据Darren的数据,这是第1行。

如果确实需要最小角度,则可以将两个向量的公式应用于B[row,]A 如果你需要所有的角度,那么公式就是

acos((B %*% A)/sqrt(rowSums(B^2))/sqrt(sum(A^2)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM