1

假设我有一个向量v2 = c(50,30,10,5),我想计算它v2与自身之间的角度(即角度应该为 0)。我使用以下代码:

norm_vec = function(x) sqrt(sum(x^2))

然后我打电话

acos( as.numeric((v2 %*% v2) / (norm_vec(v2) * norm_vec(v2))) ) 

但是,我收到以下警告消息,而不是 0:

Warning message:
In acos(as.numeric((v2 %*% v2)/(norm_vec(v2) * norm_vec(v2)))) :
  NaNs produced

我检查了 的值,as.numeric((v2 %*% v2) / (norm_vec(v2) * norm_vec(v2)))因为它确实是一个数字 1。我也检查acos(1)了,结果是 0。我的代码有什么问题?谢谢!

4

2 回答 2

3

如果你设置x <- as.numeric((v2 %*% v2) / (norm_vec(v2) * norm_vec(v2))),你会“看到”那x1。不过,x == 1会回来FALSE的。并且x-1会返回一个非常小的正数:2.220446e-16. acos没有为大于 1 的数字定义。

原因是它sqrt(sum(x^2))比真正的平方根略小;真正的平方根是一个无理数(有无限多的数字)。在这种情况下,既然无论如何你都是在乘以norm_vec(v2)自己,为什么不这样做:

acos( as.numeric(v2 %*% v2) / sum(v2^2) )
于 2013-09-14T22:38:01.497 回答
2

请参阅此答案:acos(1) 为某些值返回 NaN,而不是其他值

并使用 pmin 和 pmax: acos(pmin(pmax(as.numeric(v2 %*% v2) / (norm_vec(v2) * norm_vec(v2)),-1.0), 1.0))

[1] 0

于 2013-09-14T22:32:18.563 回答