在任何维度下生成与一组其他向量正交的向量

4
假设我有一组互相垂直的向量$a_1,...,a_d$。现在,我想要找到另一个向量$a_{d+1}$,使其与所有其他向量都正交。
  1. 是否有有效算法来实现这一点?我只能想到添加一个随机向量到末尾,然后应用 Graham-Schmidt 方法。

  2. 是否有Python库已经实现了这个功能?


2
为什么不能取所有向量的一般维格积?如果它们都在n维空间中,且你有其中的n-1个向量,则可以取它们的叉积来得到最后一个正交向量。 - modesitt
其实这个观点很好,我没有想到。这对于任何类型的向量都适用吗?另外,如果我有“n-2”个向量,但是“n”维度,这也可能吗? - DaveTheAl
取叉积并不是 Gram-Schmidt 做法的一部分。 - user1911226
我知道...Modesitt的观点,然而,对于找到第n个正交向量,只需要有n-1个向量,他的观点很容易成立。 - DaveTheAl
1个回答

3
相关。我无法确定最优解,但这是一个可行的解决方案。好处在于numpy.linalg可以完成所有繁重的工作,因此可能比手动执行 Gram-Schmidt 更快且更稳健。此外,这里表明复杂度不会比Gram-Schmidt更糟糕。
思路如下:
  1. 将正交向量作为矩阵O中的列。
  2. 添加另一列随机的列到O。通常O仍然是完全秩矩阵。
  3. 选择b=[0,0,...,0,1],其中len(b)=d+1
  4. 解决最小二乘问题x O = b。然后x保证非零并且与O的所有原始列正交。
import numpy as np
from numpy.linalg import lstsq
from scipy.linalg import orth

# random matrix
M = np.random.rand(10, 5)

# get 5 orthogonal vectors in 10 dimensions in a matrix form
O = orth(M)


def find_orth(O):
    rand_vec = np.random.rand(O.shape[0], 1)
    A = np.hstack((O, rand_vec))
    b = np.zeros(O.shape[1] + 1)
    b[-1] = 1
    return lstsq(A.T, b)[0]


res = find_orth(O)

if all(np.abs(np.dot(res, col)) < 10e-9 for col in O.T):
    print("Success")
else:
    print("Failure")

非常感谢! :) 但是,我不明白为什么你选择 b 并解出 x?我的意思是,在我们将随机列添加到 O 后,我们不能改变 O,但我们希望满足 np.dot( O.T, O ) = I 这个条件,对吧? - DaveTheAl
我想我可以用更好的措辞。我们暂时“添加”一个随机列。然后,我们解决与所有原始列正交但不是随机列的 x。特别地,x 不为零。因此,x 对应于您术语中的 a_{d+1}。顺便说一句,np.dot(O.T, O) = I 意味着向量是正交的。正交向量将导致对角矩阵。 - hilberts_drinking_problem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接