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)))と、それが「表示」されxます1。ただし、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 に答える