程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-05(1)

线性代数(15)——矩阵的QR分解

发布于2019-08-07 12:13     阅读(1286)     评论(0)     点赞(2)     收藏(0)


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Jakob_Hu/article/details/90901054


矩阵的QR分解和LU分解的目的都是为了便于矩阵计算。

矩阵的QR分解

概述

A=QRA=QR这一过程将矩阵分解为QR两部分,其中Q是标准正交矩阵,R是一个上三角矩阵。

矩阵的QR分解能够简化计算可以以线性系统的计算为例,
Ax=b(QR)x=b
Q1QRx=Q1bRx=QTb
QT是非常好计算的,R是一个上三角矩阵(相当于Gauss-Jordan消元法的前向过程结束),从下往上推就可以很快计算出线性系统的结果。

因为涉及到求取标准正交矩阵Q的过程,所以矩阵A可以进行QR分解的条件A的各个列向量是线性无关的。因为只有满足这一点才能进行Gram-Schmidt过程。

演示分析

A=QRA=(a1,a2,...,an)
对矩阵A的各列执行Gram-Schmidt过程,得到正交向量p1p2...pn,归一化后得到标准正交向量q1q2...qn
p1=a1
p2=a2a2p1p12p1
得到上三角矩阵R的过程如下,以A矩阵前3个列向量为例,
在这里插入图片描述
在这里插入图片描述
求取R的过程是使用已经求取的标准正交基反推原来的列向量。每一个系数都是可以找到规律的。故矩阵的QR分解实际上将矩阵A分解为如下形式,
在这里插入图片描述
可以对该矩阵再进行推导,
在这里插入图片描述

实现QR分解

上面的推导过程很复杂,但是在实际的计算过程中根本不需要求取R中的每个值,而是只需通过Gram-Schmidt过程得到A的标准正交矩阵Q,很快速的求取出R,通过如下形式,
A=QRQ1A=R
由正交矩阵性质可得,
R=Q1AR=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))
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20


所属网站分类: 技术文章 > 博客

作者:紫薇

链接:https://www.pythonheidong.com/blog/article/10693/e513a77e9052c89dd41e/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

2 0
收藏该文
已收藏

评论内容:(最多支持255个字符)