将数组列除以其范数将返回空列



这会在方阵上运行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))

之后

  • 删除不必要的abAB变量,
  • 通过将向量Q[:, j]R[j, (j + 1) :]重塑为n x 11 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)

...

则不会出现与整数矩阵计算相关的错误。

最新更新