1. 为什么我建议你刷透这套线性代数习题线性代数这门课有个很诡异的特点上课听懂了作业会做了考试也过了但过了一个学期回头看发现自己好像什么都没剩下。矩阵乘法会算特征值会求但一旦遇到实际问题——比如图像压缩、推荐系统、电路分析——脑子里完全不知道从哪下手。这不是你一个人的问题我见过太多人卡在这个状态里。根源在于大多数教材和课程把线性代数讲成了一门“计算课”而不是“结构课”。你花了大量时间练习手算行列式、手算逆矩阵但这些运算在真实场景里几乎不会用纸笔完成。真正重要的是理解向量空间的结构、线性变换的几何含义、特征值背后的不变量思想。而这些东西光靠听课和做课后习题是远远不够的。这套习题的价值就在于它不是简单的计算练习而是逼着你去思考“为什么”。很多题目表面上在考一个计算实际上在考你对某个概念的理解深度。比如一道关于投影矩阵的题如果你只是套公式算出来那做完就忘了但如果你能想清楚为什么投影矩阵满足P²P、为什么它的特征值只能是0和1那你就真正理解了投影这件事的本质。适合谁来刷这套题我的判断是三类人第一类是在校学生正在学线性代数或者刚学完想通过刷题把基础打扎实第二类是准备考研或者出国考试的人需要系统性地复习线性代数的核心内容第三类是已经工作但觉得线性代数底子不牢的开发者想重新把这门课捡起来尤其是做机器学习、计算机图形学、信号处理方向的人。如果你属于这三类中的任何一类这套习题都值得你花时间认真刷一遍。但刷题不是盲目地从头做到尾。你需要有策略、有节奏、有重点。下面我会从几个维度拆解这套习题的使用方法包括知识体系的梳理、重点章节的突破策略、常见误区的规避以及如何把习题和实际应用联系起来。2. 这套习题到底覆盖了哪些核心知识板块2.1 从消元法到矩阵分解的主线逻辑这套习题的知识主线非常清晰基本上沿着“消元法→向量空间→正交性→特征值→矩阵分解”这条路径展开。很多人刷题的时候是跳着刷的今天做几道行列式的题明天做几道特征值的题结果脑子里始终没有形成一条完整的线索。我的建议是先通读一遍目录把每个章节之间的逻辑关系搞清楚。消元法是整条主线的起点。高斯消元不仅仅是一个计算工具它揭示的是矩阵的秩、线性方程组的解结构、以及LU分解的底层原理。习题里关于消元法的题目表面上看是在练计算实际上是在训练你对矩阵结构的敏感度。比如给你一个含参数的矩阵让你讨论参数取什么值时方程组有唯一解、无穷多解、无解——这类题目的核心不是计算而是理解秩和方程组解空间维数的关系。向量空间这一块是很多人觉得最抽象的部分。子空间、基、维数、秩-零度定理这些概念单独看都不难但放在一起就容易晕。习题里会有大量判断“某个集合是不是子空间”的题目这类题看起来简单但非常考验你对子空间三个条件的理解包含零向量、对加法封闭、对数乘封闭。我建议做这类题的时候不要凭直觉而是老老实实逐条验证养成严谨的习惯。正交性是连接理论和应用的关键桥梁。正交投影、最小二乘、Gram-Schmidt正交化、QR分解这些内容在数据拟合、信号处理里用得非常多。习题里关于正交性的题目往往计算量比较大但每一步都有明确的几何意义。做这类题的时候我习惯画一个简单的示意图把向量和投影的关系可视化这样不容易算错也更容易理解每一步在干什么。特征值和特征向量是整门课的高潮部分。从定义上看Avλv 这个式子很简单但它背后的含义非常深刻特征向量是线性变换下方向不变的向量特征值是这些方向上的伸缩比例。习题里会有大量求特征值、判断可对角化、计算矩阵幂的题目。这部分的关键不是算得快而是理解特征值的几何意义和代数性质之间的关系。2.2 各章节的难度分布与时间分配建议根据我自己的刷题经验这套习题的难度分布大致是这样的消元法和矩阵运算部分相对基础大概占总题量的20%难度系数在2-3之间满分5向量空间和线性无关性部分难度中等占25%左右难度系数3-4正交性和投影部分计算量大但思路清晰占20%难度系数3-4特征值和对角化部分难度最高占25%难度系数4-5剩下的10%是综合应用题难度系数4-5。时间分配上我不建议平均用力。如果你每天能拿出2小时刷题我的建议是消元法部分花2天快速过一遍重点放在向量空间和特征值这两块各花5-7天正交性花3-4天综合应用花2-3天。总共大概需要3-4周的时间前提是每天坚持。这里有个很多人会踩的坑在简单题上花太多时间导致难题没时间做。消元法的题你做得再熟练考试的时候也不会因为你手算高斯消元快而多给你分。真正拉开差距的是对向量空间结构和特征值理论的理解深度。所以我的策略是简单题快速过确认自己掌握了基本方法就往下走把时间留给需要深度思考的题目。2.3 哪些章节是考试和面试的高频考点如果你刷这套题是为了应付考试或者面试那有些章节你必须重点对待。根据我的观察以下内容是出现频率最高的考点出现频率典型题型重要程度矩阵可对角化的判定极高给定矩阵判断能否对角化求对角化矩阵必须掌握正交投影与最小二乘极高求投影矩阵解最小二乘问题必须掌握秩与零空间的关系高求零空间基判断解的存在性必须掌握行列式的性质与计算高利用性质简化计算证明恒等式重点掌握特征值与特征向量极高求特征值判断相似计算矩阵幂必须掌握Gram-Schmidt正交化中高将一组基化为标准正交基重点掌握奇异值分解中求SVD理解几何意义了解即可线性变换的矩阵表示中求变换矩阵判断是否线性重点掌握这张表不是让你只刷这些题而是帮你确定优先级。如果你的时间有限先把“必须掌握”的题型刷透再去看“重点掌握”的最后有时间再碰“了解即可”的。3. 刷题之前必须想清楚的几个策略问题3.1 先啃概念还是先刷计算这个问题我被问过很多次。我的答案是先花两天时间把概念过一遍但不要试图一次就理解透。线性代数的概念有个特点你第一遍看的时候觉得懂了做几道题之后发现其实没懂再回头看概念又有了新的理解。这是一个螺旋上升的过程。具体操作上我建议你这样做拿到一个章节先花30分钟把教材或者笔记上的定义、定理过一遍然后立刻开始做题。做题的时候不要翻书遇到卡住的地方先标记下来继续往下做。做完一轮之后再回头看那些卡住的题这时候你往往会有新的思路。如果还是不会再去翻书查定义和定理。千万不要陷入“概念完美主义”的陷阱。有些人非要把每一个定理的证明都搞懂才开始做题结果花了大量时间在证明上题目一道没做。证明当然重要但很多证明的灵感恰恰来自于做题的经验。你先做几道题对概念有了具体的感知再回头看证明理解会深刻得多。3.2 手算练习和编程验证怎么配合这套习题里的计算题我强烈建议你手算一遍然后用Python或者MATLAB验证。手算的目的是训练你对矩阵结构的敏感度编程验证的目的是确认你的答案是否正确同时让你看到计算机是怎么处理这些问题的。比如求一个3×3矩阵的特征值你手算得到特征多项式解出特征值这个过程能让你理解特征值和矩阵元素之间的关系。但手算容易出错尤其是符号运算所以用代码验证一下很有必要。Python里用numpy.linalg.eig就能直接算特征值几行代码的事。更重要的是编程验证能帮你建立“矩阵运算的直觉”。比如你手算一个矩阵的秩是2用代码算出来也是2但如果你用代码去算一个100×100的随机矩阵的秩你会发现它几乎总是满秩的。这个观察能让你理解“秩亏”是一个多么特殊的条件在随机情况下几乎不会发生。我常用的验证代码模板是这样的import numpy as np # 定义矩阵 A np.array([[1, 2, 3], [4, 5, 6], [7, 8, 10]]) # 计算秩 rank np.linalg.matrix_rank(A) print(f矩阵的秩: {rank}) # 计算特征值和特征向量 eigenvalues, eigenvectors np.linalg.eig(A) print(f特征值: {eigenvalues}) print(f特征向量:\n{eigenvectors}) # 验证 Av λv for i in range(len(eigenvalues)): v eigenvectors[:, i] lam eigenvalues[i] print(fAv - λv 的范数: {np.linalg.norm(A v - lam * v)})最后那行验证 Avλv 的代码特别有用它能让你直观地看到数值计算中的误差量级。你会发现即使理论上 Av-λv 应该等于零向量实际计算出来它的范数大概是 10^{-15} 量级这就是浮点运算的精度极限。3.3 错题本的正确打开方式刷题不整理错题等于白刷。但错题本不是简单地把错题抄一遍而是要记录三样东西第一这道题考的是什么概念第二我当时为什么做错了第三正确的思路应该是什么样的。我见过很多人的错题本就是把题目和正确答案抄一遍这种错题本没有任何价值。真正有用的错题本应该像这样题目来源特征值章节第12题 考查概念矩阵可对角化的条件 我的错误直接计算了特征值发现有三个不同的特征值就判断可以对角化。但实际上题目里的矩阵是实数矩阵特征多项式有一个实根和一对共轭复根在实数域上不可对角化。 正确思路先判断特征值是否都在实数域内再判断每个特征值的几何重数是否等于代数重数。对于实矩阵如果存在复特征值在实数域上就不能对角化。 类似题目第15题、第18题这种错题记录方式过一个月回头看你能快速回忆起当时的思维盲区。而且你会发现很多错误其实是同一类问题比如“忽略了数域的限制”“混淆了代数重数和几何重数”“忘记验证线性无关性”等等。把这些模式总结出来比刷一百道题都有用。3.4 遇到卡壳时怎么突破刷题遇到卡壳太正常了关键是卡住之后怎么办。我的经验是分三步走第一步重新读题确认自己理解对了题意第二步回到定义看看是不是某个概念理解有偏差第三步如果还是不会先放一放做几道其他题再回来。这里有个反直觉的建议卡住的时候不要立刻看答案。看答案会让你产生“我懂了”的错觉但实际上你只是看懂了别人的思路并没有形成自己的思考路径。我建议至少卡30分钟再去看答案而且看答案的时候不要只看结果要看每一步的推理逻辑然后合上答案自己再推一遍。还有一个技巧是“降维打击”。如果你在一个n维的一般性问题上卡住了先试试n2或n3的特殊情况。比如你搞不清楚一个关于任意矩阵的命题先拿一个2×2的具体矩阵算一遍看看结论成不成立。很多时候特殊情况的直观理解能帮你找到一般情况的证明思路。4. 重点章节的突破方法和典型题拆解4.1 向量空间与子空间判定从定义出发的笨办法向量空间的题目看起来抽象但判定方法其实很机械。要判断一个集合W是不是向量空间V的子空间只需要验证三条W非空通常验证零向量在W里、W对加法封闭、W对数乘封闭。这三条缺一不可。我见过最常见的错误是只验证了加法封闭就下结论。比如题目问“所有满足xy1的向量(x,y)是否构成R²的子空间”有人看到两个这样的向量相加(x1y1)(x2y2)2≠1就说不构成子空间。这个结论是对的但理由不完整。更完整的回答是首先零向量(0,0)不满足001所以这个集合根本不包含零向量直接就不可能是子空间。再比如“所有满足xy0的向量是否构成子空间”这个集合包含零向量对加法封闭因为(x1y1)(x2y2)000对数乘封闭因为c(xy)c·00所以是子空间。这个子空间实际上就是直线y-x是一维的。做这类题的时候我建议你养成一个习惯先看零向量在不在如果不在直接排除如果在再验证另外两条。这个顺序能帮你节省不少时间。还有一个高频考点是求子空间的基和维数。比如给你一个由几个向量张成的子空间让你求它的基。标准做法是把这些向量作为行向量组成矩阵做行变换化为行阶梯形非零行对应的向量就是一组基。但这里有个细节行变换会改变列空间但保持行空间不变。所以如果你要求的是列空间的基不能直接对行做变换而应该对列做变换或者对转置矩阵做行变换。4.2 特征值与对角化几何重数和代数重数的博弈特征值这块是整门课最容易出综合题的地方。核心就一个问题给定一个n×n矩阵A它能不能对角化能的话怎么找到对角化矩阵判断可对角化的标准流程是这样的先求特征多项式det(A-λI)0得到所有特征值。对于每个特征值λ求它的代数重数作为特征多项式根的重数和几何重数对应特征空间的维数即n-rank(A-λI)。如果每个特征值的代数重数都等于几何重数那么A可对角化否则不可对角化。这里有个很多人会混淆的点代数重数永远大于等于几何重数但两者不一定相等。比如矩阵[[1,1],[0,1]]特征值λ1的代数重数是2但A-I[[0,1],[0,0]]的秩是1所以零空间维数是1几何重数也是1。两者不等所以这个矩阵不可对角化。习题里经常出现的一类题是给定一个含参数的矩阵问参数取什么值时矩阵可对角化。这类题的解题思路是先求特征值通常会有重根然后对重根求几何重数令几何重数等于代数重数解出参数的值。还有一类题是计算矩阵的幂A^k。如果A可对角化APDP^{-1}那么A^kPD^kP^{-1}而D^k只需要把对角线元素取k次方即可。这个方法比直接连乘效率高得多。但如果A不可对角化就需要用Jordan标准形计算会复杂很多。习题里通常只要求可对角化的情况但你应该知道不可对角化时该怎么处理。4.3 正交性与最小二乘投影的几何直觉正交投影是线性代数里最具有几何直观的部分。给定一个子空间W和一个向量bb在W上的投影是W中距离b最近的向量。这个“最近”是在欧几里得距离的意义下说的也就是最小化||b-w||。如果W有一组标准正交基{q1, q2, ..., qk}那么投影就是b在每個基向量上的分量之和proj_W(b) (b·q1)q1 (b·q2)q2 ... (b·qk)qk。如果W的基不是标准正交的就需要先做Gram-Schmidt正交化或者用投影矩阵公式P A(A^T A)^{-1}A^T。最小二乘问题就是投影的一个应用。当我们解一个无解的方程组Axb时我们找的是使||Ax-b||最小的x。这个x对应的Ax就是b在A的列空间上的投影。所以最小二乘解满足A^T A x A^T b这个方程叫做正规方程。习题里关于最小二乘的题目通常会给一组数据点让你拟合一条直线或者抛物线。做这类题的关键是正确构造矩阵A和向量b。比如拟合直线y c0 c1 x给定数据点(x1,y1), ..., (xm,ym)那么A的每一行是[1, xi]b的每个分量是yi。然后解正规方程得到c0和c1。这里有个数值计算上的注意事项直接解正规方程A^T A x A^T b在数值上不稳定因为A^T A的条件数是A的条件数的平方。实际应用中通常用QR分解来解最小二乘问题先对A做QR分解然后解Rx Q^T b。习题里可能不会涉及这个细节但你应该知道这个区别。4.4 行列式的计算技巧与常见陷阱行列式的计算是很多人的噩梦尤其是4×4以上的行列式硬算展开会非常痛苦。但其实习题里出现的行列式都有规律掌握了技巧之后计算量并不大。最常用的技巧是利用行列式的性质简化计算某一行加上另一行的倍数行列式不变交换两行行列式变号某一行有公因子可以提到行列式外面。通过这些操作把行列式化为上三角形式然后对角线元素相乘即可。另一个常用技巧是按行或按列展开。如果某一行或某一列有很多零按那一行或列展开能大大减少计算量。习题里经常出现这种“稀疏”的行列式就是考你知不知道选择展开的行列。常见的陷阱包括忘记交换行时要变号把某一行乘以一个数加到另一行时误以为行列式也要变在按行展开时忘记代数余子式的符号是(-1)^{ij}。这些错误看起来很小但会导致最终结果完全错误。还有一个容易忽略的点是行列式为零意味着矩阵不可逆但行列式不为零并不意味着矩阵一定可对角化。这两个概念经常被混淆。行列式为零等价于矩阵有零特征值但矩阵可不可对角化取决于特征值的几何重数和代数重数是否相等和行列式是否为零没有直接关系。5. 把习题和真实应用场景连起来5.1 图像压缩背后的线性代数图像压缩听起来很高级但它的核心就是线性代数里的基变换。一张灰度图像可以看成一个矩阵每个元素是像素的灰度值。如果直接存储这个矩阵数据量很大。但如果我们找到一组更好的基使得图像在这组基下的表示是稀疏的大部分系数接近零那么只需要存储那些非零的系数就能近似还原图像。这就是JPEG压缩的基本原理。它把图像分成8×8的小块对每个小块做离散余弦变换DCT然后把高频部分的系数量化很多变成零最后只存储非零系数。DCT本质上就是一种正交变换它的基向量是余弦函数。习题里关于正交基和基变换的题目如果你只是当成计算题来做那就太可惜了。你可以试着用Python读入一张图片做DCT变换把高频系数置零再逆变换回来看看图像变成了什么样。这个实验能让你直观地理解“基变换”和“稀疏表示”的含义。import numpy as np from scipy.fftpack import dct, idct from PIL import Image # 读入图像并转为灰度 img np.array(Image.open(test.jpg).convert(L), dtypefloat) # 对每个8x8块做DCT h, w img.shape img_dct np.zeros_like(img) for i in range(0, h, 8): for j in range(0, w, 8): block img[i:i8, j:j8] img_dct[i:i8, j:j8] dct(dct(block.T, normortho).T, normortho) # 保留左上角低频系数其余置零 keep 4 # 保留4x4的低频系数 mask np.zeros_like(img_dct) for i in range(0, h, 8): for j in range(0, w, 8): mask[i:ikeep, j:jkeep] 1 img_compressed img_dct * mask # 逆DCT还原 img_recon np.zeros_like(img) for i in range(0, h, 8): for j in range(0, w, 8): block img_compressed[i:i8, j:j8] img_recon[i:i8, j:j8] idct(idct(block.T, normortho).T, normortho) Image.fromarray(img_recon.astype(np.uint8)).save(compressed.jpg)这段代码跑一遍你就能亲眼看到只保留4×4低频系数时图像变成了什么样。你会发现图像变模糊了但整体轮廓还在。这就是线性代数在图像压缩里的直接应用。5.2 推荐系统里的矩阵分解推荐系统的核心问题是给定一个用户-物品评分矩阵预测用户对未评分物品的评分。这个矩阵通常非常大且稀疏大部分用户只评过很少的物品。矩阵分解的思路是把这个大矩阵近似分解成两个小矩阵的乘积R ≈ U × V^T其中U是用户特征矩阵V是物品特征矩阵。这个分解和习题里的LU分解、QR分解、SVD在思想上是相通的都是把一个复杂矩阵拆成几个简单矩阵的乘积从而揭示矩阵的内在结构。不同的是推荐系统里的矩阵分解通常不要求精确相等而是最小化近似误差并且会加正则化项防止过拟合。习题里关于SVD的题目如果你理解了它的几何意义——任何矩阵变换都可以分解为旋转、缩放、再旋转——那你就能理解为什么SVD在数据压缩、降维、推荐系统里这么有用。SVD给出的奇异值告诉你哪些方向上的信息量最大保留前k个奇异值就相当于保留了最重要的k个特征。5.3 电路分析中的线性方程组基尔霍夫定律是电路分析的基础它本质上就是线性方程组。节点电流定律说每个节点的电流代数和为零回路电压定律说每个回路的电压代数和为零。对于一个有n个节点、m条支路的电路你可以写出n-1个独立的节点方程和m-n1个独立的回路方程组成一个线性方程组。这个方程组的系数矩阵通常有很好的结构节点-支路关联矩阵的每一列只有两个非零元素1和-1分别对应支路的起点和终点。这个矩阵的秩等于n-1假设电路连通零空间的维数是m-n1正好对应独立回路数。这些概念和习题里的秩-零度定理、零空间、行空间完全对应。如果你做过电路分析的题再回头看线性代数里的线性方程组你会发现它们说的是同一件事。线性代数给了你一套统一的语言来描述和分析这些问题这就是为什么这门课这么重要。6. 刷完这套题之后你该达到什么水平刷完这套习题你应该能做到以下几件事看到一个矩阵能快速判断它的秩、零空间维数、列空间维数给定一个线性方程组能判断解的存在性和唯一性能写出通解给定一个矩阵能求特征值和特征向量能判断是否可对角化给定一个子空间能求它的正交补和投影矩阵理解最小二乘、SVD、矩阵分解的基本原理和应用场景。但更重要的是你应该建立起一种“线性代数式”的思维方式遇到复杂问题时先把它写成矩阵形式然后分析矩阵的结构秩、特征值、条件数再选择合适的分解方法来求解。这种思维方式在机器学习、计算机图形学、信号处理、优化理论里都是通用的。我自己刷这套题的时候最大的收获不是学会了多少计算技巧而是理解了“结构比计算重要”这个道理。一个矩阵的秩告诉你它的信息量特征值告诉你它的不变量奇异值告诉你它的能量分布。这些结构性的信息比具体的数值重要得多。最后分享一个我自己的习惯每刷完一个章节我会合上书拿一张白纸试着把这一章的核心概念、定理、方法用自己的话写一遍。如果能写出来说明我真的理解了如果写不出来说明我只是在机械地做题。这个习惯帮我节省了大量复习时间也让我对线性代数的理解深入了很多。