【问题标题】:generating two orthogonal vectors that are orthogonal to a particular direction生成与特定方向正交的两个正交向量
【发布时间】:2019-10-09 00:54:54
【问题描述】:

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

我知道有无限多这样的对,只要满足条件 axb=k 和 a.b=0,我得到哪些对并不重要。

【问题讨论】:

  • ab 是形状 (3,)(1d 和 3 个元素)?您将如何“手动”执行此操作?
  • 是的。 a、b 和 k 都是 shape(3,)。我知道怎么用手做。我有 6 个未知数的 5 个方程,这是否意味着没有简单的方法(只有几行),我必须在 scipy 中使用数值方法来解决它?
  • 我在考虑接受答案中的交叉和点积的代数版本。对于小型阵列,这些速度也一样快。

标签: arrays numpy vector orthogonal cross-product


【解决方案1】:

这样就可以了:

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

【讨论】:

  • 这在 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 ```
  • 非常感谢,以及下面的 René Wirnata 回答,即使第一个输入向量不是单位向量。
【解决方案2】:

抱歉,由于缺乏声誉,我无法将其作为评论。

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

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

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

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

【讨论】:

  • 这个方法被称为Gram-Schmidt Process
  • 所以这在两种情况下都有效,不管 k 是不是单位向量,对吧?
  • 嗯,确实如此
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2011-03-09
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多