python - 如果向量相同,计算两个向量之间角度的方法会引发错误?
问题描述
我觉得这应该相当简单,但我一直盯着代码,现在很愚蠢。我有一个方法,它接受两个输入 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) 我刚刚复制了终端打印行。该错误是数学域错误。
编辑2:
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
解决方案
正如评论中所讨论的,问题源于浮点算术中的舍入错误(参数acos
略微超出范围)。
我会考虑以下更改:
- 使用更简单的公式
angle = acos(dot(A,B) / (|A|* |B|))
如果 arccos 的参数略高于 1.0 或低于 -1.0,则将其四舍五入。如果参数在范围内,则不需要这样做。
规范化仅在向量接近 [0,0,0] 或具有非常大的条目时才有帮助 - 计算在数值上更稳定。如果您的应用程序都不是这种情况,请考虑删除规范化。
推荐阅读
- python - Tensorflow:有没有办法将元数据保存在 TFRecords 文件中
- mysql - MySQL 8.0:将多边形创建为围绕点的圆
- docker - 无法让 npm 安装的应用程序出现在最终的 Docker 映像中
- java - 带有scanner.nextInt()的线程“主” java.util.NoSuchElementException 中的异常
- python-3.x - 在python中处理两位和四位数字年份的日期
- node.js - 由于 Npm 安装崩溃,无法安装 Scrypt
- javascript - React - 动态添加输入而不改变状态
- swift - 如何在登录时管理访问控制
- ios - 与 UIKit/Swift 重叠的 UIView 和交互性问题
- python-3.x - 为什么当我使用 zip() 时我的 python 会冻结?