python - 如果向量相同,计算两个向量之间的角度的方法会引发错误?

标签 python numpy math vector angle

我觉得这应该是相当简单的,但我一直盯着代码,现在很愚蠢。我有一个方法,它接受两个输入 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 的参数稍微超出范围)。

我会考虑以下更改:

  1. 使用更简单的公式
angle = acos(dot(A,B) / (|A|* |B|))
  • 如果 arccos 的参数略高于 1.0 或低于 -1.0,则将其舍入。如果参数在范围内,则不需要这样做。

  • 归一化仅在向量接近 [0,0,0] 或具有非常大的条目时才有帮助 - 计算在数值上更加稳定。如果您的应用中的情况并非如此,请考虑删除标准化。

  • 关于python - 如果向量相同,计算两个向量之间的角度的方法会引发错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60485295/

    相关文章:

    可以根据变量的特定总和计算变量值的算法

    python-3.x - 使用 python-opencv 多线程时是否释放了 GIL?

    python - numpy.fft.fft 中参数 n 的影响是什么

    algorithm - 判断A点是否需要拐角才能到达B点

    math - 通过 3 点相关性对齐点云?

    python - 使用数组掩码更改像素值

    python - Matplotlib:在 python 中旋转图形(补丁)并应用颜色

    Python:读取PostgreSQL表的关系(外键表)

    python - 如何在 tensorflow 中控制 LSTM 单元的输出大小

    python - 如何使用蛮力匹配/SIFT描述符获取匹配点的位置