Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中向量和向量列表之间的角度_R_Trigonometry - Fatal编程技术网

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

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)) ) )) 它失败了,因为它们是不一致的参数 有没有类似于上面的代码可以处理向量和矩阵 注:尽

当比较两个向量时,计算它们之间的角度很简单,但在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你没有详细描述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)))