0

我正在尝试通过家庭反射器实现 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])
4

1 回答 1

0

*是元素乘法,@是矩阵乘法。两者都有其用途,但对于矩阵计算,您很可能需要矩阵乘积。

vec.T对于数组返回相同的数组。一个简单的数组只有一维,没有什么可以转置的。vec*vec.T只返回元素平方数组。

您可能想要使用vec=vec.reshape(-1,1)来获得正确的列向量,即单列矩阵。然后vec*vec.T“偶然”做了正确的事情。无论如何,您可能希望将矩阵乘法运算符放在那里。

于 2019-10-07T22:40:51.567 回答