简介:《线性代数导论》第5版中文版由Gilbert Strang撰写、高等教育出版社出版,是MIT 18.06公开课配套教材,面向具备一定数学基础的本科生、研究生及工程、计算机、数据科学领域从业者,帮助读者系统建立线性代数知识体系并理解其几何本质。资源为1个PDF文件,压缩包约46.25MB,完整呈现原书内容,涵盖向量与线性组合、矩阵四个基本子空间、行列式、特征值与特征向量、奇异值分解、最小二乘法、线性变换、复数矩阵与快速傅里叶变换等核心章节,新版还加入概率统计与数据理解内容。书中每节开头附概要,便于快速回顾与记忆,并配有视频课程、习题解答与MATLAB/Python代码等教学资源,适合作为高校课程主教材或自学参考,也可用于机器学习、信号处理、图像识别等方向的数学基础夯实。目前已有3303人学习。
1. 为什么我劝你先别急着翻到特征值那一章
如果你正在搜「线性代数导论 GilbertStrang」,大概率不是想听人复述行列式怎么展开。你可能是被网课里那句“矩阵就是线性变换”点了一下,回头翻自己手头的教材,发现满篇定义堆砌,根本串不起来;也可能是做图像处理、机器学习或者控制方向,发现自己卡在特征分解、奇异值分解这些概念上,代码能跑但心里没底。这份《线性代数导论》原书第五版中文版,就是 Gilbert Strang 那本被无数课程当作底教材的经典。它的价值不在于题多,而在于把矩阵、向量空间、正交性、特征值、SVD 这条线用几何直觉串成一条能走通的路。适合谁?适合已经学过一遍线代但没学透、想重新建立框架的人,也适合需要把线代当工具用的工程师。但我要先泼一盆冷水:这本书不是速查手册,直接翻到特征值章节你会更晕,得按它的节奏来。
2. 先看清这本书的骨架:从消元到 SVD 的四段式结构
2.1 为什么它把消元法放在第一章而不是行列式
很多国内教材习惯先讲行列式,再讲矩阵,再讲线性方程组。Strang 这本第五版反过来,开篇就是高斯消元,用矩阵乘法去描述消元过程。这个顺序不是随意排的,它背后有一个很实际的理由:消元是唯一一个你手算就能完成、且能直接对应到计算机求解的步骤。你写一个LU分解,本质上就是把消元过程记录下来,后面解方程、求逆、算行列式全都能复用这个分解结果。
我一般会建议读者在第一章就动手把下面这个消元过程用代码复现一遍,而不是只用眼睛看:
import numpy as np # 构造一个 3x3 矩阵,模拟教材里常见的消元例子 A = np.array([[2.0, 1.0, 1.0], [4.0, -6.0, 0.0], [-2.0, 7.0, 2.0]]) # 手动做一次 LU 分解,观察消元乘数 from scipy.linalg import lu P, L, U = lu(A) print("置换矩阵 P:\n", P) print("下三角 L:\n", L) print("上三角 U:\n", U) # 验证 PA = LU print("PA - LU 的误差范数:", np.linalg.norm(P @ A - L @ U))这段代码的逻辑说明:scipy.linalg.lu返回的是带部分主元选取的分解,P是置换矩阵,L是单位下三角,U是上三角。参数上你不需要改什么,但要注意A必须是浮点数组,整数数组在某些版本会报类型错误。跑完之后你会看到L里的元素就是消元乘数,U就是消元后的上三角。这个对应关系一旦建立,后面讲矩阵乘法、逆矩阵、甚至行列式符号变化,你都能用同一套语言去理解。
2.2 四个核心模块的依赖关系
这本书的章节不是并列的,而是有明确的依赖链。我把它的骨架拆成四段:
| 模块 | 对应章节 | 核心概念 | 后续依赖 |
|---|---|---|---|
| 消元与矩阵运算 | 第 1-2 章 | 高斯消元、LU 分解、矩阵乘法 | 所有后续章节 |
| 向量空间与正交性 | 第 3-4 章 | 四个基本子空间、投影、最小二乘 | 特征值、SVD |
| 特征值与对角化 | 第 5-6 章 | 特征方程、相似对角化、对称矩阵 | SVD、微分方程 |
| SVD 与应用 | 第 7 章及后续 | 奇异值分解、伪逆、图像压缩 | 数据压缩、降维 |
这个表不是让你背的,是让你在卡住的时候定位自己缺了哪一块。比如你看不懂 SVD 的几何意义,大概率不是 SVD 本身难,而是第 4 章的投影和正交基没吃透。常见做法是回头把第 4 章的重心放在“为什么投影矩阵是 (P = A(A^T A)^{-1}A^T)”这个推导上,而不是急着往后翻。
2.3 中文版第五版的章节调整与阅读顺序建议
第五版相比第四版在章节顺序上做了一些调整,最明显的是把 SVD 提前到了第 7 章,而不是放在最后。这个改动对自学者其实更友好,因为 SVD 是连接线代和实际应用最直接的一座桥。但我不建议你从第 7 章开始读,因为 SVD 的推导依赖特征值和对称矩阵的性质。
我一般会建议两条阅读路线:
- 如果你是为了考试或补基础:按 1 → 2 → 3 → 4 → 5 → 6 → 7 的顺序走,每章做完前两节就停下来,把例题手算一遍。
- 如果你是为了用工具:按 1 → 2 → 4 → 7 → 5 → 6 的顺序走,先建立消元、正交、SVD 这条应用线,再回头补特征值的理论细节。
两条路线的共同点是:第 1 章和第 2 章不能跳。消元不熟,后面所有分解你都只能看个热闹。
3. 把书里的矩阵运算落到 NumPy:四个必须亲手敲一遍的片段
3.1 四个基本子空间的数值验证
Strang 在书里反复强调四个基本子空间:列空间、零空间、行空间、左零空间。这四个空间的关系用一句话概括就是:行空间和零空间正交,列空间和左零空间正交,且行空间和列空间的维数都等于秩。光看这句话很容易滑过去,但如果你用代码验证一遍,印象会完全不一样。
import numpy as np from scipy.linalg import null_space, orth # 构造一个秩为 2 的 3x4 矩阵 A = np.array([[1.0, 2.0, 3.0, 4.0], [2.0, 4.0, 6.0, 8.0], [1.0, 1.0, 1.0, 1.0]]) # 计算秩 rank = np.linalg.matrix_rank(A) print("矩阵的秩:", rank) # 列空间的一组正交基 col_basis = orth(A) print("列空间基的形状:", col_basis.shape) # 零空间的一组正交基 null_basis = null_space(A) print("零空间基的形状:", null_basis.shape) # 验证零空间向量与行空间正交 row_space = orth(A.T) for v in null_basis.T: for u in row_space.T: dot = np.dot(u, v) print(f"行空间基与零空间基的内积: {dot:.2e}")逻辑说明:orth返回的是列空间的一组标准正交基,null_space返回的是零空间的标准正交基。参数上没有什么需要调的,但你要注意A的秩如果是浮点误差导致的,matrix_rank可能会给出比你预期大一点的数。这时候可以手动设一个容差,比如np.linalg.matrix_rank(A, tol=1e-10)。跑完这段代码,你会看到行空间基和零空间基的内积都在 (10^{-16}) 量级,这就是数值上的正交。这个验证比看十遍定义都管用。
3.2 特征分解与对称矩阵的对角化
书里讲对称矩阵一定可以对角化,而且特征向量可以选成标准正交的。这个性质在数值计算里非常关键,因为对称矩阵的特征分解比一般矩阵稳定得多。我一般会让学生用下面这段代码去对比一个对称矩阵和一个非对称矩阵的特征分解差异:
import numpy as np # 对称矩阵 S = np.array([[4.0, 1.0, 0.0], [1.0, 3.0, 1.0], [0.0, 1.0, 2.0]]) # 非对称矩阵 N = np.array([[4.0, 1.0, 0.0], [0.0, 3.0, 1.0], [0.0, 0.0, 2.0]]) # 对称矩阵的特征分解 eigvals_s, eigvecs_s = np.linalg.eigh(S) print("对称矩阵特征值:", eigvals_s) print("对称矩阵特征向量正交性检查:") print(np.dot(eigvecs_s.T, eigvecs_s)) # 非对称矩阵的特征分解 eigvals_n, eigvecs_n = np.linalg.eig(N) print("非对称矩阵特征值:", eigvals_n) print("非对称矩阵特征向量正交性检查:") print(np.dot(eigvecs_n.T, eigvecs_n))逻辑说明:np.linalg.eigh专门用于对称矩阵,返回的特征值默认升序排列,特征向量矩阵是正交矩阵。np.linalg.eig用于一般矩阵,返回的特征向量不一定正交,甚至可能是复数。参数上,eigh有一个UPLO参数可以指定用上三角还是下三角,默认是'L',一般不用改。跑完你会看到对称矩阵的特征向量内积矩阵接近单位阵,而非对称矩阵的不是。这个差异在书里是用定理形式给出的,但代码跑一遍你就知道为什么数值计算里大家偏爱对称矩阵了。
3.3 SVD 的几何意义与图像压缩小实验
SVD 是这本书里最值得动手的一个知识点。书里用旋转、拉伸、再旋转来解释 (A = U\Sigma V^T),这个几何解释比公式本身更重要。我一般会用一个简单的图像压缩实验来收尾:
import numpy as np from PIL import Image # 读取一张灰度图,转成矩阵 img = Image.open('sample_gray.jpg').convert('L') A = np.array(img, dtype=float) # 做 SVD U, sigma, Vt = np.linalg.svd(A, full_matrices=False) # 只保留前 k 个奇异值 k = 50 sigma_k = np.zeros_like(sigma) sigma_k[:k] = sigma[:k] A_compressed = U @ np.diag(sigma_k) @ Vt # 保存压缩后的图像 Image.fromarray(A_compressed).convert('L').save('compressed_k50.jpg') print("原始矩阵形状:", A.shape) print("前 10 个奇异值:", sigma[:10]) print("保留能量占比:", np.sum(sigma[:k]**2) / np.sum(sigma**2))逻辑说明:np.linalg.svd返回的sigma是奇异值向量,按降序排列。full_matrices=False表示返回经济型 SVD,对于图像矩阵来说可以节省内存。参数k是你保留的奇异值个数,k 越大压缩越少但保留细节越多。跑完这段代码,你会看到前 10 个奇异值下降得非常快,保留 50 个奇异值就能抓住大部分能量。这个实验的意义在于:它把书里抽象的“低秩逼近”变成了一个你能看到结果的压缩过程。
3.4 用最小二乘拟合一条直线
最小二乘是第 4 章的核心应用,也是连接线代和统计的桥梁。书里用投影矩阵推导了最小二乘解,我一般会用一个带噪声的线性拟合来验证:
import numpy as np import matplotlib.pyplot as plt # 生成带噪声的数据 np.random.seed(42) x = np.linspace(0, 10, 50) y = 2.5 * x + 1.0 + np.random.normal(0, 2.0, size=x.shape) # 构造设计矩阵 A = np.vstack([x, np.ones_like(x)]).T # 最小二乘解 coeffs, residuals, rank, sv = np.linalg.lstsq(A, y, rcond=None) print("拟合斜率与截距:", coeffs) # 画图 plt.scatter(x, y, label='带噪声数据') plt.plot(x, A @ coeffs, color='red', label='最小二乘拟合') plt.legend() plt.savefig('least_squares_fit.png')逻辑说明:np.linalg.lstsq直接返回最小二乘解,rcond=None表示使用默认的奇异值截断阈值。参数上你不需要改什么,但要注意A的列数不能超过行数,否则方程欠定。跑完你会看到拟合出的斜率和截距接近真实值。这个实验的价值在于:它让你看到投影矩阵和最小二乘解是同一件事的两种说法。
4. 避坑与排查:自学者最容易翻车的五个地方
4.1 跳过消元直接看特征值,结果符号全乱
现象:翻到第 5 章,看到特征多项式展开,符号一会儿正一会儿负,算出来的特征值跟答案对不上。
原因:消元过程中主元交换会改变行列式符号,而特征多项式本质上是一个行列式。如果你在第 1 章没有把置换矩阵和行列式符号的关系搞清楚,到第 5 章就会在符号上反复翻车。
解决:回头把第 1 章关于置换矩阵的部分重看一遍,亲手算几个带主元交换的 LU 分解,确认每次交换带来的符号变化。常见做法是写一个 3x3 矩阵,手动做两次行交换,然后对比np.linalg.det的结果。
4.2 把np.linalg.eig和np.linalg.eigh混用
现象:对一个对称矩阵用eig分解,得到的特征向量矩阵不正交,后面做投影时结果不对。
原因:eig是通用特征分解,不保证对称矩阵的特征向量正交;eigh专门针对对称矩阵,利用了对称性,返回正交特征向量。
解决:只要你的矩阵是对称的,一律用eigh。判断对称性可以用np.allclose(A, A.T)。这个习惯能帮你省掉很多调试时间。
4.3 SVD 的full_matrices参数导致内存爆炸
现象:对一张大图像做 SVD,程序直接卡死或者报内存不足。
原因:np.linalg.svd默认full_matrices=True,会返回完整的 (U) 和 (V^T),对于 (m \times n) 矩阵,(U) 是 (m \times m),(V^T) 是 (n \times n)。图像矩阵动辄几千乘几千,内存直接吃满。
解决:做图像压缩或降维时,一律设full_matrices=False,返回经济型 SVD。这样 (U) 是 (m \times k),(V^T) 是 (k \times n),其中 (k = \min(m, n))。
4.4 最小二乘的rcond参数不设导致警告
现象:调用np.linalg.lstsq时出现FutureWarning,提示rcond参数将来会改变默认行为。
原因:NumPy 在新版本里对rcond的默认值做了调整,不显式设置会触发警告。
解决:显式传入rcond=None,表示使用机器精度的倍数作为截断阈值。如果你的设计矩阵条件数很大,可以手动设一个更小的值,比如rcond=1e-10。
4.5 只看中文版不看英文术语,查资料时对不上号
现象:想搜某个概念的更多解释,用中文关键词搜出来的结果质量参差不齐,用英文搜又不知道对应哪个词。
原因:这本书的中文版翻译整体质量不错,但一些术语和通用译法有差异,比如“零空间”对应 null space,“左零空间”对应 left null space。
解决:在书旁边放一张术语对照表,遇到卡住的概念先查英文原词,再用英文关键词去搜。常见做法是在书的第一页空白处手写几个核心术语的英文,翻的时候顺手看一眼。
5. 把这本书用成工具书:我的三个进阶习惯
第一个习惯是每学完一个分解,就去找一个实际数据跑一遍。比如学完 LU 分解,我会拿一个电路网络或者结构力学里的稀疏矩阵去试,看看消元后的稀疏性变化。学完 SVD,我会拿一张自己的照片做不同 k 值的压缩对比,观察什么时候开始出现明显块状伪影。这个习惯的好处是,你不再把分解当成数学题,而是当成一个可以调参的工具。
第二个习惯是建立自己的“反例库”。书里的定理大多有前提条件,比如“对称矩阵一定可以对角化”,但“可对角化矩阵不一定对称”。我会刻意去找一些边界情况,比如特征值重复但特征向量不够的矩阵,用代码验证它不能对角化。这个反例库在你后面看论文或者调库的时候非常有用,因为很多数值算法的稳定性讨论都建立在“最坏情况”上。
第三个习惯是定期回头翻第 2 章和第 4 章。这两章是整本书的枢纽,第 2 章的矩阵乘法视角和第 4 章的正交投影视角,几乎贯穿了后面所有章节。我自己的经验是,每次卡住的时候,回到这两章重新看一遍相关小节,往往比硬啃当前章节更有效。
最后说一个具体的技巧:如果你打算把这本书当长期参考,建议在扉页贴一张手写的“分解关系图”,把 LU、QR、特征分解、SVD 之间的依赖和适用条件画成一张网。这张图不用很漂亮,但一定要自己画。画的过程本身就是一次梳理。从那以后我每次遇到一个新的矩阵分解,都会先问自己三个问题:它依赖什么前提,它和已有分解是什么关系,它在数值上稳定不稳定。希望帮到你。
本文还有配套的精品资源,点击获取