这会在方阵上运行Gram-Schmidt算法。 导致问题的行如下
R[j, j] = la.norm(Q[:, j])
a = Q[:,j]
b = a/R[j,j]
Q[:,j] = Q[:,j]/R[j,j]
通过运行这些行,列Q[:,j]
设置为0
而不是正确的值。如果我使用临时变量,则不会发生这种情况。这怎么可能? 完整代码
import numpy as np
import numpy.linalg as la
import matplotlib.pyplot as plt
def mod_gramschmidt(X):
n = X.shape[0]
R = np.zeros((n, n))
Q = X.copy()
for j in range(n):
R[j, j] = la.norm(Q[:, j])
a = Q[:, j]
b = a / R[j, j]
Q[:, j] = Q[:, j] / R[j, j]
A = R[j, (j + 1) :]
B = Q[:, j].T
R[j, (j + 1) :] = Q[:, j].T @ X[:, (j + 1) :]
Q[:, (j + 1) :] = Q[:, (j + 1) :] - Q[:, j] @ R[j, (j + 1) :]
我使用以下输入运行代码:
A = np.array([[1,2,3],[4,5,6],[7,5,4]])
print(mod_gramschmidt(A))
之后
- 删除不必要的
a
、b
、A
和B
变量, - 通过将向量
Q[:, j]
和R[j, (j + 1) :]
重塑为n x 1
和1 x m
矩阵来固定矩阵乘法Q[:, j].reshape((-1,1)) @ R[j, (j + 1) :].reshape((1,-1))
, - 添加
return
语句
呈现的算法读作
import numpy as np
import numpy.linalg as la
import matplotlib.pyplot as plt
def mod_gramschmidt(X):
n = X.shape[0]
R = np.zeros((n, n))
Q = X.copy()
for j in range(n):
R[j, j] = la.norm(Q[:, j])
Q[:, j] = Q[:, j] / R[j, j]
R[j, (j + 1) :] = Q[:, j].T @ X[:, (j + 1) :]
Q[:, (j + 1) :] = Q[:, (j + 1) :] - Q[:, j].reshape((-1,1)) @ R[j, (j + 1) :].reshape((1,-1))
return Q
现在将此算法应用于整数矩阵
A = np.array([[1,2,3],[4,5,6],[7,5,4]])
print(mod_gramschmidt(A))
收益 率
[[0 0 0]
[0 0 0]
[0 0 0]]
但是,将相同的算法应用于浮点矩阵
A = np.array([[1.,2.,3.],[4.,5.,6.],[7.,5.,4.]])
print(mod_gramschmidt(A))
收益 率
[[ 0.12309149 0.52015649 0.84515425]
[ 0.49236596 0.70741282 -0.50709255]
[ 0.86164044 -0.47854397 0.16903085]]
如果在算法内部,整数矩阵被强制转换为astype(float)
def mod_gramschmidt(X):
n = X.shape[0]
R = np.zeros((n, n)).astype(float)
Q = X.copy().astype(float)
...
则不会出现与整数矩阵计算相关的错误。