【问题标题】:Angle between vector and list of vectors in RR中向量与向量列表之间的角度
【发布时间】:2019-06-06 08:44:51
【问题描述】:

在比较两个向量时,计算它们之间的角度很简单,但在 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 是一个矩阵。

【问题讨论】:

  • B 是列表还是矩阵?我想是一个列表。
  • 技术上是一个列表,但我的 R 不是很好,所以它的类型为“矩阵”
  • B=list(c(1,3), c(-2,4), c(-3,-3), c(1,-4)) ?
  • 我添加了一个解释如何创建 B 的编辑来回答这个问题
  • 您应该添加一个数字示例,在其中显示两个输入和预期输出,这将有助于回答。

标签: r trigonometry


【解决方案1】:

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

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

因此,角度最小的行将由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)))

【讨论】:

    【解决方案2】:

    您没有详细描述 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
    

    解决方案 1apply()

    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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多