gpt4 book ai didi

r - R中向量和向量列表之间的角度

转载 作者:行者123 更新时间:2023-12-04 21:03:03 25 4
gpt4 key购买 nike

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

假设你有一个二维向量 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)) ) ))

它失败了,因为它们是不一致的论点。

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

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

编辑:原因是我有一个大矩阵 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

解决方案 1 apply() :
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

解决方案 3 split()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

关于r - R中向量和向量列表之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54146330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com