Python 矩阵QR分解算法

Python 矩阵QR分解算法,python,numpy,linear-algebra,Python,Numpy,Linear Algebra,我一直在尝试一步一步地可视化QR分解,但没有得到预期的结果。我是numpy的新手,所以如果任何专家的眼睛都能发现我可能缺少的东西,那就太好了: import numpy as np from scipy import linalg A = np.array([[12, -51, 4], [6, 167, -68], [-4, 24, -41]]) #Givens v = np.array([12, 6]) vnorm = np.linalg.norm(v) W_12 = np.ar

我一直在尝试一步一步地可视化QR分解,但没有得到预期的结果。我是numpy的新手,所以如果任何专家的眼睛都能发现我可能缺少的东西,那就太好了:

import numpy as np
from scipy import linalg

A = np.array([[12, -51, 4],  
[6, 167, -68],
[-4, 24, -41]])

#Givens

v = np.array([12, 6])

vnorm = np.linalg.norm(v)

W_12 = np.array([[v[0]/vnorm, v[1]/vnorm, 0],
               [-v[1]/vnorm,  v[0]/vnorm, 0],
               [0, 0, 1]])

W_12 * A #this should return a matrix such that [1,0] = 0

#gram-schmidt

A[:,0]

v =  np.linalg.norm(A[:,0]) * np.array([1, 0, 0])

u = (A[:,0] - v) 

u = u / np.linalg.norm(u)

W1 = np.eye(3) - 2 * np.outer(u, u.transpose())

W1 * A #this matrix's first column should look like [a, 0, 0]

任何有助于澄清这一事实的中间结果都不会显示出它们应该被广泛接受的属性

NumPy设计用于同质多维阵列,它不是一个专门的线性代数包。因此,根据设计,
*
运算符是元素乘法,而不是矩阵积

如果要获得矩阵积,有几种方法:

  • 您可以创建
    np.matrix
    对象,而不是
    np.ndarray
    对象,其中
    *
    运算符是矩阵乘积

  • 您还可以使用
    @
    运算符,如
    W_12@A
    中的矩阵乘积

  • 或者您可以使用
    np.dot(W_12,A)
    W_12.dot(A)
    ,计算点积

  • 使用您提供的数据,其中任何一项都会为Givens旋转返回以下内容:

    >>> np.dot(W_12 A)[1, 0]
    -2.2204460492503131e-16
    
    对于Gram-Schmidt步骤:

    >>> (W1.dot(A))[:, 0]
    array([  1.40000000e+01,  -4.44089210e-16,   4.44089210e-16])