矩阵 QR 分解算法

Matrix QR factorization algorithms

我一直在尝试逐步可视化 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 旨在处理同构多维数组,它并不是专门的 线性代数 包。因此,根据设计,* 运算符是 元素级 乘法,而不是矩阵乘积。

如果想得到矩阵乘积,有以下几种方式:

  1. 您可以创建 np.matrix 个对象,而不是 np.ndarray 个对象,* 运算符 矩阵乘积。

  2. 也可以使用@运算符,如W_12 @ A,就是矩阵乘积。

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

其中任何一项,使用您提供的数据,returns 吉文斯旋转的以下内容:

>>> 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])