我编写了一些代码来实现修改后的 Gram Schmidt 过程。什么时候
我在真实矩阵上测试过,它是正确的。然而,当我测试它时
在复杂的矩阵上,它出错了。
通过逐步检查,我相信我的代码是正确的。所以,
我想知道为什么修改后的 Gram Schmidt 有数字原因
过程在复杂向量上失败。
以下是代码:
import numpy as np
def modifiedGramSchmidt(A):
"""
Gives a orthonormal matrix, using modified Gram Schmidt Procedure
:param A: a matrix of column vectors
:return: a matrix of orthonormal column vectors
"""
# assuming A is a square matrix
dim = A.shape[0]
Q = np.zeros(A.shape, dtype=A.dtype)
for j in range(0, dim):
q = A[:,j]
for i in range(0, j):
rij = np.vdot(q, Q[:,i])
q = q - rij*Q[:,i]
rjj = np.linalg.norm(q, ord=2)
if np.isclose(rjj,0.0):
raise ValueError("invalid input matrix")
else:
Q[:,j] = q/rjj
return Q
以下是测试代码:
import numpy as np
# If testing on random matrices:
# X = np.random.rand(dim,dim)*10 + np.random.rand(dim,dim)*5 *1j
# If testing on some good one
v1 = np.array([1, 0, 1j]).reshape((3,1))
v2 = np.array([-1, 1j, 1]).reshape((3,1))
v3 = np.array([0, -1, 1j+1]).reshape((3,1))
X = np.hstack([v1,v2,v3])
Y = modifiedGramSchmidt(X)
Y3 = np.linalg.qr(X, mode="complete")[0]
if np.isclose(Y3.conj().T.dot(Y3), np.eye(dim, dtype=complex)).all():
print("The QR-complete gives orthonormal vectors")
if np.isclose(Y.conj().T.dot(Y), np.eye(dim, dtype=complex)).all():
print("The Gram Schmidt process is tested against a random matrix")
else:
print("But My modified GS goes wrong!")
print(Y.conj().T.dot(Y))
更新
问题是我在 第一个 参数中实现了一个为内积线性设计的算法
而我认为它在 第二个 参数中是线性的。
谢谢@landogardner
最佳答案
您的问题与 numpy.vdot
如何处理复数有关 - 第一个参数的复共轭用于计算( ref )。因此,您将 rij
计算为 q*.Q[:,i]
而不是 q.Q[:,i]*
。只需交换 args 的顺序:
rij = np.vdot(Q[:,i], q)
这让测试代码为我工作。
关于python - 在 Python 中为复杂向量修改了 Gram Schmidt,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47349233/