矩阵的分解有很多种,例如LU分解、QR分解、EVD分解、SVD分解。
首先我们来看QR分解的定义:如果实(复)非奇异矩阵A能够化成正交(酉)矩阵Q与实(复)非奇异上三角矩阵R的乘积,即A=QR,则称其为A的QR分解。
【注1】非奇异矩阵可以理解为行列式不为0的矩阵,也就是可逆矩阵。
【注2】Q是实(复)矩阵,且满足;R是n阶实(复)非奇异上三角矩阵。
然而.... 关于实际问题的求解,书中的定理并没有强制要求A是一个方阵,也就是说只要A和Q是一个m*n就行,我们来看一下具体的代码。
# 用施密特正交化方法求解QR矩阵
M = np.array([[12,9,-4],
[7,4,5],
[6,-3,21],
[6,15,8],
], dtype=float
)
Q = np.zeros((4,3))
j = 0
for a in M.T:
b = np.copy(a)
for i in range(0,j):
b = b-np.dot(np.dot(Q[:,i].T, a),Q[:,i])
e = b / np.linalg.norm(b)
Q[:,j] = e
j += 1
R = np.dot(Q.T, M)
np.set_printoptions(precision=3, suppress=True)
上面的代码是求QR四大方法之一的施密特正交化方法
1.M是已知矩阵,我们要将它分解。Q是一个空的矩阵,定义和M格式相同就OK
2.把M中的列向量按照施密特正交化方法进行正交,Q[:,i]就是取矩阵的列向量,下面的代码行是正交化公式的具体体现:
b = b-np.dot(np.dot(Q[:,i].T, a),Q[:,i])
循环就是全部走完一边。之后的代码就是单位化公式的体现,norm是我们在上一篇所学到的范数随后将其转回给Q。
3.R就是根据公式左面同时乘上Q的转置
R = np.dot(Q.T, M)