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

时间:2015-11-11 19:45:01

标签: arrays numpy vector orthogonal cross-product

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

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

3 个答案:

答案 0 :(得分:6)

这样做:

## Example of short-term instability of EMA
## (and other indicators mentioned above)
x <- rnorm(100)
tail( EMA(x[90:100],10), 1 )
tail( EMA(x[70:100],10), 1 )
tail( EMA(x[50:100],10), 1 )
tail( EMA(x[30:100],10), 1 )
tail( EMA(x[10:100],10), 1 )
tail( EMA(x[ 1:100],10), 1 )

获得第一个:

>>> k  # an arbitrary unit vector
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

答案 1 :(得分:3)

Sry,不能把它作为缺乏声誉的评论b / c。

关于@ behzad.nouri的回答,请注意,如果k不是单位向量,则代码将不再给出正交向量!

这样做的正确和一般方法是减去随机向量的纵向部分。通用的公式是 here

所以你只需要在原始代码中替换它:

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

答案 2 :(得分:0)

假设支持正交基的向量是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]