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

of1yzvn4  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(92)

在numpy中,生成两个正交向量a和B,使得两个向量的叉积等于另一个已知的单位向量k的最简单和最有效的方法是什么?
我知道有无穷多个这样的对,只要满足条件axb=k和a.b=0,得到哪一对我来说并不重要。

erhoui1w

erhoui1w1#

Gram-Schmidt过程将执行此操作。举例来说:

>>> 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])

字符串
获得第一个:

>>> 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


获得第二个:

>>> y = np.cross(k, x)      # cross product with k


并核实:

>>> 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

cclgggtu

cclgggtu2#

对不起,我不能把它作为一个评论,因为缺乏声誉。
关于@behzad.nouri的回答,请注意,如果k不是单位向量,代码将不再给予正交向量!
这样做的正确和一般的方法是减去随机向量的纵向部分。其通式为here
所以你只需要在原始代码中替换它:

>>> x -= x.dot(k) * k / np.linalg.norm(k)**2

字符串

zengzsys

zengzsys3#

假设支持正交基的向量是u。

b1 = np.cross(u, [1, 0, 0])   # [1, 0, 0] can be replaced by other vectors, just get a vector orthogonal to u
b2 = np.cross(u, b1)
b1, b2 = b1 / np.linalg.norm(b1), b2 / np.linalg.norm(b2)

字符串
如果你喜欢的话,我会给你一个简短的答案。
得到一个变换矩阵

B = np.array([b1, b2])
TransB = np.dot(B.T, B)
u2b = TransB.dot(u) # should be like [0, 0, 0]

相关问题