简介线性代数教材《Linear Algebra with Applications》第十版全球版由Steven J. Leon和Lisette de Pillis合著是一本广泛应用于大学课堂的经典教材。全书共8章、556页内容覆盖线性代数课程研究组LACSG推荐的全部核心主题并新增大量习题与应用实例适合高校本科生系统学习也可供高年级学生或自学者复习巩固。每章末尾设有MATLAB计算机练习帮助读者将抽象理论转化为实际计算能力适配一学期或两学期的教学安排。资源为单个PDF文件压缩包仅6.69MB排版清晰、附带书签便于按章节导航阅读目前已有1055人浏览学习适合作为课程参考书或考研基础复习材料。读者可从中掌握矩阵运算、向量空间、行列式、特征值与特征向量、正交性、数值方法等核心内容并通过应用实例理解线性代数在工程、计算机科学等领域的实际价值。1. Linear Algebra with Applications 10th一本该当参考手册用的工科线代教材拿到 Linear Algebra with Applications 10th 的人大多不是奔着数学系那种“证明链完整”去的而是带着一个更现实的问题方程组怎么解、矩阵怎么分解、特征值算出来能干什么。这本教材的独特之处在于它把线性代数按“先算、后证、再应用”的顺序铺开每章开头抛一个真实场景再用矩阵语言把场景翻译成算题。我当年第一次翻它是被课后习题里大量带应用背景的题吸引的后来才发现真正能救命的是它把工程问题抽象成矩阵的全过程。这篇笔记就按我自己的使用路径来写先讲这本书的内在结构该怎么读再讲怎么用代码把书里的手算步骤变成可验证的模拟实验最后把最容易踩的坑和三个能直接迁移到工作中的落地场景拆开讲。2. 按“三闭环”读这本书从方程组消元到特征值的递进关系2.1 第一闭环线性方程组与矩阵消元是全书的地基教材开头几章反复在讲一件事情所有线性方程组都可以写成 Ax b而解的过程只靠行变换。很多新手会轻视这部分觉得高斯消元初中就见过但这一版在后面引入矩阵乘法、秩、逆矩阵时全都在用消元的视角重新解释。我一般不建议跳读前两三章哪怕你自认为会解方程也要把“增广矩阵行最简形”这个工具练熟因为后续所有概念包括向量空间的基、线性相关的判定、最小二乘的推导最终都会回到“行变换会不会产生零行”这个问题上。这一版本地化做得比较好的一点是把“有解、无解、无穷多解”三种情况的几何意义直接放在例题里。比如给定三条直线是否交于一点对应到增广矩阵上就是某一行变成 [0, 0, 0 | c]c 非零则矛盾。你可以把这些题当成判断自己是否真正理解秩的试金石。如果只是机械地背“秩等于增广矩阵秩则有解”遇到参数方程组还是会翻车。实操层面我会在读完第一章后强制自己完成一类任务给定任意 5×5 矩阵不借助计算器手工判断它的秩是否小于行数并写出对应的消元过程。这个动作能把“矩阵乘法中交换次序导致结果不同”这些细节一并检验掉。做到这个程度再进入向量空间那一章心里才有底。2.2 第二闭环向量空间与线性变换应用题的抽象能力都卡在这里这本书从这一部分开始才真正进入“线性代数应用”的核心。向量空间的定义看似抽象但教材用了大量例子把平面中的点和箭头、多项式、连续函数都装进同一个坐标系里。我读过之后的体会是线性变换其实就是“保持加法和数乘”的映射而矩阵只是这种映射在某个基下的坐标表。很多工程问题之所以能用线性代数求解不是因为问题本身有矩阵而是因为它可以被看成线性变换然后我们才去找对应的矩阵。这里有个容易忽视的点基的选取直接决定矩阵长得像不像对角矩阵。书里在讲坐标变换时会给你一组新基下的矩阵表达式如果选择特征向量作为基变换矩阵就会变成对角矩阵。我对这个结论印象极深因为后面做数据降维时PCA 做的事情本质上就是寻找一组新基让协方差矩阵对角化。教材在这里安排了大量的二维旋转变换、投影变换例题目的就是让你习惯“给定一个几何操作写出对应矩阵”的过程。检验自己是否过关的办法我建议做这组小练习写出“先旋转 45 度再拉伸 x 轴”这个复合变换对应的矩阵然后交换两个操作的顺序对比两个结果是否相同。这个练习能直接帮你建立矩阵乘积顺序与操作先后顺序的对应关系也是后面理解特征分解的直观入口。如果这块没搞懂后面学奇异值分解时矩阵分解的几何意义会彻底变成黑匣子。2.3 第三闭环特征值与对角化全书最容易被低估的一章特征值这一章表面是算多项式根实际上它是整本书通向工程应用的那扇门。教材先介绍了特征向量如何在线性变换下保持方向不变再把特征多项式、代数重数、几何重数分开讲最后落到对角化条件和幂迭代算法。我的建议是把时间花在“如果一个矩阵可对角化意味着什么”这个问题上而不是花在求三阶矩阵特征值的手工计算上。后者用工具一秒钟就能解前者决定你能否理解后面所有现代算法。这一版对对称矩阵讲得很充分对称矩阵特征值总是实数、特征向量可以正交归一化这个性质是整个最小二乘和 SVD 的数学基础。读到这里可以把前面学过的所有概念串一遍对称矩阵对角化时那个过渡矩阵恰好是正交矩阵它的逆等于转置于是对角化公式变成 A QΛQᵀ。这个形式会一遍又一遍地出现在数据科学的协方差分解里也是我们后面用 NumPy 验证时最常写的公式。学完这一章我建议做一个强制动作随便取一个 3×3 对称矩阵手算它的特征值再手算对应特征向量然后验证 A v λ v 是否成立。这个动作能同时检验你对代数重数、归一化、符号选择的掌握程度。很多人在这一步发现自己之前的“会算”只是会套公式并不知道算出来的向量为什么是这个方向。3. 用 SymPy 和 NumPy 复算全书例题最小可运行验证方案3.1 解线性方程组从增广矩阵到行最简形的复算最小命令教材里大量例题是“给定增广矩阵求行最简形并判断解的结构”。手算时最怕符号看错所以我会用 SymPy 做复算先确认答案再回头把手算过程补清楚。SymPy 的Matrix对象自带rref()方法返回从零开始的行最简形非常适合验证书上的中间结果。from sympy import Matrix A Matrix([[2, 1, -1], [-3, -1, 2], [-2, 1, 2]]) b Matrix([8, -11, -3]) M A.row_join(b) # 构造增广矩阵 [A | b] rref_mat, pivot_cols M.rref() print(行最简形) print(rref_mat) print(主元列位置, pivot_cols)row_join的作用是把向量 b 作为新的一列拼到 A 右边构造出增广矩阵。rref()返回两个值第一个是行最简形矩阵第二个是主元列的下标元组。看到主元列位置如果包含了最后一列说明方程组无解因为出现了 [0, 0, 0 | c] 这样的矛盾行。这个判断过程比肉眼盯着消元结果可靠得多。当方程组有无穷多解时SymPy 还能继续帮忙。用M.nullspace()可以求出零空间的一组基配合特解就能拼出通解。教材里强调“自由变量”这个概念代码里对应的就是主元列之外的那些列。你可以把 pivot_cols 之外的列编号记下来再对照行最简形手动写出参数化通解这样既能验证答案又不至于因为直接用solve而丢失对自由变量结构的理解。3.2 验证特征值与对角化符号计算与数值计算必须分开跑特征值这一章的例题手算二阶矩阵还能应付三阶矩阵就容易出错。我的习惯是先让 SymPy 给出符号解因为符号解可以保持根号、分数这类精确形式方便跟教材答案逐项对照遇到高次多项式时SymPy 会返回复数域上的精确根这时候再切换到 NumPy 拿数值解做工程验证。from sympy import Matrix, symbols A Matrix([[4, -5], [2, -3]]) lam symbols(lambda) p A.charpoly(lam).as_expr() print(特征多项式, p) eigen_dict A.eigenvals() # 返回 {特征值: 代数重数} print(特征值与重数, eigen_dict) for val, mult in eigen_dict.items(): vec A - val * Matrix.eye(A.rows) print(f特征值 {val}: 零空间基 , vec.nullspace())charpoly(lam)生成符号特征多项式as_expr()让它以可读形式输出。eigenvals()返回一个字典键是特征值值是对应的代数重数。注意特征值以根式形式出现时不同教材可能用不同等价写法比如二次根式开方顺序所以和书上答案不完全一样时先化简再下结论。数值侧我一般用 NumPy 检查对称矩阵的性质因为eigvalsh专门针对对称矩阵做了数值稳定优化。如果你把书上的对称矩阵拿eigh算特征向量得到的矩阵每一列都是归一化后的特征向量而且满足 QᵀQ I。这时候可以再验证一下 A ≈ QΛQᵀ误差在浮点精度范围内就算通过。符号解和数值解结果不一致时优先怀疑符号化简不彻底而不是矩阵本身有问题。3.3 最小二乘超定方程教材例题换成分数噪声后的参数变化最小二乘那一章教材讲了正规方程 AᵀAx Aᵀb 和几何意义。代码验证时我不用正规方程直接用np.linalg.lstsq因为它内部用的是 QR 分解数值上比正规方程更稳不会因为 AᵀA 条件数太大而放大误差。更重要的是它返回的残差项能直接看出拟合质量。import numpy as np x np.array([0, 1, 2, 3, 4, 5], dtypefloat) y np.array([1.2, 1.8, 3.1, 3.9, 5.1, 5.8], dtypefloat) X np.column_stack([np.ones_like(x), x]) coeff, residuals, rank, sv np.linalg.lstsq(X, y, rcondNone) print(拟合系数k , coeff[1], b , coeff[0]) print(残差平方和, residuals)column_stack把常数列和 x 列拼成设计矩阵第一列对应截距项第二列对应斜率这就是教材里“模型是 y kx b线性的其实是系数”这句话的代码表现。rcondNone让 NumPy 自动选择合适的奇异值截断阈值一般数据不用改。残差长度可能为 0只有当实际约束数目大于参数数目时才会返回非空残差这一点我刚用时也困惑过。如果想看正规方程和 lstsq 的差别可以手动算np.linalg.inv(X.T X) X.T y把结果对比一下。数据噪声不大时两者几乎一样但加上异常点或让 x 列高度相关后正规方程的误差会被放大这就是为什么库函数默认不用正规方程。这个对比能很好地回答“教材公式能不能直接上生产”的问题。4. 自学这本教材最常见的 5 个坑现象、原因与排查顺序4.1 学了前两章就弃书原因是证明太多、场景太少现象很多人从线性方程组开始按顺序读到向量空间那一章就停下来后面章节一拖再拖。原因不是教材太难而是读法错了。这套教材的习题前半部分是计算题后半部分是带背景的应用题很多人只做计算题不做应用题于是大脑接收到的全是抽象符号没有“这能解决什么”的正反馈。解决调整阅读顺序每章先看章末的“本章应用场景”或带有工程语境的例题再回头看前面的定义和推导。我个人的做法是读每一章时先把结论抄在便利贴上比如“特征值能告诉我在哪个方向上伸缩最大”然后带着这个结论去读证明证明就变成了解释而不是负担。这比按部就班精读更容易坚持。4.2 手算答案和代码结果不一致原因在浮点误差与符号化简现象书上例题的答案是 1/3、√5 这种精确值你手算也是这么写的但用 NumPy 一跑出来的是 0.33333333 和 2.2360679于是怀疑自己算错了。其实两边都是对的只是浮点数无法精确表示分数和无理数。解决判断一致性时先做符号计算把 SymPy 的结果和书上答案化简对比确认逻辑后再用 NumPy 做工程近似。如果符号计算和手算对不上优先检查增广矩阵是否拼接错误、有没有把列看成行如果只有数值对不上那就是精度问题。用np.allclose代替判断数值相等这已经是工程里的基本习惯了。4.3 把“线性变换”和“矩阵乘法”当成同一个概念导致复合变换顺序全乱现象学到旋转加缩放时写出了错误顺序比如想“先旋转再缩放”却写成缩放矩阵乘以旋转矩阵还觉得矩阵乘法顺序无所谓。原因是在第一闭环时只学了“怎么乘”没学“乘法的左右位置代表什么”。解决回到矩阵与线性变换的对应关系用“作用顺序靠右”来记向量被矩阵作用时写在矩阵右边所以先执行的变换写在更右边。于是“先旋转再缩放”就是 Scale Rotate v。我推荐你找一道二维变换题把两种顺序的矩阵都算出来观察结果差异这个记忆会非常牢固。以后遇到坐标变换、基变换的时候这个规则能直接推广。4.4 做题全会一遇到应用题就不知道从哪抽象出矩阵现象教材里“电路网路的电流方程”“力学系统中的力平衡”这类题题干里没有出现任何矩阵于是你不会做。原因是你已经习惯了矩阵摆在题面里等着你算而不能把物理关系翻译成线性方程。解决先写“未知量列表”再写“约束关系列表”把每个约束写成一行。比如电路题里未知量是各支路电流约束是基尔霍夫定律每条定律就是一行方程整理成增广矩阵。这个过程中不要求一步到位先把方程组写对矩阵只是机械的整理结果。多做三道这种翻译题再看到应用题就不会发怵。4.5 对称矩阵特征值符号解显示为复数数值解却是实数现象用 SymPy 求某个对称矩阵的特征值结果里出现复数单位 i但用 NumPy 算出来的全是实数于是怀疑矩阵不是对称矩阵。原因是对称矩阵的特征多项式可能存在不可约的三次因子符号计算返回的 Cardano 公式里含复数中间量约简后实数部分才是最终结果。解决先用A.is_symmetric()确认矩阵是否对称再用正则化展开特征多项式对根式表达式做simplify后观察是否只剩实数最后用数值方法交叉验证。这类问题在教材应用题的验证环节很常见搞清楚它就不会在符号和数值之间来回自我怀疑。5. 把教材例题搬到工程建模最小二乘、SVD 与幂法三个迁移场景5.1 数据拟合把最小二乘公式从例题搬到回归任务教材里最小二乘的例题通常是给定几个点求最佳拟合直线。工程中这个模式可以直接平滑迁移到带截距的多元回归只要把每个特征列和常数 1 列拼进设计矩阵 X剩下的就是同一个问题。区别在于工程数据量更大、特征量纲不同需要用标准化来缩短特征值分布的跨度否则 XᵀX 的条件数会爆表。import numpy as np X_raw np.array([[1, 10], [2, 20], [3, 15], [4, 30]], dtypefloat) y np.array([2.1, 4.9, 4.0, 8.2], dtypefloat) X np.column_stack([np.ones(X_raw.shape[0]), (X_raw - X_raw.mean(axis0)) / X_raw.std(axis0)]) coeff, res, rank, sv np.linalg.lstsq(X, y, rcondNone) feature_effect coeff[1:] / X_raw.std(axis0) print(截距, coeff[0]) print(各特征标准化后的系数, feature_effect)这里先把特征标准化拟合出的系数表达的是“该特征变化一个标准差时目标变化多少”这也是我讲课时最常用的一个解释技巧。要注意column_stack后第一列全是 1对应截距项若 X 本身已包含常数列再用lstsq会得到共线解表现为系数互相抵消。这个问题在教材的简单例题里不会出现因为只有两个变量工程里特征一多就显得特别真实。5.2 图像压缩中的 SVD用低秩近似理解“删数据即保留信息”教材介绍 SVD 时常用矩阵分解的形式很少直接讲它跟数据压缩的关系。我是在做一个图像处理 Demo 时突然意识到SVD 低秩近似就是“保留能量最大的几个方向丢掉其他方向”的线性代数表达。灰度图是一个 m×n 矩阵它的奇异值按从大到小排列前 k 个奇异值对应的重构矩阵就是最优的 k 秩逼近。from numpy.linalg import svd import numpy as np # 假设 img_gray 是已经读取的灰度图shape 为 (H, W) U, S, Vt svd(img_gray, full_matricesFalse) k 30 compressed U[:, :k] np.diag(S[:k]) Vt[:k, :] print(压缩前奇异值数量, len(S), 压缩后保留, k)full_matricesFalse让 U、Vt 以瘦身形式返回避免产生巨大的正交方阵实际工程中几乎都用这个参数。np.diag(S[:k])把奇异值向量变成对角矩阵因为截断后的 S 是一维数组不能直接跟 U、Vt 做矩阵乘法。保留的奇异值个数 k 不是拍脑袋定的可以计算前 k 个奇异值平方和占总平方和的比例比如想保留 90% 能量就选对应 k。这个比例概念在教材里对应的是“奇异值分解与矩阵秩的关系”迁移过来就变成了工程标准。5.3 迭代算法用幂法理解 PageRank 式收敛到底在收敛什么教材讲幂法是为了求最大特征值我当时觉得这是个纯数值技巧直到后来接触图数据里的传播算法才意识到很多收敛算法本质上是幂法在不同矩阵上的变体。幂法不断用矩阵作用于向量、再归一化向量会逐渐被主特征向量吸引。如果想了解收敛性就要看教材里那个结论收敛速度取决于第二特征值与第一特征值之比比值越接近 1 收敛越慢。import numpy as np def power_iteration(A, num_iter50): v np.ones(A.shape[1]) for _ in range(num_iter): v A v v v / np.linalg.norm(v) return v A np.array([[1.0, 0.5], [0.5, 1.0]]) v power_iteration(A) lam float(v A v / (v v)) print(主特征向量, v) print(主特征值, lam)每一步的归一化是关键如果不做归一化向量长度会指数增长或衰减数值直接溢出。v A v / (v v)是瑞利商用来从特征向量估计特征值。这个写法在教材后面讲瑞利商时才会出现但如果提前拿它来验证幂法结果印象会深很多。实战中若要快速验证一个图是否“收敛到稳定分布”可以先检查图的邻接矩阵是不是非负的、有没有规范的转移概率特性再决定是否用幂法而不是直接套 PageRank 的现成库。6. 带着“可计算性”读每一节我最后养成的一个习惯读第三遍这本书时我总结出一个让效率翻倍的习惯每读完一节先不急着做题而是问自己三个问题——这一节输入是什么、输出是什么、要保留到下一节的结论是哪条。比如特征向量那节输出就是“给定矩阵和特征值求一个非零向量”下一节要用到的结论是“不同特征值对应的特征向量线性无关”。如果能把这三个问题写在一张纸上就算没做后面的计算题这一节的核心也抓住了。如果需要动手验证我的最低成本方案是维护一份 Jupyter 笔记每节只写一个最小可运行代码块。这个代码块不一定完整复现书中例题而是把该节最核心的结论用十行以内代码表达出来。比如读完正交矩阵那一节我的代码块只有三行构造一个随机正交矩阵、检查 QᵀQ、检查逆矩阵等于转置。这个动作听起来简单但能强制把“看懂证明”转成“可复算结论”。我见过太多人说“证明看懂了”一让他写验证代码连矩阵都构造不出来。后来我把这个流程固定成一个 15 分钟的收尾动作先口头复述本节结论再跑一个最小验证最后把验证结果截图贴进笔记。整本书读完后这几百个最小验证代码块就变成了一本个人版习题集比翻书找答案快得多。有一次参加一个技术方案评审对方讲矩阵分解选型我当场用笔记里的 SVD 验证代码算了一下内存占用和误差直接省去了事后返工。那次以后我更加确信教科书里的公式只有在变成能运行的代码后才算真正进了你的工具箱。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?