发布于2019-08-07 12:13 阅读(1517) 评论(0) 点赞(2) 收藏(0)
A=QR
矩阵的QRQR分解能够简化计算可以以线性系统的计算为例,
Ax=b⟹(QR)x=bAx=b⟹(QR)x=b
Q−1QRx=Q−1b⟹Rx=QTbQ−1QRx=Q−1b⟹Rx=QTb
QTQT是非常好计算的,RR是一个上三角矩阵(相当于Gauss-Jordan消元法的前向过程结束),从下往上推就可以很快计算出线性系统的结果。
因为涉及到求取标准正交矩阵QQ的过程,所以矩阵AA可以进行QRQR分解的条件是AA的各个列向量是线性无关的。因为只有满足这一点才能进行Gram-Schmidt过程。
A=QR,其中A=(⃗a1,⃗a2,...,⃗an)A=QR,其中A=(a1,a2,...,an)
对矩阵AA的各列执行Gram-Schmidt过程,得到正交向量⃗p1,⃗p2,...,⃗pnp1,p2,...,pn,归一化后得到标准正交向量⃗q1,⃗q2,...,⃗qnq1,q2,...,qn。
⃗p1=⃗a1p1=a1
⃗p2=⃗a2−⃗a2⋅⃗p1∣∣⃗p1∣∣2⋅⃗p1p2=a2−∣∣p1∣∣2a2⋅p1⋅p1
得到上三角矩阵RR的过程如下,以AA矩阵前3个列向量为例,
求取RR的过程是使用已经求取的标准正交基反推原来的列向量。每一个系数都是可以找到规律的。故矩阵的QRQR分解实际上将矩阵A分解为如下形式,
可以对该矩阵再进行推导,
上面的推导过程很复杂,但是在实际的计算过程中根本不需要求取RR中的每个值,而是只需通过Gram-Schmidt过程得到AA的标准正交矩阵QQ,很快速的求取出RR,通过如下形式,
A=QR⟹Q−1A=RA=QR⟹Q−1A=R
由正交矩阵性质可得,
R=Q−1A⟹R=QTAR=Q−1A⟹R=QTA
def qr(A):
"""
:param A: 一个矩阵对象,本节A是方阵,实际上一般矩阵也可以QR分解,只是本次不涉及
"""
assert A.row_num() == A.col_num(), "A must be square"
basis = [A.col_vector(i) for i in range(A.col_num())]
P = gram_schmidt_process(basis)
# 这里转置是因为在自定义的Matrix类中,是通过行向量创建矩阵的
Q = Matrix([v/v.norm() for v in P]).T()
R = Q.T.dot(A)
return Q, R
if __name__ == "__main__":
A = Matrix([[1, 1, 2], [1, 1, 0], [1, 0, 0]])
Q, R = qr(A)
print(Q.dot(R))
作者:紫薇
链接:https://www.pythonheidong.com/blog/article/10693/e513a77e9052c89dd41e/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!