假设我有一组互相垂直的向量$a_1,...,a_d$。现在,我想要找到另一个向量$a_{d+1}$,使其与所有其他向量都正交。
是否有有效算法来实现这一点?我只能想到添加一个随机向量到末尾,然后应用 Graham-Schmidt 方法。
是否有Python库已经实现了这个功能?
是否有有效算法来实现这一点?我只能想到添加一个随机向量到末尾,然后应用 Graham-Schmidt 方法。
是否有Python库已经实现了这个功能?
numpy.linalg
可以完成所有繁重的工作,因此可能比手动执行 Gram-Schmidt 更快且更稳健。此外,这里表明复杂度不会比Gram-Schmidt更糟糕。O
中的列。O
。通常O
仍然是完全秩矩阵。b=[0,0,...,0,1]
,其中len(b)=d+1
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")
x
。特别地,x
不为零。因此,x 对应于您术语中的 a_{d+1}。顺便说一句,np.dot(O.T, O) = I
意味着向量是正交的。正交向量将导致对角矩阵。 - hilberts_drinking_problem