我正在尝试通过家庭反射器实现 QR 分解。在一个非常简单的数组上尝试这个时,我得到了奇怪的数字。任何人都可以告诉我,为什么在函数定义的最后一行在 vec 和 vec.T 之间使用 @ vs * 运算符可以获得主要的奖励积分。
截至今天早上,这已经难倒了两位数学/计算机科学博士。
import numpy as np
def householder(vec):
vec[0] += np.sign(vec[0])*np.linalg.norm(vec)
vec = vec/vec[0]
gamma = 2/(np.linalg.norm(vec)**2)
return np.identity(len(vec)) - gamma*(vec*vec.T)
array = np.array([1, 3 ,4])
Q = householder(array)
print(Q@array)
输出:
array([-4.06557377, -7.06557377, -6.06557377])
它应该在哪里:
array([5.09, 0, 0])