尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
QR分解详解:从Gram-Schmidt到Householder的数值计算与应用
《矩阵论》学到QR分解这一节的时候我其实一开始是有点懵的。前面刚啃完Jordan标准形和λ-矩阵那一大堆抽象概念突然又跳回矩阵分解还叫“QR分解”。说实话刚接触时我也没太当回事觉得不就是“把一个矩阵拆成正交矩阵乘上三角矩阵”嘛能有什么花头。直到后来在做最小二乘、特征值算法、甚至看一些数值计算框架底层的时候才意识到QR分解是整个矩阵论里连接理论推导和工程实现最重要的一座桥。这篇笔记我原本只是给自己复习用的后来发现身边不少同学也在纠结4.2这一节——考试会考、课后习题要算、论文里可能还要用但教材和课堂往往把重点放在定理证明上而真正动手怎么算、怎么选方法、怎么避免踩坑反而比较少讲。所以我干脆把这一节的内容重新整理一遍把定义、算法、手算过程、应用场景和学习中常见的问题都放在一起尽量做到既能应付考试又能让你真的会用。适合正在学《矩阵论》的研究生、准备考研复试的本科生以及工作中需要补线性代数基础的技术人。1. QR分解到底是什么从定义到几何直觉1.1 定义与存在唯一性条件先过一遍最标准的定义。设A是一个m×n实矩阵复数域就是酉矩阵和上三角矩阵这里以实矩阵为主如果存在一个m×m正交矩阵Q和一个m×n上三角矩阵R使得A QR那这就是A的一个QR分解。很多时候我们讨论的是“列满秩”的情况即rank(A) n这时可以进一步要求R的对角线元素为正数在这个条件下如果A是方阵且可逆则QR分解在不计Q的列向量整体符号的意义下是唯一的。这里有个容易被忽略的点教材里常写“设A是m×n列满秩矩阵则存在……”但实际应用中A未必满秩。如果A不满秩QR分解依然可以做只是R会出现零对角元分解不唯一。考试题一般默认A满秩但你自己用的时候要有这个意识。从数值计算的角度QR分解的“任务”就是把一组可能乱七八糟的列向量通过正交化变换变成一组标准正交基同时把“组合系数”记录在R里。R的上三角结构不是偶然它恰好说明第k列只依赖前k个正交基的组合。1.2 几何直觉从正交化到矩阵分解我觉得理解QR分解最好的方式还是回到Gram-Schmidt正交化。想象一个三维空间里的三个向量a1、a2、a3它们线性无关。所谓QR分解本质上就是先把a1方向定下来得到单位向量q1然后把a2拆成“沿q1方向的分量”加上“与q1垂直的分量”把垂直分量单位化得到q2再在a3中减去沿q1和q2的分量单位化得到q3。这个过程其实就是把原始向量组“拧”成一个标准正交基。而拧的过程中每个原始向量在哪些正交方向上有多少分量这些系数记下来就是R矩阵的元素。写成矩阵的形式[a1 a2 a3] [q1 q2 q3] * [||v1||, 系数, 系数; 0, ||v2||, 系数; 0, 0, ||v3||]所以QR分解一点都不神秘它就是正交化过程的全记录。这也是为什么很多教材先把Gram-Schmidt过程讲透了才讲QR分解——因为QR分解就是那一步过程的矩阵封装。2. 三种计算路线从教科书到工程代码2.1 经典Gram-Schmidt理解概念的第一步最容易上手、也是考试最常要求手算的是经典Gram-Schmidt过程。对A的列向量按顺序处理对第1列a1令r11 ||a1||q1 a1 / r11对第k列ak先算它在前k-1个正交方向上的投影系数rij qi^T * aki 1,...,k-1然后令vk ak - Σ rij * qi取rkk ||vk||qk vk / rkk为什么先算投影再单位化因为如果一上来直接单位化没法扣除前面方向的分量。投影系数的几何含义就是“ak在qi方向上伸了多长”扣掉这些分量后剩下的vk就是新的独立方向。这个算法简单直观手算非常方便。但实际数值计算教材通常还会介绍一个改良版本修正Gram-SchmidtMGS。区别在于经典GS每一步都用原始的ak去减所有投影而MGS在第一步减完r11*q1之后就把中间结果作为新的“当前向量”继续处理后面的方向。MGS在浮点运算下稳定性更好。考试手算两者差别不大但如果用代码实现高维矩阵建议直接用MGS或后面要说的Householder。2.2 Householder变换工程界真正的首选如果说Gram-Schmidt是理解概念用的那Householder变换就是拿来“干活”的。几乎所有主流数值线性代数库比如LAPACK做QR分解默认路径都是用Householder变换而不是Gram-Schmidt。它的思想不是“逐个正交化列向量”而是“逐列把矩阵化成上三角”。具体对第k列找到某个正交对称的反射矩阵H使得这一列的下面元素全部变成0。Householder矩阵的标准形式是H I - 2 * v * v^T / (v^T * v)这里的v取法是关键设x是当前要处理的列向量在第k到第m行上的子向量令v x - sign(x1) * ||x|| * e1其中e1是该子空间的第一个单位向量。用这个v构造H能把x映成±||x||e1即除了第一个分量以外全部清零。之所以选sign(x1)是为了避免灾难性抵消保证数值稳定。为什么工程上偏爱Householder因为它需要的浮点运算量少数值稳定性极好而且不需要中途做向量单位化那样容易放大误差的操作。Gram-Schmidt是对所有列同时正交化Householder是“各个击破”把矩阵从左边一层层“拍扁”成上三角。2.3 Givens旋转稀疏与并行场景的利器第三种常见方法是Givens旋转。它的思想更简单用一次平面旋转把矩阵中的某个指定元素清零同时保持其他元素尽量不破坏。Givens矩阵长这样以n维空间中的(i,j)平面旋转为例[i行i列] c, ... s; [j行i列] -s, ... c其中c xi / sqrt(xi^2 xj^2)s xj / sqrt(xi^2 xj^2)。作用在向量x上后第j个分量变成0。这种方法的特点是“精确打击”一次只消一个元素。代价是需要两倍甚至更多的浮点运算量。所以它通常不用于稠密矩阵的通用QR分解而是在稀疏矩阵、并行计算、以及某些只需要零化个别元素的场景比如求解上Hessenberg矩阵的特征值问题中发光发热。一句话总结三种方法的取舍考试手算用Gram-Schmidt工程通用用Householder稀疏和并行场景考虑Givens。3. 一个矩阵三种算法走一遍光说不练假把式。这一节我手算一个具体的例子把三种方法都过一遍这样你再看课后题会轻松很多。取矩阵A [[1, 1, 0], [1, 0, 1], [0, 1, 1]]为什么选这个矩阵因为它的列向量线性无关结果算出来比较整齐适合验算。3.1 完整算例Gram-Schmidt手算过程按列处理。第1列a1 (1,1,0)^T直接算模长r11 sqrt(1^2 1^2 0^2) sqrt(2)于是q1 (1/sqrt(2), 1/sqrt(2), 0)^T第2列a2 (1,0,1)^T。先算它在q1方向的投影r12 q1^T * a2 1/sqrt(2) * 1 1/sqrt(2) * 0 0 * 1 1/sqrt(2)然后扣除这个投影v2 a2 - r12 * q1 (1, 0, 1) - (1/2, 1/2, 0) (1/2, -1/2, 1)再算v2的模长r22 sqrt(1/4 1/4 1) sqrt(3/2) sqrt(6)/2于是q2 v2 / r22 (1/sqrt(6), -1/sqrt(6), 2/sqrt(6))第3列a3 (0,1,1)^T。分别算它在q1、q2上的投影r13 q1^T * a3 1/sqrt(2) * 0 1/sqrt(2) * 1 0 * 1 1/sqrt(2)r23 q2^T * a3 (1/sqrt(6))*0 (-1/sqrt(6))*1 (2/sqrt(6))*1 1/sqrt(6)扣掉两个方向的分量v3 a3 - r13q1 - r23q2 (0,1,1) - (1/2,1/2,0) - (1/6,-1/6,2/6) (-2/3, 2/3, 2/3)计算模长r33 sqrt(4/9 4/9 4/9) 2/sqrt(3)于是q3 (-1/sqrt(3), 1/sqrt(3), 1/sqrt(3))最终得到的QR分解为Q [[1/sqrt(2), 1/sqrt(6), -1/sqrt(3)], [1/sqrt(2), -1/sqrt(6), 1/sqrt(3)], [0, 2/sqrt(6), 1/sqrt(3)]]R [[sqrt(2), 1/sqrt(2), 1/sqrt(2)], [0, sqrt(6)/2, 1/sqrt(6)], [0, 0, 2/sqrt(3)]]你可以随便取一列验一下比如第二列Q的第二列即q2乘以R(2,2)再加上q1乘以R(1,2)应该精确等于(1,0,1)^T。这种“乘积回代”是手算后最有效的验算方式。3.2 同一矩阵的Householder过程速览再看Householder怎么处理这个矩阵。目标是依次把第一列的下两个元素清零。第一步取第一列x (1,1,0)^T||x|| sqrt(2)x1 1取sign为正。于是v1 x - sqrt(2) * e1 (1 - sqrt(2), 1, 0)^T构造H1 I - 2 * v1 * v1^T / (v1^T * v1)。对A作用后第一列变成(sqrt(2), 0, 0)^T这是Householder变换的性质保证的。第二列会变成(1/sqrt(2), 1/sqrt(2), 1)^T第三列也会相应变化。然后对右下角的2×2子矩阵重复同样的操作找到第二个Householder矩阵H2把第二列第三行清零。最终H2 * H1 * A R同时Q H1 * H2因为Householder矩阵正交且对称所以H^{-1} H。这跟Gram-Schmidt得到的Q和R本质上一致只是列向量可能差一个符号当某一步取了负方向时。3.3 结果该如何校验不管用哪种方法算完QR分解后建议做三个检查检查Q的列是否两两正交任意两列内积为0检查Q的列是否单位长度每列模长为1检查A QR是否成立至少抽一列做线性组合验证这三个检查都通过基本可以放心。很多人手算时只算到Q、R就停结果R矩阵某一行写错符号也没发现最后拿Q乘以R发现对不上再回头找错就特别痛苦。先验结构再验乘积能省很多时间。4. QR分解拿来干什么三大应用场景4.1 最小二乘问题的稳定解法QR分解在应用层面最有名的场景之一就是求解最小二乘问题。给定超定方程组Ax ≈ b其中A是m×n矩阵且m n最小二乘解是使||Ax - b||_2最小的x。教材里最早教的方法是正规方程A^T A x A^T b这个写法简洁但有个隐患A^T A的条件数是原矩阵A的条件数的平方。条件数越大数值越敏感误差会被放大。如果A本身就“病态”A^T A几乎可以称为灾难。用QR分解就舒服多了。设A QR因为Q正交所以||Ax - b|| ||QRx - b|| ||Rx - Q^T b||注意R是m×n上三角当m n时R的下半部分是零块。于是最小二乘问题转化为求解一个n×n的上三角方程组R_hat * x (Q^T b)的前n个分量这既避免了矩阵平方带来的条件数恶化也不需要显式求逆数值上稳定得多。这个思路是很多统计软件做回归分析的底层逻辑理解了QR版本你就比别人更接近“真正在运行的算法”。4.2 特征值算法QR迭代的地基QR分解在特征值计算中的角色也很关键只不过这里的“QR分解”是反复迭代使用的也就是所谓的QR算法QR iteration在数值代数课程里是重头戏。基本流程很简单令A_1 A对k 1,2,...做A_k的QR分解A_k Q_k * R_k然后令A_{k1} R_k * Q_k看起来只是把两个因子换个顺序再乘回去但这个操作保持了矩阵相似——每次迭代得到的A_k都和原来A相似所以特征值不变。同时在相当温和的条件下A_k会逐渐收敛到一个上三角矩阵对角线元素就是特征值。要知道求一般矩阵特征值本质上是没法用有限次四则运算和开方直接精确得到的只能靠迭代逼近。而QR迭代正是其中最经典、最可靠的一类算法。所以别觉得QR分解只是“一个数学技巧”它其实是数值线性代数里最重要迭代方法的发动机。自己写代码做QR迭代时注意每次循环都做完整QR分解在n较大时开销不小实际工程会先把矩阵化成上Hessenberg形式再用Givens旋转或Householder做“带位移的QR迭代”。这些细节属于进阶内容但知道“QR分解是迭代引擎”这一点能帮你理解后续很多优化手段。4.3 在课程考试和课后题中的常见考法如果现在还在准备《矩阵论》考试那4.2节最常见的考法就几类第一类是直接手算QR分解。通常给一个3×3矩阵要求用Gram-Schmidt教材戴华这本里4.2节就是这么安排课后题的写出Q和R。这类题考察的是运算熟练度容易因细节失分做题时要养成“每步都写上r_ij的计算过程”的习惯。第二类是证明题比如证明“列满秩矩阵的带正对角线R的QR分解唯一”。这种题考察的是定义理解套路通常是假设有两组Q1R1 Q2R2然后利用Q2^{-1}Q1 R2R1^{-1}仍为正交且上三角的性质推出它必须是对角阵再结合对角线为正得到它只能是单位阵。第三类是应用题给你一个超定方程组要求用QR分解求最小二乘解。这种题在期中期末里出现频率很高因为能综合考察分解计算和解线性方程组的能力。课后习题里如果卡住了我建议先不要急着翻答案把矩阵换成一个自己熟悉的2×2样本重新走一遍流程往往就能发现是某个投影系数算错了。5. 学习过程中常见的坑与排查思路5.1 符号方向搞反我见过太多同学包括我自己在QR分解上栽的跟头就是Householder变换里v的取法符号不对。顾了“让首项为正”这个约定却忘了如果x1本身是负的取x1 - ||x||e1会导致两个接近的数相减在浮点运算中丢失精度。所以工程实现里会用sign(x1)来保证v的模长不太小。手算时倒是无所谓但理解这个意图写代码能少踩很多坑。也有同学把Gram-Schmidt中的投影写反比如把a2减掉r12q1写成减掉r12q2结果算出来Q根本不正交。记住处理第k列时只能减前面已经确定的正交方向不能减到后面还没算出来的方向。5.2 稳定性问题用经典Gram-Schmidt在计算机上处理接近线性相关的列向量时中途会出现很小的残余量||v_k||再对它做单位化会把微小误差放大。修正Gram-Schmidt能改善这点但改善也有限。如果要处理条件数很大的矩阵最稳的还是Householder。如果作业或论文里要求用代码实现QR分解我建议优先把Householder版本写出来代码量不大而且稳定性好。等你把Householder版本跑通了再回来写Gram-Schmidt版本做对比实验体会会更深。5.3 唯一性问题很多同学误以为QR分解是唯一的。实际上只有加了“R的对角线为正”这个条件分解才对可逆方阵唯一。如果不做这个约定你可以把Q的某一列都乘以-1同时把R的对应行都乘以-1得到的还是合法的QR分解。所以看到“求QR分解”的题目最终答案差一个正负号并不意味着算错关键是你的Q要正交、R要上三角、A QR成立。理解了这一点就不容易在答案细节上钻牛角尖。5.4 编程实现时的细节如果自己用Python或MATLAB写过QR分解有几个细节值得注意不要自己造轮子处理大规模矩阵NumPy的numpy.linalg.qr和MATLAB的qr函数底层已经是工业级实现了但为了学习用numpy手写一遍Householder式QR分解是极好的练习判断正交性时不要用“等于0”判断用“小于某个阈值”比如1e-10测试时用随机生成的条件数较大的矩阵能暴露很多数值问题我自己在给本科生讲数值实验时经常让他们分别用三种方法做QR分解然后对比残差||A - QR||的变化。结果几乎每次都是Householder表现最好这也再次印证了“理论等价数值不等价”这句话。6. 一点学习体会别把它当孤立章节如果你跟我一样学《矩阵论》的时候容易把这章当“孤立的分解技巧”那我建议你调整一下视角。QR分解和之前学的Smith标准形、Jordan标准形、后面的奇异值分解其实共享同一个底层母题——通过变换把矩阵化为标准型。Jordan标准形解决的是相似意义下的“最简形式”QR分解解决的是正交意义下的“三角化”SVD解决的是两个正交基下的“对角化”。这个视角一打开你就会发现QR分解并不只是计算工具它还是在特定约束下追求“标准形”的一种方案。考试时它可能只是让你写Q和R科研和工程里它是你快速判断一个矩阵是否可逆、求解最小二乘、做特征值迭代的基础设施。我自己复习时最喜欢的一个“土办法”是每次学完一个分解就把它的适用条件、不变量、计算复杂度、典型应用写在一张索引卡上和Jordan标准形、SVD、极分解放在一起反复对照。这个习惯帮我建立了整体观也让我在遇到新矩阵问题时能更快判断“该用哪个分解”。说回QR分解本身如果你目前正卡在4.2节的课后习题上我的建议其实很简单找一个具体的3×3矩阵先徒手完整算一遍Gram-Schmidt再用代码实现一遍Householder版本然后去观察你算出来的Q和R结构。这个过程花不了太久但比对着答案看十遍都管用。等你把那些“看起来就是机械计算”的步骤真正弄通了再回头看定理你会觉得它们本来就是顺理成章的事情。
RELATED

相关推荐

高频交易场景下TensorFlow模型推理的毫秒级优化实践

高频交易场景下TensorFlow模型推理的毫秒级优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/5 12:49:07
聚类分析实战指南:从K-Means到SPSS,搞懂原理、选型与业务落地

聚类分析实战指南:从K-Means到SPSS,搞懂原理、选型与业务落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/5 12:49:07
基于Python深度学习的花卉识别课程设计实战

基于Python深度学习的花卉识别课程设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/5 12:49:07
MORE NEWS

更多资讯

📰

快速排序实现与优化:从原理到多种C语言变式

我最早学C语言排序算法时,最先上手的是冒泡排序,能写通不难,但真正让我意识到“同样的排序,工程实现可以天差地别”的,是快速排序。工作这些年,面试、笔试包括实际项目里的数据预处理,快排的出现…

📰

Manjaro下用Ventoy制作多系统启动盘完整避坑指南

手头一堆 ISO 镜像、却只有一两块 U 盘的场景,折腾过系统的人应该都不陌生。以前我在 Manjaro 上给 U 盘写镜像,又是 dd 又是 balenaEtcher,写一个就得重新格式化一次,后来换用 Ventoy 做多系统启动盘,才算把这件事彻底…

📰

Django毕业生招聘数据可视化系统:从ORM统计到ECharts图表实现

毕业生招聘信息可视化分析系统,听起来很像一个课程设计里常见的“后台管理”,但我做完之后最大的感受是:真正有价值的部分根本不在增删改查,而在数据怎么算、图怎么画、前后端怎么把“统计结果”变成“业务判断”。这个项目我用的…

📰

tpmvscmgrsvr.exe找不到?用SFC和DISM安全修复系统文件

开机突然弹出一个错误框,提示tpmvscmgrsvr.exe - 系统错误、找不到指定的文件,很多人第一反应是自己电脑中毒了。实际上这个文件是 Windows 自带的可信平台模块(TPM)相关组件,不是病毒。这篇博文就把这类问题的完整处理…

📰

Git 提交后如何单独撤销某个文件?reset与revert实战指南

如果你曾经在 git commit 之后突然意识到“糟了,那个配置文件不应该提交”,或者手一抖把还在调试的临时文件一起打包提交了,甚至不小心把一个带着本地绝对路径的 .env 文件推到了提交记录里,那这篇就是为你准备的。 “git comm…

📰

配电网动态重构:分布式光伏消纳的关键技术与工程实践

简介:这是《基于配电网动态重构的分布式光伏消纳策略》学术文献,面向电力系统研究人员、配电网优化与分布式光伏并网方向学习者,聚焦光伏出力间歇性与波动性导致的消纳难题,提出以光伏消纳比最大化和开关切换次数最少化为目标的配…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬