由于浮点精度,我在查找并行向量时遇到了一些麻烦。如何确定向量是否与某些容差平行?
我还需要检查具有公差的正交性。
对于向量v1
并v2
检查它们是否正交
abs(scalar_product(v1,v2)/(length(v1)*length(v2))) < epsilon
哪里epsilon
够小。类似地,您可以使用
scalar_product(v1,v2)/(length(v1)*length(v2)) > 1 - epsilon
用于并行性测试和
scalar_product(v1,v2)/(length(v1)*length(v2)) < -1 + epsilon
为反平行。
如果您有 3D 矢量,答案很简单。计算叉积,如果它几乎为零,则您的向量几乎是平行的:http: //mathworld.wolfram.com/ParallelVectors.html
对于 2d 矢量,您可以将它们转换为 3D 矢量,只需添加一个零坐标 (1;2) => (1;2;0), (4; 5.6) => (4; 5.6; 0) 等等
如果点积为零,则两个向量正交或垂直:http:
//mathworld.wolfram.com/CrossProduct.html
-编辑http://mathworld.wolfram.com/Perpendicular.html
如果您正在使用 3D 矢量,则可以使用 toolbelt vg简洁地执行此操作。它是 numpy 之上的一个轻量层,它支持单值和堆叠向量。
import numpy as np
import vg
v1 = np.array([1.0, 2.0, 3.0])
v2 = np.array([-2.0, -4.0, -6.0])
vg.almost_collinear(v1, v2)
# True
我在上一次创业时创建了这个库,它的动机是这样的:在 NumPy 中冗长或不透明的简单想法。