jt2.4.6:
これはかなり簡単であるべきかのように私は感じるが、私は、コードを見つめてきたし、今愚かなことしています。私は2つの入力の3Dベクトルを受け取り、度でそれらの間の角度を返すメソッドを持っています。
方法は以下の通りです:
def CalculateAngleBetweenVector(vector, vector2):
dp = np.dot(vector, vector2)
maga = math.sqrt((vector[0] ** 2) + vector[1] ** 2 + vector[2] ** 2)
magb = math.sqrt((vector2[0] ** 2) + vector2[1] ** 2 + vector2[2] ** 2)
magc = maga * magb
dpmag = dp / magc
angleindeg = ((math.acos(dpmag)) * 180) / math.pi
return angleindeg
現在、私は他のテストのものにしていく二つの同じベクトルを持っていると私は場合は、この方法のエラーを実現しています。二つのベクトルは以下のとおりです。
[ 0.38154065 -0.38688849 -0.83949034]
あちこちの入力のための単位ベクトルをワークアウト、私が使用する方法は次のとおりです。
UnitVector = Vector / np.linalg.norm(Vector)
ただ、包み何かが間違ってここにあります。
任意およびすべてのヘルプははるかに高く評価されます。
感謝
編集:
申し訳ありませんに行くベクトルは、私はちょうど、端末印刷行をコピーし、実際に(0.38154065、-0.38688849、-0.83949034)です。エラーは、数学ドメインエラーです。
EDIT2:
Error traceback:
Traceback (most recent call last):
File "file path info that contains personal info Documents/com~apple~CloudDocs/WORK/Code1/CompareAnglesBetweenProteinAndMembane.py", line 261, in <module>
angle = CalculateAngleBetweenVector(ProteinRotatedUV, MemRotatedUV)
File "file path info that contains personal info Documents/com~apple~CloudDocs/WORK/Code1/CompareAnglesBetweenProteinAndMembane.py", line 167, in CalculateAngleBetweenVector
angleindeg = ((math.acos(dpmag)) * 180) / math.pi
ValueError: math domain error
Lesiak:
コメント欄で論じたように、問題は(の引数を浮動小数点算術演算で丸め誤差に起因acos
範囲外わずかに)。
私は、次の変更を検討します:
- 単純な計算式を使用します
angle = acos(dot(A,B) / (|A|* |B|))
ARCCOSへの引数はわずか1.0以上または-1.0未満の場合、それを丸めます。引数が範囲内にある場合は、それをする必要はありません。
計算はより数値的に安定である - ベクトルは近い[0,0,0]にしている、または非常に大きなエントリを持っている場合、正規化は唯一のに役立ちます。どちらも、あなたのアプリに該当する場合、正規化を削除することを検討。