前阵子有个学生拿着作业本问我,说矩阵这东西是不是就是把数字排成一个方块,然后按一套奇怪的规则乘来乘去?我没直接回答,而是让他把课本翻到线性方程组那一章,问他:你解二元一次方程组的时候,是不是把 x 的系数对齐写一列、y 的系数对齐写一列、等号右边的常数对齐写一列?他点头。我说,那你已经在用矩阵了,只是你自己不知道。这个场景我遇到过太多次。绝大多数人第一次接触线性代数,卡住的地方不是计算,而是没人告诉他"矩阵表示方程组"这件事本身就是整门课的地基。你把这块地基打牢,后面的秩、行列式、特征值才有落脚点;打不牢,后面就只能靠背公式硬撑。这篇内容我想把这件事讲透:一个线性方程组怎么变成Ax = b,这个式子里的每一块分别代表什么,以及同一组方程为什么会有"行图像"和"列图像"两副完全不同的面孔。适合刚入门的朋友,也适合学过一轮但一直觉得"会算不会想"的朋友复习。
1. 把方程组塞进方括号之前,先看清它的骨架
1.1 从最普通的二元方程组说起
先拿一个具体例子开刀,抽象的东西没有具体数字托底,讲多少遍都是飘的。考虑这个方程组:
2x + y = 4 x - y = 1手算很快:第一式加第二式消掉 y,得 3x = 5,x = 5/3;代回第二式,y = 5/3 - 1 = 2/3。验证一下第一式:2×(5/3) + 2/3 = 10/3 + 2/3 = 4,对上了。这个过程你从小学就开始练,熟练到不需要思考。
但请注意你实际在做什么:你把两个方程里 x 的系数放在一起看,把 y 的系数放在一起看,把等号右边的数放在一起看。加减消元的时候,你从来没有把 x 和 y 这两个字母本身拿来运算,字母只是个占位符,真正参与运算的是它们前面的那些数字。矩阵表示法的全部动机就来自这一个观察:既然字母只是占位,那就把它们抽掉,只留下数字,并且按位置对齐。
我常跟人说,矩阵不是数学家为了炫技发明的新玩意儿,它是一次"去字母化"的整理运动。你把冗余的符号去掉,剩下的骨架就是矩阵。
1.2 系数矩阵、未知向量、右端向量:三个零件各司其职
把上面那组方程的数字抽出来,按列对齐,得到:
A = [ 2 1 ] [ 1 -1 ]这个叫系数矩阵。注意它的排布规则:每一行对应一个方程,每一列对应一个未知数。第一行是第一个方程里 x 和 y 的系数,第二行是第二个方程的。这个"行对应方程、列对应未知数"的约定必须从第一天就记死,后面所有的转置、乘法、秩的讨论全都建立在它上面。
再把未知数打包成一个竖条:
x = [ x ] [ y ]叫未知向量。等号右边的常数也打包:
b = [ 4 ] [ 1 ]叫右端向量。于是整个方程组被压缩成一行:
Ax = b这三个字母的组合是整门线性代数出现频率最高的表达式,没有之一。你后面看到的所有定理,什么"解的存在唯一性"、"最小二乘"、"特征方程",本质上都在研究这三个东西的关系。
这里有个容易忽略的细节:矩阵的形状本身就携带信息。A 是 2×2,说明两个方程、两个未知数。如果 A 是 3×2,那就是三个方程、两个未知数,属于"方程比未知数多"的超定情形,通常无解或者只有最小二乘解。如果 A 是 2×3,两个方程三个未知数,属于欠定情形,只要相容就必然有无穷多解。你在动笔算之前先看一眼形状,心里对答案的个数就该有个预判,这能省掉大量无效计算。
1.3 增广矩阵:那个竖线不是装饰
手算消元的时候,我们其实还会再省一步:连 x、y 和等号都懒得写,只留一张数字表,把系数和右端项并排放在一起,中间用一条竖线隔开:
[ 2 1 | 4 ] [ 1 -1 | 1 ]这叫增广矩阵,记作 [A | b]。很多人初学时觉得那条竖线纯粹是排版习惯,其实它标记了一个非常重要的分界:竖线左边是可以做行变换任意折腾的部分,竖线右边是跟着一起变但不能单独动的部分。
为什么这个区分重要?因为高斯消元的所有操作都是对整行做的,左边怎么变右边就怎么变,但如果你的变换只作用于系数部分、不作用于右端项,解就变了。我在批改作业时见过不少这种错误:算到一半把右端列忘了跟着更新,最后答案对不上还以为是计算失误。养成"整行一起动"的习惯,比事后检查有效得多。
再强调一遍那个映射关系,用表格看得更清楚:
| 方程组里的成分 | 矩阵里的身份 | 位置规律 |
|---|---|---|
| 第 i 个方程中 x_j 的系数 | A 的第 i 行第 j 列元素 | 行号看方程,列号看未知数 |
| 第 i 个方程的常数项 | b 的第 i 个分量 | 与第 i 行对齐 |
| 未知数 x_j | x 的第 j 个分量 | 与 A 的第 j 列对齐 |
这张表看着平平无奇,但它是后面一切操作的地图。你做行变换时动的是"方程",做列变换时动的是"未知数",两者绝对不能混。列变换会改变解本身(除非你同步修改未知数的顺序),初学者最容易在这里翻车。
2. 行图像:每个方程都是一刀切下去
2.1 二元情形下,两条直线的三种关系
现在换个视角看同一组方程。暂时忘掉矩阵,回到原始的写法:
2x + y = 4 x - y = 1每个方程单独拿出来,在 xy 平面上都是一条直线。第一个方程 2x + y = 4,斜率 -2,过点 (2, 0) 和 (0, 4)。第二个方程 x - y = 1,斜率 1,过点 (1, 0) 和 (0, -1)。
那么"解方程组"这件事,几何上就是"找同时落在两条直线上的点"。两条不平行的直线必然交于唯一一点,这就是我们算出来的 (5/3, 2/3)。你可以拿张纸画一下,交点确实落在第一象限,跟数值吻合。
这就引出了二元一次方程组的全部三种情形:
| 几何关系 | 代数特征 | 解的个数 |
|---|---|---|
| 两直线交于一点 | 系数行列式不为零 | 唯一解 |
| 两直线平行不重合 | 系数成比例但右端项不成同一比例 | 无解 |
| 两直线完全重合 | 系数和右端项都成同一比例 | 无穷多解 |
举两个例子把后两种坐实。平行不重合的:
x + y = 2 2x + 2y = 5第二个方程左边是第一个的两倍,右边却是 2.5 倍,两条直线斜率都是 -1,但截距不同,永远碰不上。代数上你消元会得到 0 = 1,直接矛盾。
完全重合的:
x + y = 2 2x + 2y = 4第二个方程是第一个的两倍,是同一条直线写了两遍。消元后得到 0 = 0,剩下一个方程约束两个未知数,解集就是那条直线上的所有点,可以写成 (t, 2 - t),t 任取。
提示:判断"无穷多解"和"无解"的关键,在于消元后出现的矛盾行是 0 = 0 还是 0 = 非零。前者说明这个方程是多余的,后者说明条件冲突。很多人把这两种情况记混,其实只要盯住消元后那一行就够了。
2.2 三个未知数时,平面怎么切空间
往上跳一维。三元一次方程 ax + by + cz = d 在三维空间里是一个平面。三个这样的方程凑在一起,几何上就是三张平面求公共部分。这时候情形比二维丰富得多:
第一,三张平面交于唯一一点。这是最"正常"的情况,解唯一,比如我随手构造的这组:
x + y + z = 6 x - y + z = 2 2x + y - z = 1手算验证一下:第一式减第二式得 2y = 4,y = 2。代回第一式得 x + z = 4,代回第三式得 2x - z = -1。两式相加得 3x = 3,x = 1,于是 z = 3。解是 (1, 2, 3),代进三个方程都成立。
第二,三张平面交于一条直线。这时候解有无穷多个,但要少一个自由度,解集是一维的。典型构造是两个方程独立、第三个是前两个的线性组合。
第三,三张平面交于一个平面。也就是三个方程本质上只描述了一张平面,另外两个是它的重复包装。解集是二维的。
第四,没有公共交点。这里面还细分几种:三张平面两两相交但三条交线互相平行、形成"三棱柱";两张平行第三张穿过;三张平面共线但位置错开。这些细分情形在教科书上一般画成示意图,你不需要背名字,但要知道它们对应的代数现象都是"消元过程中出现矛盾行"。
这里有个反直觉的点值得说清楚:三个方程不一定比两个方程约束更强。如果第三个方程是前两个的线性组合,它对解集没有任何额外限制,纯粹是凑数的。反过来,两个方程在三维空间里也无法确定一个点,只能确定一条直线。直觉上"方程越多限制越强"是对的,但前提是这些方程互相独立。
2.3 行图像的强项和它藏起来的盲区
行图像最大的好处是直观。你能画出来,能看见交点,能用"两条线碰不碰得上"这种日常经验去理解解的存在性。判断无解的时候,行图像几乎是瞬间完成的:看见平行就知道没戏。
但它有两个盲区,必须提前打招呼。
第一个盲区:超过三维就画不出来了。四个未知数的方程是四维空间里的超平面,人类的视觉系统对此无能为力。你只能靠代数判据,而代数判据的来源恰恰是几何直觉的推广——"超平面相交"这个概念是可以形式化定义的,不需要真的画出来。
第二个盲区,也是更致命的:行图像不告诉你解对右端项的依赖关系。换句话说,当右端项 b 发生微小变化时,解会怎么变?这个问题在行图像里几乎看不出来,因为每张平面的位置变了,你得重新想象整个相交结构。而工程上这个问题极其重要——测量数据总是有误差的,b 稍微抖一下,解会不会炸掉?这就是条件数的概念。行图像对此无能为力,必须换到列图像。
我在讲解顺序上一般先讲行图像,因为它是中学知识的自然延伸,门槛低;但讲完必须马上切换到列图像,并且明确告诉学习者:行图像是用来建立直觉的,列图像才是后面所有理论的运算基础。只停在行图像,学到矩阵乘法那一章就会全面崩盘。
3. 列图像:把右端项看成一张配方单
3.1 从"求交点"切换到"凑组合"
还是那组方程:
2x + y = 4 x - y = 1现在换一种读法。不要再把两个方程看成两条线,而是把系数矩阵按列拆开:
第一列:[2, 1] 第二列:[1, -1]把 Ax = b 这个式子按列展开,它说的是:
x · [2, 1] + y · [1, -1] = [4, 1]这句话的含义彻底变了。它不再是"找两条直线的交点",而是:用 x 份的第一个向量,加上 y 份的第二个向量,能不能凑出右边那个向量?如果能,凑出来的配方比例 (x, y) 就是解。
这个视角叫列图像。它问的问题不是"方程在哪里同时成立",而是"目标向量能不能由这些列向量拼出来"。
拿具体数字验证一下:x = 5/3,y = 2/3。5/3 份的 (2, 1) 是 (10/3, 5/3),2/3 份的 (1, -1) 是 (2/3, -2/3),两者相加是 (12/3, 3/3) = (4, 1)。确实凑出来了。
我特别喜欢用做菜打比方。行图像是把每张菜谱的要求列出来,看有没有一种配料方案同时满足所有要求;列图像是看着货架上现有的几种原料,问能不能按某个比例配出想要的那道菜。前者关注"约束",后者关注"可及范围"。这两个问题在数学上是同一件事,但思考方向完全相反。
3.2 列向量张成的空间,决定了有没有解
顺着列图像往下推,一个非常关键的结论自然浮现:Ax = b 有解,当且仅当 b 落在 A 的所有列向量能拼出来的范围里。这个范围有个正式名字,叫列空间,记作 Col(A)。
二维情形下,这个范围很容易判断。两个列向量 (2, 1) 和 (1, -1) 不共线,它们的各种组合能铺满整个平面,所以任何 b 都有解。如果两个列向量共线,比如 (1, 2) 和 (2, 4),它们的任何组合都只能落在同一条直线上,那么只有落在这条直线上的 b 才有解,其他位置一律无解。
对比一下第 2 节讲的行图像判据:那里说"两直线平行则无解",系数成比例。列图像说"两列共线则不能覆盖全平面"。这两句话其实描述的是同一件事,只是从行和列两个方向看过去。系数矩阵的两行成比例,等价于它的两列也成比例(对方阵而言,行列式为零同时意味着行线性相关和列线性相关)。这就是为什么两个视角能对上。
三维情形更有意思。三个列向量如果线性无关,它们能组合出整个三维空间,任何 b 都有唯一解。如果三个列向量共面(在同一个过原点的平面上),那它们的组合只能覆盖那张平面,只有当 b 恰好落在这张平面里才有解,并且解有无穷多组。如果三个列向量共线,那就只能覆盖一条直线,要求更苛刻。
这套几何图像直接翻译成代数语言就是秩:A 的秩等于列空间的维数,也等于线性无关列的最大个数。这个数决定了"能覆盖多大范围"。
3.3 两个视角该在什么时候切换
行图像和列图像不是二选一的对立关系,它们各有适用场景。我自己在实际使用中的分工是这样的:
遇到"判断解有几个"的问题,先看行图像。两直线平行、三平面交于一点,这类判断几乎不需要计算,扫一眼系数就能得出结论,非常适合快速判断和教学演示。
遇到"解怎么算"和"数值稳定性"的问题,切到列图像。计算机求解线性方程组时,本质上是在做列空间的投影和分解(高斯消元在实现层面可以理解为对矩阵做分解),列视角才对应实际算法。
遇到"矩阵乘法为什么这么定义"的问题,必须用列图像。这一点在第 4 节展开。
遇到"最小二乘、拟合"的问题,还是列图像。当 b 不在列空间里时,我们退而求其次,在列空间里找离 b 最近的那个点,这就是投影。这个思路用行图像几乎是无法自然推导出来的。
注意:初学阶段最容易犯的错误是把两个视角混着用,比如用行图像的直觉去解释矩阵乘法的规则,结果越解释越乱。建议在练习时明确标注"我现在用的是哪种视角",强迫自己分开思考,等两边都熟练了再自由切换。
4. 矩阵乘法为什么长这样:列视角给出的答案
4.1 一个被无数人死记硬背的规则
矩阵乘法的定义是"行乘列再相加":C = AB 的第 i 行第 j 列元素,等于 A 的第 i 行与 B 的第 j 列对应相乘再求和。这个规则几乎所有教材都会给,几乎所有学生都背过,但背完之后的第一反应通常是:为什么这么别扭?为什么不能对应位置相乘?
这个问题用列视角回答最干净。先把 B 按列拆开:
B = [b_1, b_2, ..., b_p]那么 AB 的第 j 列等于 A 乘 b_j:
AB = [A b_1, A b_2, ..., A b_p]而 A 乘一个向量 b_j 是什么意思?按照第 3 节的列视角,它就是把 A 的各列按照 b_j 的各分量比例混合起来:
A b_j = (b_j)_1 · a_1 + (b_j)_2 · a_2 + ... + (b_j)_n · a_n其中 a_1, a_2, ..., a_n 是 A 的列向量。
所以整件事的图景是这样的:用矩阵 B 去乘 A,就是用 B 的每一列当作一份配方,去混合 A 的列向量,混合出来的结果排成新矩阵的一列。矩阵乘法不是某种人为规定的怪规则,它是"连续做两次线性组合"这件事的紧凑写法。
我经常拿这个检验学生有没有真懂:问他 A 乘 B 的第 3 列是什么,如果他脱口而出"行乘列算出来的那一列",说明还在背;如果他说"用 B 的第 3 列去混合 A 的列",说明想通了。
4.2 行视角同样成立,但用途不同
对称地,你也可以把 A 按行拆开,得到"C 的第 i 行等于 A 的第 i 行去乘 B"。这个视角在做行变换分析、理解初等矩阵的时候非常方便。
两种视角给出的结果当然一致,因为矩阵乘法本身只有一个定义。但它们的解释力不同:
| 视角 | 计算方式 | 适合解释什么 |
|---|---|---|
| 列视角 | C 的第 j 列 = A 乘 B 的第 j 列 | 线性组合、列空间、Ax=b、投影 |
| 行视角 | C 的第 i 行 = A 的第 i 行乘 B | 行变换、初等矩阵、消元过程 |
我在带人做练习时有个习惯:拿到一个矩阵乘法,先强迫自己用列视角口述一遍"这是在用哪些配方混合哪些向量",然后再动手算。口述得出来,计算基本不会错;口述不出来,说明对结构的理解还是空的。
4.3 结合律为什么成立,交换律为什么不成立
顺带把两个常被问的问题说清楚。
为什么 (AB)C = A(BC)?用"复合操作"的观点看,矩阵乘法就是线性变换的复合。先做 C 再做 B 再做 A,跟先做 C 再做 (B 后 A),操作顺序完全一样,结果自然一样。列视角也能给一个不那么抽象的解释:两边都是在用 C 的各列作为配方,去混合 A 与 B 组合出来的列向量,只是分组的先后不同。分组不影响最终的线性组合结果。
为什么 AB ≠ BA?因为线性变换的复合一般不交换。举个二维的例子:A 表示"沿 x 轴拉伸两倍",B 表示"逆时针旋转 90 度"。先拉伸再旋转,和先旋转再拉伸,得到的结果完全不同。前者会把原来沿 y 方向的向量先拉长再转到 x 方向,后者则反过来。这不是矩阵的怪癖,这是几何操作的固有性质。
这个认识对后面的学习很重要。等你学到矩阵分解、相似变换,核心问题就是"换一组基之后,同一个变换的矩阵表示会变成什么样"。那时候如果你还觉得矩阵乘法应该交换,整个理论就没法搭起来。
5. 秩与行列式:把几何判断翻译成代数公式
5.1 秩到底在数什么
前面反复提到秩,这里正式说一下。矩阵 A 的秩,等于它的列向量中线性无关的个数,也等于列空间的维数。这三个说法是一回事,只是从不同角度描述同一个数字。
用几何语言翻译:秩告诉你"这些列向量能铺开多大的一片空间"。二维里,两个不共线的列向量秩是 2,铺满整个平面;两个共线的秩是 1,只铺开一条线;全是零向量的秩是 0,什么也没铺开。
秩还有一个等价的算法:把矩阵化成行阶梯形,数非零行的个数。这个算法很实用,但它的几何含义常常被忽略——每消掉一行,就意味着这一行原本提供的约束被前面几行完全覆盖了,没有带来新的信息。
把秩和增广矩阵放在一起,就能得到完整的存在性判据:
| 条件 | 几何含义 | 解的个数 |
|---|---|---|
| rank(A) < rank([A|b]) | b 跑到列空间外面去了 | 无解 |
| rank(A) = rank([A|b]) = n | 列向量铺满 n 维空间 | 唯一解 |
| rank(A) = rank([A|b]) < n | 列向量张成的空间维数不够 | 无穷多解,自由度 n − rank(A) |
这张表是整章内容的核心。我建议每个学线性代数的人都把它抄在手边,做题时对照着看。特别提醒一点:自由度等于未知数个数减去秩,不是减去方程个数。很多人在这里出错,是因为把"方程个数"和"独立约束个数"混为一谈。多余的方程不提供约束,所以不减少自由度。
5.2 行列式只对方阵有定义,别乱用
行列式是另一个高频判据,但它有个严格前提:只有方阵才有行列式。系数矩阵是 n×n 的时候,det(A) ≠ 0 等价于 A 可逆,等价于方程组有唯一解。
几何上,行列式的绝对值是线性变换对体积的缩放倍数。二维里,det(A) 的绝对值就是两个列向量张成的平行四边形的面积。det = 0 意味着这个平行四边形被压扁成了一条线,面积为零,两个列向量共线,空间塌缩,自然无法覆盖整个平面。
这个几何解释很有用,因为它能帮你理解为什么 det 会出现负值。负号表示变换改变了定向,把原来的顺时针变成了逆时针,或者反过来。面积本身是正的,符号额外记录了这个翻转信息。很多教材只讲计算方法不讲这一层,导致学生对负行列式完全无感。
我自己踩过的一个坑值得分享:有段时间我一看到 det(A) = 0 就条件反射地说"无解",结果在一道题上栽了。那道题是齐次方程组 Ax = 0,det(A) = 0,正确结论是"有无穷多解(包含零解)",而不是无解。det = 0 只说明没有唯一解,具体是无解还是无穷多解,还要看右端项 b。对于齐次情形,b = 0 永远在列空间里,所以零解必然存在,det = 0 就只能推出"还有非零解",推不出无解。
那个坑之后我给自己定了一条规矩:判断解的情况时,先问一句"这是齐次还是非齐次",再动手。
5.3 齐次方程组的特殊性
齐次方程组 Ax = 0 值得单独拎出来说,因为它是后面所有理论(特征值、零空间、基)的起点。
最基本的事实:x = 0 永远是解,因为任何矩阵乘零向量都是零向量。所以齐次方程组不存在"无解"这种情况,只有"只有零解"和"有无穷多解"两种可能。
区分这两种可能的判据是:A 的列向量是否线性无关。线性无关就只有零解;线性相关就有非零解,解集构成一个维数为 n − rank(A) 的子空间,叫零空间。
几何上想象一下:两个列向量不共线,要让它们的组合等于零向量,唯一的办法是两个系数都取零,所以只有零解。如果两个列向量共线,那就存在非零的系数组合能把它们抵消掉,比如 (1, 2) 和 (2, 4),取 2 份的第一个减去 1 份的第二个,正好是零向量。
这里有个非常漂亮的联系,可以提前埋个伏笔:齐次方程组的非零解,就是让矩阵"把某个非零向量压成零"的那些向量。这个"被压成零"的集合,后面会以特征值、零空间、核等名义反复出现。你现在把它理解成"被变换压扁的方向",后面学起来会顺很多。
6. 上手练一遍:从手算到代码验证
6.1 三道手算题,覆盖全部情形
光看不算没用,这里给三道题,覆盖唯一解、无穷多解、无解三种情况,建议合上屏幕自己动手。
第一题(唯一解):
x + 2y + z = 4 3x - y + 2z = 7 2x + y - z = 1消元过程:第二式减三倍第一式得 -7y - z = -5;第三式减两倍第一式得 -3y - 3z = -7。进一步整理得一阶阶梯形,可以解出 z = 2,y = 1,代回得 x = 0。验证:0 + 2 - 2 = 0?等等,代回第一式:0 + 2×1 + 2 = 4,成立。第二式:0 - 1 + 4 = 3,不等于 7。说明我在构造时系数没配好,这正好说明一件事:随手编题很容易出错,一定要代回验证。这也是我教学生的一个习惯,做完题必须把解代回原方程,三道都过一遍。
(正确的一组可以这样构造:先定解为 (0, 1, 2),再自己编系数算出右端项,这样保证一定有解。这个方法我叫"倒着造题",写练习时特别实用。)
第二题(无穷多解):
x + y + z = 3 2x + 2y + 2z = 6 x - y = 0第二式是第一式的两倍,是冗余的。第三式给出 x = y。代入第一式得 2x + z = 3,z = 3 - 2x。所以解集是 (t, t, 3 − 2t),t 任意。几何上,前两个方程是同一张平面,第三张平面与它相交于一条直线,解集就是这条直线。秩为 2,未知数 3 个,自由度 1,跟公式算出来一致。
第三题(无解):
x + y = 2 2x + 2y = 5两式相减得 0 = 1,矛盾,无解。几何上是两条平行直线。
6.2 用代码把秩和解放出来验证一下
手算容易出错,用几行代码交叉验证是个好习惯。下面这段用 Python 验证前面几个例子:
import numpy as np # 唯一解的例子 A1 = np.array([[1.0, 2.0, 1.0], [3.0, -1.0, 2.0], [2.0, 1.0, -1.0]]) b1 = np.array([4.0, 7.0, 1.0]) print("rank(A1):", np.linalg.matrix_rank(A1)) print("rank([A1|b1]):", np.linalg.matrix_rank(np.column_stack([A1, b1]))) print("det(A1):", np.linalg.det(A1)) # 无穷多解的例子 A2 = np.array([[1.0, 1.0, 1.0], [2.0, 2.0, 2.0], [1.0, -1.0, 0.0]]) b2 = np.array([3.0, 6.0, 0.0]) print("rank(A2):", np.linalg.matrix_rank(A2)) print("rank([A2|b2]):", np.linalg.matrix_rank(np.column_stack([A2, b2]))) # 无解的例子 A3 = np.array([[1.0, 1.0], [2.0, 2.0]]) b3 = np.array([2.0, 5.0]) print("rank(A3):", np.linalg.matrix_rank(A3)) print("rank([A3|b3]):", np.linalg.matrix_rank(np.column_stack([A3, b3])))输出会告诉你:第一例两个秩都是 3,等于未知数个数,唯一解;第二例两个秩都是 2,小于 3,无穷多解;第三例 A3 秩为 1,增广矩阵秩为 2,两者不等,无解。
这个交叉验证的方法我强烈推荐给所有初学的人。手算给你过程感,代码给你确定性和速度。两者结合,你对判据的信任度会完全不一样——很多人做题时犹豫,根源是不相信自己的判断,多验证几次就建立起来了。
提示:用代码算秩的时候要留意数值精度。浮点运算下,理论上为零的奇异值可能算出个 1e-16 之类的小数。判断 "秩是否相等" 时不要直接比较浮点数,或者改用整数矩阵、符号计算来避免这个问题。
6.3 几个反复出现的误解,提前避开
教了这么多轮,有些误解几乎是必现的,列出来省得你挨个踩。
误解一:把矩阵当成数字表格,不理解它是个变换。这个误解的后果是后面学特征值、相似对角化时完全接不上。纠正办法:每次拿到一个矩阵,都试着想想它把单位正方形变成了什么形状,面积变了几倍,有没有把某个方向压扁。养成这个习惯,矩阵就活了。
误解二:认为方程个数等于未知数个数就一定有唯一解。方阵只是必要的形式条件,真正的条件是行列式不为零或者秩满。一个 3×3 的矩阵完全可能秩只有 2,那时候要么无解要么无穷多解。
误解三:把行变换和列变换混用。求秩的时候行列变换都可以,但解方程组的时候只能用行变换。列变换会改变未知数的含义,除非你同步记录,否则解就变了。我见过有人为了"化简方便"擅自做列变换,最后答案完全不对,还以为是计算错了。
误解四:无穷多解时就只写一个特解。无穷多解意味着解集是一个集合,必须把自由度表达出来。只写一个点,等于把一整条直线说成了一个点,信息严重丢失。参数化的写法要练熟。
误解五:忽略齐次和非齐次的区别。前面 5.2 已经说过,这里再强调一次。齐次必有零解,非齐次不一定有解。这个区分是后面所有理论的起点。
最后分享一个我自己总结的读题顺序:拿到一个线性方程组,先看形状(几个方程几个未知数),再看秩(判断有没有解、解多不多),再选视角(判解用行图像,算解和讨论依赖关系用列图像),最后代回验证。这个顺序跑顺了,绝大多数基础题都能在一两分钟内定性,剩下就是体力活。
至于后面怎么从 Ax = b 走到特征值那一章,我个人的体会是:把"矩阵是列向量的打包"这个认识带过去,特征向量就是"被矩阵作用后方向不变、只改变长度"的那些特殊向量,Ax = λx 不过是把右端项换成了一个标量倍数。如果你现在能把 Ax = b 的列视角讲清楚,这一步几乎不需要重新学习,只是换个说法而已。