R中向量和向量列表之间的角度
当比较两个向量时,计算它们之间的角度很简单,但在R中,要有效地计算向量和向量矩阵之间的角度明显困难 假设你有一个2D向量a=(2,0),然后是一个矩阵B={(1,3),(-2,4),(-3,-3),(1,-4)}。我感兴趣的是求出A和B中向量之间的最小角度。 如果我尝试使用R中向量和向量列表之间的角度,r,trigonometry,R,Trigonometry,当比较两个向量时,计算它们之间的角度很简单,但在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)) ) )) 它失败了,因为它们是不一致的参数 有没有类似于上面的代码可以处理向量和矩阵 注:尽
min(acos( sum(a%*%b) / ( sqrt(sum(a %*% a)) * sqrt(sum(b %*% b)) ) ))
它失败了,因为它们是不一致的参数
有没有类似于上面的代码可以处理向量和矩阵
注:尽管存在被标记为重复的风险,但在几种情况下发现的解决方案不适用于这种情况
编辑:这是因为我有一个大矩阵
X
,而a
只是其中的一行。我只是根据每个向量的角度来减少元素的数量。B
的第一个元素是X
中的第一个元素,如果B
中的任何元素与下一个元素X[,2]
(此处A
)之间的角度大于某个公差,则会将其添加到列表B
。我只是使用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
解决方案2带有sweep()
:(将上面的sum()
替换为rowSums()
)
解决方案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
B
行与A
行之间的点积向量为B%*%A
。B
行的向量长度为sqrt(行和(B^2))
要找到最小的角度,需要最大的余弦,但实际上不需要计算角度,因此A
的长度无关紧要
因此,角度最小的行将由给出,行是B
表示列表还是矩阵?我想是一个列表。从技术上讲是一个列表,但我的R不是很好,所以它的类型是“矩阵”,如B=list(c(1,3),c(-2,4),c(-3,-3),c(1,-4))
?我添加了一个编辑,解释了B
是如何创建的,它回答了这个问题。您应该添加一个数字示例,其中显示了两个输入和预期的输出,这将有助于回答问题。
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
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
acos((B %*% A)/sqrt(rowSums(B^2))/sqrt(sum(A^2)))