
简介这份「矩阵论期末考试参考答案」面向高校矩阵论与线性代数课程的期末复习者和备考学生聚焦特征值、特征向量、Smith标准形、Jordan标准形、QR分解、正交投影及矩阵幂运算等核心考点提供可对照的参考解答。压缩包共1个PDF文件大小约284KB内容紧凑适合在电脑或移动端查阅也便于打印后配合演算。目前已有619人学习。解答过程覆盖Jordan标准形中变换矩阵P与P⁻¹APJ的构造、Gram-Schmidt正交化求QR分解、矩阵范数不等式证明以及非齐次微分方程组求解等典型题型可用于核对答案、梳理证明步骤、理解相似变换与正交化流程适合考前查漏补缺和建立矩阵理论解题框架。1. 从一道矩阵题说起矩阵论到底在算什么“矩阵”这个词大多数人第一次见是在本科线性代数课上——一堆数字排成方阵加减乘有规矩考完就原样还给了老师。到了矩阵论这门课题目突然变了味道不再问你行列式等于几而是问你这台“矩阵机器”内部由哪些零件组成、哪个零件拆得下来、拆完还能不能转。打个比方线性代数教你怎么操作这台机器矩阵论让你看它的结构图纸。一份期末参考答案里特征值、Jordan 标准形、QR 分解、伪逆、矩阵范数挤在同一页纸上看着像五个互不相干的名词其实指向同一件事把一个矩阵拆开看清楚再按需要重新拼回去。这条主线捋顺了那些符号就不再是拦路虎。2. 特征值与 Jordan 标准形矩阵的骨架和它的例外把一个矩阵想成一台加工机器输入一根箭头输出另一根箭头。绝大多数箭头进去之后方向会被拧歪、长度会被改变看起来杂乱无章但总有那么几个特殊方向进去什么样、出来还是同一个方向只是长度被拉长或压短了。这几个方向就是特征向量拉长的倍数就是特征值。矩阵论里所有“把矩阵拆开”的动作起点都是找出这批特殊方向——找到了就等于摸到了这台机器的骨架。2.1 特征值到底在测量什么课本上写的是解方程 det(λI − A) 0这叫特征方程左边那个 λI − A 叫特征矩阵。很多人的困惑不在解法而在“为什么是 det 0”。通俗地说λI − A 这个矩阵如果可逆那么 (λI − A)x 0 只有零解就找不到非零的特征向量只有当它退化、行列式为零时才会有非零解冒出来。所以求特征值本质上是在找“让 λI − A 失去可逆性”的那些 λ。特征值有个容易被忽略的性质它是变换本身的固有属性不随坐标系改变。你把矩阵做一次相似变换 P⁻¹AP等于换了一套基底去描述同一个变换特征多项式一点不变。这就是为什么可以先化简再求值——只要化简用的是相似变换答案就是同一个。等比数列求和这类问题矩阵的高次幂微分方程组的解背后都靠特征值撑着。打个比方一个二阶对角矩阵 diag(2, 3)它的特征值一眼就能读出来是 2 和 3特征向量分别是两根坐标轴方向的箭头。这种矩阵是“最省事”的形态作用在任意向量上只是把横坐标放大两倍、纵坐标放大三倍。而对角化这件事说穿了就是在问我能不能找到另一套基底让这个变换在这套基底下也变成这么省事的样子。2.2 从 Smith 标准形到 Jordan 标准形一条拆解链不是所有矩阵都能对角化。举个最小的例子二阶矩阵 [[2, 1], [0, 2]]特征值是 2二重但真正线性无关的特征向量只有一个凑不齐两根轴。这时候对角化失败得换一个更宽容的“标准形”——Jordan 标准形。它的样子是主对角线上排特征值紧贴对角线上方的那条超对角线放 1或者不放其余全零。每一个这样的方块叫一个 Jordan 块。那怎么知道该放几个块、每块多大这就要绕道 λ-矩阵了。把 λI − A 看成一个元素是多项式的矩阵对它做初等变换——交换两行、某行乘非零常数、把一行的多项式倍加到另一行——可以把它化成对角形 diag(d₁(λ), d₂(λ), …, d_r(λ), 0, …, 0)其中每个 d 都是首一多项式而且 d₁ 整除 d₂、d₂ 整除 d₃一路整除下去。这个对角形叫 Smith 标准形那些 d 叫不变因子。拿到不变因子再把它们分解成不可约多项式的幂得到的就是初等因子。每个形如 (λ − λ₀)^k 的初等因子对应一个 k 阶、特征值为 λ₀ 的 Jordan 块。一份参考答案里出现过这样的链条λI − A 经过一串初等变换化成 diag(1, 1, (λ − 2)³)于是不变因子是 1、1、(λ − 2)³初等因子只有 (λ − 2)³ 一个最终 Jordan 形就是一个三阶块对角线上三个 2超对角线上两个 1。用一张表把这两个“标准形”摆在一起看区别就清楚多了对比项Smith 标准形Jordan 标准形处理对象λ-矩阵 λI − A数字矩阵 A使用变换λ-矩阵的初等行列变换相似变换 P⁻¹AP结果形态对角元素是多项式块对角块内超对角线为 1回答的问题不变因子、初等因子分别是什么这个变换在某组基下长什么样唯一性相差非零常数倍相差 Jordan 块的排列顺序提示Smith 标准形只是中间产物它的价值在于把“有几个块、每块多大”这件事算清楚真正要写进答案的是 Jordan 标准形。2.3 相似变换矩阵 P广义特征向量链怎么串知道了 Jordan 形 J还差一个 P使得 P⁻¹AP J或者等价地写成 AP PJ。这个等式按列拆开就变成了一串递推关系。假设 J 是一个以 2 为特征值的三阶块把 P 写成三列 [P₁, P₂, P₃]AP PJ 逐列展开后得到AP₁ 2P₁也就是 (A − 2I)P₁ 0P₁ 是普通特征向量AP₂ P₁ 2P₂也就是 (A − 2I)P₂ P₁AP₃ P₂ 2P₃也就是 (A − 2I)P₃ P₂。这三列组成一条“链”P₁ 是链头P₃ 是链尾。链上每一列都不是特征向量除了 P₁它们叫广义特征向量。链的长度等于 Jordan 块的阶数不同的链对应不同的块。这里有一个手算时特别容易翻车的细节递推方向是反的。你不能随便找一个特征向量当 P₁ 就往下解因为 (A − 2I)x P₁ 未必有解——P₁ 必须落在 (A − 2I) 的值域里才行。稳妥的做法是从链尾往链头找先看 (A − 2I)³ 的零空间在里面挑一个不属于 (A − 2I)² 零空间的向量当 P₃然后依次算出 P₂ (A − 2I)P₃、P₁ (A − 2I)P₂。这样每一层都自动落在下一层需要的位置上不会中途卡死。拿一份参考答案里的三阶矩阵来验证矩阵是 [[5, 5, −2], [−2, −1, 1], [−1, −1, 2]]它的特征值全是 2几何重数只有 1。用代码把相似变换跑一遍import numpy as np # 待分解的矩阵 A np.array([[5., 5., -2.], [-2., -1., 1.], [-1., -1., 2.]]) # 按广义特征向量链排好的变换矩阵三列分别对应链头到链尾 P np.array([[1., 3., 1.], [-1., -2., 0.], [-1., -1., 0.]]) J np.linalg.inv(P) A P # 相似变换 P⁻¹AP print(np.round(J, 8)) # 输出对角为 2、超对角为 1 的三阶 Jordan 块代码里 np.linalg.inv(P) 求逆 是矩阵乘法np.round 只是把浮点误差抹掉。跑出来的结果应该是一个对角线上全是 2、超对角线上全是 1、其余为零的矩阵。如果结果不对八成是 P 的三列顺序排错了或者某一列没有落在正确的零空间里。有了 J矩阵的高次幂和矩阵指数就好算了A^k PJ^kP⁻¹e^{tA} Pe^{tJ}P⁻¹。而 J^k 和 e^{tJ} 只需要对每个 Jordan 块单独处理块内那个“1”带来的影响是有限的几项不会无限增长。这也是 Jordan 标准形在理论推导里地位这么高的原因——它把一个大矩阵的幂运算拆成了若干个几阶小块的幂运算。3. QR 分解把歪斜的坐标轴一根根扶正生活里描述一个位置最舒服的方式是“往东走三米、往北走四米”因为东和北互相垂直两个方向的位移互不干扰各算各的就行。如果两根轴夹角是 60 度那你想往东走三米实际还得往北补一段坐标之间互相纠缠。QR 分解干的事就是把一组夹角乱七八糟的向量换成一组成员互相垂直、长度归一的新向量让后面的计算彻底解耦。3.1 为什么非要“正交”正交基的好处体现在三个地方。第一是求坐标在一般基底 {α₁, α₂, …, αₙ} 下要把一个向量表示成它们的线性组合得解一个 n 元线性方程组而在正交基下第 i 个系数直接用内积 ⟨v, γᵢ⟩ 就能算出来一次乘加搞定。第二是误差控制用非正交基做数值计算误差会沿着基向量之间的“夹角”被反复放大夹角越小放大越狠正交基的夹角是 90 度没有任何放大通道。第三是保长度正交变换旋转、反射不改变向量的长度和内积这让很多算法可以放心地在变换后的空间里做判断结论搬回原空间依然成立。这三点加起来就解释了为什么数值线性代数里到处是正交矩阵的身影。求特征值用 QR 迭代最小二乘用 QR 分解奇异值分解的两侧也是正交矩阵。它们不是偏爱“垂直”这个几何美感而是垂直带来的数值稳定性在工程上太值钱了。3.2 Gram-Schmidt一次扶正一根轴正交化的思路很朴素手里有一组线性无关的向量 α₁、α₂、α₃、α₄先让 α₁ 原样站着当第一根轴再让 α₂ 减去它在第一根轴上的投影剩下的部分自然就垂直于第一根轴了再让 α₃ 减去它在前面两根轴上的投影剩下的部分垂直于这两根依此类推。写成公式就是β₁ α₁β₂ α₂ − (⟨α₂, β₁⟩ / ⟨β₁, β₁⟩) β₁β₃ α₃ − (⟨α₃, β₁⟩ / ⟨β₁, β₁⟩) β₁ − (⟨α₃, β₂⟩ / ⟨β₂, β₂⟩) β₂β₄ α₄ − 前面三项投影之和这一步做完得到的是正交但长度任意的向量组 {βᵢ}。再补一步“单位化”γᵢ βᵢ / |βᵢ|把每根轴的长度都压到 1。两件事别混为一谈——正交化保证夹角是 90 度单位化保证长度是 1缺一个都不叫标准正交基。一份参考答案里的例子用的是 Vandermonde 型矩阵四列是 [[1, 1, 1, 1], [1, 2, 3, 4], [1, 4, 9, 16], [1, 8, 27, 64]] 的转置。这个矩阵的条件数极大列向量之间几乎线性相关手算时每一步的投影系数都是又长又怪的分数比如第二个投影系数算出来是 15/4第三个是 436/115。算到后面分子分母能长到四位数一不留神就抄错。import numpy as np # Vandermonde 型矩阵列向量几乎线性相关用来演示正交化 A np.array([[1., 1., 1., 1.], [1., 2., 4., 8.], [1., 3., 9., 27.], [1., 4., 16., 64.]]) # reduced 模式返回薄 QRQ 是 4x4R 是 4x4 上三角 Q, R np.linalg.qr(A, modereduced) print(np.round(Q.T Q, 10)) # 应为单位矩阵验证 Q 的列标准正交 print(np.round(Q R - A, 10)) # 应接近零矩阵验证 A QRmodereduced 表示只保留有效维度对满秩方阵来说和 complete 没差别Q.T Q 是转置乘自身用来检查正交性Q R - A 是在验证分解是否还原了原矩阵。跑出来的第一个输出应该是单位矩阵第二个应该全是零附近的浮点数。注意手算用的经典 Gram-Schmidt 在数值上并不稳定正交性会随着列数增加迅速丢失。工业级实现用的是 Householder 反射或改进的 MGSnumpy.linalg.qr 内部走的就是 Householder。手算答案可以照 Gram-Schmidt 写写程序就别自己实现经典版了。3.3 A QR 里Q 和 R 各自负责什么把上面的过程写成矩阵形式就是 A QR。Q 的列是标准正交基 γ₁ 到 γₙ满足 QᵀQ IR 是上三角矩阵第 j 列记录的是“第 j 个原始向量在这组新基底下需要多少分量”。之所以是上三角是因为 Gram-Schmidt 逐列处理第 j 列只会用到前 j 根正交轴后面那些轴还没造出来系数自然是零。R 的对角元有一个很直白的含义它等于对应的 βⱼ 的模长 |βⱼ|。所以如果某一列原始向量和前面的列几乎线性相关对应的对角元就会非常小这在数值上是个危险信号提示你矩阵接近奇异。方法做法数值稳定性适用场合经典 Gram-Schmidt逐列减去全部已有投影一般列数多时正交性丢失手算、教学演示改进 Gram-Schmidt每算出一根新轴就立刻用它修正后面所有列较好一般工程实现Householder 反射用一组反射矩阵把矩阵逐步打成上三角好库函数默认选择Givens 旋转用平面旋转逐个消去下三角元素好且可并行稀疏矩阵、并行计算这四种做法算出来的 Q 和 R 在精确算术下是同一组在浮点运算下就分出高下了。这也是为什么同一道题手算和程序跑出来的数字会在小数点后好几位开始分叉不是谁算错了是路径不同。4. 伪逆与矩阵范数逆不存在时的替代方案方阵可逆是个很奢侈的条件。现实里的矩阵经常是长方形的方程个数多于未知数超定或者少于未知数欠定甚至行与行之间还线性相关。这时候 A⁻¹ 根本不存在但问题还得解。矩阵论给出的答案是两条腿走路一条是伪逆找一个“最像逆”的矩阵另一条是范数给“像不像”“大不大”定一个可以比较的尺子。4.1 矩阵范数给矩阵量尺寸的几种尺子向量的长度有三种必须满足的性质非负且只有零向量长度为零、数乘时长度按比例缩放、三角不等式。矩阵范数在此基础上多加一条‖AB‖ ≤ ‖A‖‖B‖叫相容性。没有这一条两个矩阵相乘之后长度可能爆掉范数就没法用来估计误差了。常用的几种里1-范数取的是“列绝对值和的最大值”∞-范数取的是“行绝对值和的最大值”2-范数等于最大奇异值Frobenius 范数则是把所有元素平方求和再开根号。范数定义几何含义计算量‖A‖₁各列元素绝对值之和的最大值对输入向量“最大列冲击”的放大幅度小‖A‖∞各行元素绝对值之和的最大值对输出向量“最大行累积”的上界小‖A‖₂最大奇异值谱意义下的最大拉伸倍数中‖A‖_F全部元素平方和开根把矩阵拉直当向量看长度小一份参考答案里证明过这样一组不等式对 n 阶方阵‖A‖₁ ≤ n‖A‖∞同时 ‖A‖∞ ≤ n‖A‖₁。证明的核心是引入一个中间量 S等于矩阵所有元素绝对值之和。一方面每一列的和不超过 S所以列和的最大值也不超过 S另一方面S 又可以看成 n 个行和相加自然不超过 n 倍的最大行和。两边一夹不等式就出来了。这个“先找一个夹在中间的粗放上界再两头收紧”的套路在矩阵分析里反复出现。4.2 Moore-Penrose 伪逆没有逆时的“替身”伪逆 G 要满足四个条件业内叫 Penrose 条件AGA A、GAG G、(AG)ᵀ AG、(GA)ᵀ GA。前两条说它在 A 能起作用的空间里和 A 互为“左右手”后两条说它产生的两个投影矩阵都是对称的。满足这四条且唯一的矩阵就是 Moore-Penrose 伪逆记作 A⁺。直接按定义求很难实操走的是满秩分解把 A 拆成 A BC其中 B 列满秩、C 行满秩秩都等于 A 的秩 r。这时伪逆有闭式G Cᵀ(CCᵀ)⁻¹(BᵀB)⁻¹Bᵀ这个式子的直观解释是Cᵀ(CCᵀ)⁻¹ 负责在行空间里做一次“投影加还原”(BᵀB)⁻¹Bᵀ 负责在列空间里做同样的事中间两个可逆的小矩阵保证了运算能落地。当 A 本身就是可逆方阵时B A、C I公式退化回 A⁻¹伪逆和逆在此重合。import numpy as np # 行和为 2 的四阶方阵行向量线性相关不满秩 A np.array([[1., 1., 0., 0.], [0., 1., 1., 0.], [0., 0., 1., 1.], [1., 0., 0., 1.]]) G np.linalg.pinv(A) # 默认按奇异值分解计算伪逆 print(np.round(A G A - A, 8)) # Penrose 条件一AGA A print(np.round(G A G - G, 8)) # Penrose 条件二GAG Gnp.linalg.pinv 内部走的是奇异值分解把小的奇异值截断掉比手写满秩分解更稳。两个输出都应该是零矩阵验证的是四条 Penrose 条件里最核心的两条。如果哪一条明显不为零说明数值截断的阈值设得不合适可以调 rcond 参数。4.3 相容条件与最小范数解有了伪逆线性方程组 Ax b 的处理就有了统一框架。有解的条件是 b 落在 A 的列空间里用伪逆写出来就是 AGb b等价地 (I − AG)b 0。这个条件一旦成立通解可以写成 x Gb (I − GA)z其中 z 是任意向量(I − GA) 是个投影矩阵负责把所有“零空间方向”的自由度都放进来。如果方程组不相容超定、又拟合不上那就退而求其次找让 ‖Ax − b‖ 最小的 x这个最小二乘解就是 Gb。如果方程组相容但有无穷多解欠定Gb 恰好是所有解里欧几里得范数最小的那个所以它叫最小范数解。一份参考答案里的四阶例子把 A 做初等行变换后能看出前三列线性无关、第四列可以被前面表示最终算出的相容条件是 a − b c − d 0。这个条件的形状很有意思它只跟右端向量的四个分量有关跟 A 的具体数值无关因为约束来自行空间的正交补。矩阵形态秩的情况A⁺ 的形态解的性质方阵可逆满秩就是 A⁻¹唯一解列满秩超定r n左逆 (AᵀA)⁻¹Aᵀ最小二乘解可能残差非零行满秩欠定r m右逆 Aᵀ(AAᵀ)⁻¹最小范数解无穷多解中的最短者一般情形r min(m, n)满秩分解公式先判相容再取最小范数解提示伪逆不等于逆。只有当矩阵本身可逆时两者才重合对长方形矩阵谈“逆”是没有意义的能谈的只有伪逆给出的某种最优近似。5. 常见误区与易混概念几组最容易踩坑的相近名词矩阵论这门课的坑多半不在计算量而在名词长得太像。两个概念只差一个字用错地方整道题的方向就偏了。下面这几组是手算时最容易犹豫的地方。5.1 概念层面三组长得像、用起来完全不同的东西第一组代数重数与几何重数。易混点在于两个都叫“重数”都跟特征值有关。混淆的原因是特征多项式给出一个数字零空间的维数给出另一个数字初学时容易默认它们相等。区分的方法很简单代数重数是 λ 在特征多项式里作为根的次数几何重数是 λI − A 的零空间维数也就是真正能凑出的线性无关特征向量个数在数值上几乎不可能相等。第二组Smith 标准形与 Jordan 标准形。易混点在于两者都是“标准形”都跟 λ 有关。混淆的原因是教材里它们经常连着出现中间只隔了几行推导。区分看处理对象Smith 标准形是对 λ-矩阵做初等变换得到的对角形元素是多项式Jordan 标准形是对数字矩阵做相似变换得到的块对角形元素是数。前者是过程后者是结果。第三组伪逆与逆。易混点在于符号只差一个上标公式长得也像。混淆的原因是方阵可逆时两者确实重合导致很多人以为伪逆只是逆的另一种写法。区分看适用范围逆要求方阵且行列式非零伪逆对任意矩阵都有定义而且伪逆一定存在、一定唯一。遇到长方形矩阵还去求逆就等于在问一个没有答案的问题。5.2 计算层面两个数字一抄错就全盘皆输的地方第四组1-范数取列和∞-范数取行和。易混点在于这两个下标看起来像是“行”和“列”的编号。混淆的原因是很多人凭直觉记成“1 对应第一行”“∞ 对应所有列”结果正好记反。区分可以记一个口诀1 是竖着数列∞ 是横着数行。验证办法是拿一个 2×3 的长方形矩阵试一下两个范数量纲都不一样一试就露馅。第五组广义特征向量链从哪一头开始。易混点在于递推式 (A − λI)P₂ P₁ 看上去应该从 P₁ 往后推。混淆的原因是方程写出来就是“后一个由前一个决定”的样子顺着读很自然。区分看可解性从链头往后推会碰到 (A − λI)x P₁ 无解的死胡同从链尾往前推每一步都保证有解。链尾的选法是先看 (A − λI)^k 的零空间挑一个不在 (A − λI)^{k−1} 零空间里的向量。注意这五组里前两组属于“想清楚就不会错”后三组属于“手一滑就错”。考试时前者靠理解后者靠固定流程——每次动笔前先把定义在草稿纸上写一遍比事后检查省时间。6. 矩阵指数的用法与边界一道微分方程组题的取舍最后一章落到一个具体场景上解线性微分方程组 dx/dt Ax f(t)给定初值 x(0)。这类题在矩阵论里几乎必考标准套路是把矩阵指数 e^{tA} 算出来再用积分因子法把非齐次项吸收进去。问题在于e^{tA} 有无数种算法选错一种就会在考场上耗掉半小时。一份参考答案里的例子系数矩阵是上三角的 [[1, 1, 1], [0, 1, 1], [0, 0, 1]]非齐次项只有第三行有一个 e^{2t}初值是 [1, 1, 1]。这个矩阵的特征值全是 1拆成 A I N 之后N 是严格上三角N³ 直接等于零矩阵。这一步是关键幂零矩阵的指数级数在有限项之后就截断了e^{tA} e^t(I tN t²N²/2)三项搞定不需要求任何特征向量。import numpy as np A np.array([[1., 1., 1.], [0., 1., 1.], [0., 0., 1.]]) N A - np.eye(3) # 幂零部分 print(np.allclose(N N N, 0)) # 验证 N 的三次方为零矩阵 t 0.5 # 幂零意味着级数在二次项之后截断只需算到 t²/2 项 M np.eye(3) t * N (t**2 / 2) * (N N) expm_tA np.exp(t) * M print(np.round(expm_tA, 6))np.allclose 用来在浮点意义下判断是否等于零直接写 会因为舍入误差永远判假np.eye(3) 是单位矩阵用来把 A 拆成“数量部分 幂零部分”最后的 np.exp(t) 是把标量因子提出来。整套流程对一般方阵不成立只对“特征值高度重合、且能拆成对角部分加幂零部分”的矩阵有效。真正需要判断的地方在这里场景推荐做法不建议的做法原因矩阵小、特征值重合度高拆成 λI N 用幂零截断逐项展开无穷级数级数有限项就停手算可控一般小矩阵、需要解析式先求 Jordan 形再用 Pe^{tJ}P⁻¹直接对 A 展开级数无穷项无法收敛到闭式数值求解、矩阵较大用库里的矩阵指数函数或数值积分手动求特征分解特征分解本身可能数值不稳只需要某个时刻的值常微分方程数值解法求出整个 e^{tA} 再代入算整个矩阵再取一列是浪费矩阵接近奇异、条件数大先做平衡化或缩放直接调用伪逆公式条件数会放大误差反过来有些场合这些工具就不该上。规模超过几十阶的数值问题手推 Jordan 形是自找麻烦因为 Jordan 形在浮点运算下根本不连续——矩阵元素微小的扰动会让一个块裂成好几个块。这时候该用的是 Schur 分解它同样是酉相似变换下的上三角形但数值上稳定得多。同样超定最小二乘别去碰正规方程 (AᵀA)⁻¹Aᵀb因为 AᵀA 的条件数是 A 的平方本来能算的题会算成一片噪声直接上 QR 或 SVD 才靠谱。我的习惯是每次拿到矩阵先问三句话它满秩吗特征值重不重题目要的是解析解还是数值解这三个问题的答案直接决定了该走 Jordan 那条路还是 QR 那条路。有一回赶时间对着一道特征值三重根的题硬求特征向量算了四十分钟发现零空间只有一维整页草稿作废从那以后我每次动笔前都先算一遍 rank(λI − A)确认几何重数够不够对角化再决定往哪个方向使劲。那份完整的参考答案里每一问都保留了中间的变换步骤和选取依据卡住的时候对照着看比自己从头推一遍快得多。希望帮到你。本文还有配套的精品资源点击获取