生成与特定方向正交的两个正交矢量

Phy*_*ist 4 arrays numpy vector orthogonal cross-product

在numpy中生成两个正交向量a和b的最简单和最有效的方法是什么,使得两个向量的叉积等于另一个单位向量k,这是已知的?

我知道有很多这样的对,只要满足条件axb = k和ab = 0,对我来说无关紧要.

beh*_*uri 9

这样做:

>>> k  # an arbitrary unit vector k is not array. k is must be numpy class. np.array
np.array([ 0.59500984,  0.09655469, -0.79789754])
Run Code Online (Sandbox Code Playgroud)

获得第一个:

>>> x = np.random.randn(3)  # take a random vector
>>> x -= x.dot(k) * k       # make it orthogonal to k
>>> x /= np.linalg.norm(x)  # normalize it
Run Code Online (Sandbox Code Playgroud)

获得第二个:

>>> y = np.cross(k, x)      # cross product with k
Run Code Online (Sandbox Code Playgroud)

并验证:

>>> np.linalg.norm(x), np.linalg.norm(y)
(1.0, 1.0)
>>> np.cross(x, y)          # same as k
array([ 0.59500984,  0.09655469, -0.79789754])
>>> np.dot(x, y)            # and they are orthogonal
-1.3877787807814457e-17
>>> np.dot(x, k)
-1.1102230246251565e-16
>>> np.dot(y, k)
0.0
Run Code Online (Sandbox Code Playgroud)

  • 当 k 是不同的向量时,这不起作用 ``` >>> k = np.array([ 0.0, 0.0215, -1.334]) >>> x = np.random.randn(3) >>> x -= x.dot(k) * k >>> x /= np.linalg.norm(x) >>> np.dot(x, k) 0.38532052441276377 ``` (2认同)

小智 7

抱歉,由于缺乏声望,我不能发表评论。

关于@ behzad.nouri的答案,请注意,如果k不是单位矢量,该代码将不再提供正交矢量!

正确而通用的方法是减去随机向量的纵向部分。通用公式 在这里

因此,您只需要将其替换为原始代码即可:

>>> x -= x.dot(k) * k / np.linalg.norm(k)**2
Run Code Online (Sandbox Code Playgroud)

  • 这种方法被称为[Gram-Schmidt Process](https://www.ucl.ac.uk/~ucahmdl/LessonPlans/Lesson10.pdf) (3认同)