Python 矩阵QR分解算法
我一直在尝试一步一步地可视化QR分解,但没有得到预期的结果。我是numpy的新手,所以如果任何专家的眼睛都能发现我可能缺少的东西,那就太好了: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
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)
,计算点积>>> 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])