ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

线性代数本质:从矩阵乘法到行列式、逆矩阵与方程组

线性代数本质:从矩阵乘法到行列式、逆矩阵与方程组 这一篇《线性代数的本质》系列笔记我记录的是中间最容易劝退人的部分从线性变换过渡到矩阵乘法再从行列式一路走到逆矩阵和方程组。前两篇的内容还相对友好向量就是空间里的箭头线性组合则是用箭头的伸缩相加来张成“能到达的范围”。但到了矩阵乘法很多人开始放弃因为教材往往直接抛规则左行右列、逐点相乘相加然后告诉你矩阵乘法不满足交换律。这些规则堆在一起基本要靠背。为什么不少人数值计算能算对却在后续章节反复卡住我的答案是几何画面没跟上。矩阵从来不是一张普通数字表格它是一份“空间变形说明书”。行列式描述的是这份说明书让面积或体积放大了多少倍逆矩阵则回答一个很实际的问题这份变形能不能还原。这篇笔记就把这四个东西绑在一起讲最终你会发现线性代数里最核心的方程组求解本质上不是计算问题而是一个空间几何问题。这篇内容适合两类人一类是刚开始学线性代数、正被矩阵乘法和行列式公式搞晕的学生另一类是学过但当时只记住了运算现在想重新理解“行列式为什么长这样”“什么时候无解”背后原理的读者。如果你心里已经有了“矩阵大概是变换”的模糊印象那么这篇笔记应该能帮你往深处再推一步。1. 第三篇笔记想讲透什么先看整体思路1.1 前两篇搭起来的地基在进入矩阵乘法和行列式之前我先快速复盘一下前两篇建立的两个直觉因为它们会贯穿后面所有内容。第一个直觉是线性变换可以看作“把整个空间一起变形”。这种变形要满足两个条件网格线保持直线且等间距原点保持不动。旋转、缩放、剪切、镜像都属于线性变换弯曲和错位则不是。这个条件听上去很严格但正因为严格线性变换才能用很少的信息描述清楚不需要记录每个点去哪只要记录基向量去哪就够了。第二个直觉是一个二维矩阵的每一列就是基向量 i帽和 j帽被变换后的落点。于是矩阵不再是一堆数字的排列而是一种“移动地图”的记录。我用第一列表示原来 x 轴方向的单位向量去了哪里用第二列表示原来 y 轴方向的单位向量去了哪里。整张空间图景就藏在这两个列向量里。前面这两块内容本质上是在解决“怎么描述一次空间变换”。第三篇从这里往下走问题立刻变复杂了如果我先做一个变换再做另一个变换能两个一起算吗行列式里的面积缩放是怎么嵌进这个地图里的当变换把空间压扁之后方程的解发生了什么变化这三个问题分别是矩阵乘法、行列式、逆矩阵要回答的核心。1.2 为什么把矩阵乘法、行列式、逆矩阵并在一起讲许多教材是按着“矩阵的运算”讲完再讲“行列式”定义然后讲“逆矩阵”中间隔着大量计算。结果学生掌握了三种技巧却看不到它们明明在描述同一根链条一个矩阵对应一次空间变形两个矩阵相乘对应两次变形的复合行列式代表这次变形的面积缩放倍数逆矩阵问的是这次变形能不能被反向还原。如果从计算顺序来学很容易形成“这是三章内容”的错觉。如果从空间视角来学它们其实是同一个故事的几个小节。所以第三篇笔记我做了一个调整不再按课本顺序展开而是把“空间变形”当作主线遇到一个知识点就先问它“描述的是空间里的什么现象”再回头理解公式。事实证明后一种顺序让我少走了很多弯路。你先有了“矩阵是一份说明书”的视角再看矩阵乘法时就会想到两份说明书拼接在一起看行列式时就会想到面积放大镜看逆矩阵时就会想到能不能把这套说明书倒着执行一遍。这样安排内容前一个概念会自然长到后一个概念上不用靠记忆硬撑。2. 矩阵乘法到复合线性变换不必死记规则2.1 为什么要发明一种看起来奇怪的乘法规则先想一个问题平面先被旋转90度再被水平剪切和先水平剪切再旋转90度结果一样吗如果你用手边的纸笔稍微画一下就会发现不一样。数学上描述这种“先做一次变换再做一次变换”就是在做复合变换。函数复合是很好理解的f(g(x)) 表示先让 x 经过 g再把结果交给 f。线性变换也是函数只不过它的输入输出都是向量。既然单个变换能用矩阵记录那连续两个变换也应该能合并成一个矩阵记录这合并出来的矩阵就是两个矩阵的乘积。为什么矩阵乘法定义成那套别扭的规则因为它是从“复合变换”里自然长出来的。我来模拟一个最简单的场景。假设 B 和 A 是两个矩阵X 是一个任意向量。要求“先 A 后 B”作用于 X也就是 B(A(X))如果不希望每次先算中间结果而是想直接用一个矩阵结果乘上 X那么这个结果矩阵会受到什么限制计算一下就会发现结果矩阵第 i 列就是从前的 A 变换把第 i 个基向量送到某地再去走 B 变换后的最终坐标。于是矩阵乘法的每一列都带上了复合几何含义。用生活化类比来说矩阵乘法就像是两份旅行地图的叠加。先看第一份地图把城市带到什么位置再拿第二份地图找那个新位置的方向。每一次矩阵乘法背后都是“一段连续发生的空间旅程”。2.2 一个具体的旋转和剪切复合例子我经常用旋转和剪切来做教学演示因为它们一个会让坐标轴转动一个会把网格斜向推。取旋转矩阵 R 表示逆时针旋转90度R [[0, -1], [1, 0]]取剪切矩阵 S让每个点 x 坐标增加一个 y 坐标分量S [[1, 1], [0, 1]]先旋转再剪切即 S 作用在 R 之后对应乘积 S R结果是S R [[1, -1], [1, 0]]先剪切再旋转即 R 作用在 S 之后对应乘积 R S结果是R S [[0, -1], [1, 1]]两个结果矩阵明显不同这说明矩阵乘法不满足交换律至少在通常情况下不满足。为什么因为“先转后切”和“先切后转”在空间里的路径是不同的。你把这两个结果分别作用到一个单位正方形上会看到两个完全不同形状的平行四边形。这个差异不是靠“背下顺序”就能理解的你需要知道每一次乘法都是在安排空间变形的先后顺序。同时这种解释也告诉了你一个容易忽略的点矩阵乘法的结果仍然是矩阵它的列向量实际上就是“第一个变换把基向量带到某处第二个变换再把那些中间位置变成最终位置”。如果计算时把人绕晕了就回头盯住第一列和第二列心里默念“第一列是 i帽的终点第二列是 j帽的终点”一遍遍核对。2.3 作用顺序和结合律中最容易踩的坑矩阵乘法的易错点主要体现在读取顺序上。绝大多数教材采用列向量表示法向量在最右边离向量最近的矩阵第一个作用向左逆推。比方说 B(A(X)) 写作 B A X这里要把 B A 按从右到左读先 A后 B。可一旦式子里有三个矩阵比如 C B A X很多初学者就会晕。这里有一个我自己踩过的坑。最初写代码时我创建了两个变换矩阵然后想实现“先旋转后剪切”结果下意识写了 R S代码跑出来图像总是不对。后来一检查才发现R S 其实是“先剪切后旋转”我读取矩阵作用顺序时反了。从那以后我给自己立下一条规矩先看右侧乘法的向量再看它左侧第一个矩阵再往左第二个也就是说AB 表示先把 B 当作靠近向量的一侧先应用 B再应用 A。另一个常被忽略地方是结合律。矩阵乘法满足结合律(AB)C A(BC)这一点在数值计算上很常见。但从几何视角看它其实非常自然三个连续空间变形组合在一起时你先算哪两个组合都不影响最终的执行顺序。既然最终都是“C 先作用然后 B 作用最后 A 作用”那括号加在哪里当然无所谓。这个规律不是矩阵数字的奇迹而是复合函数的天然性质。3. 行列式测量空间被放大或压扁了多少3.1 行列式是面积或体积的缩放倍数现在进入行列式。很多人先学行列式的展开公式再学它的几何意义但我觉得最好反过来行列式先是一个“面积变化倍数”的概念公式只是计算这个倍数的方式。在线性变换下一个区域的面积会变化。单位正方形是最容易测试的区域。变换前四个点分别是 (0,0)、(1,0)、(0,1)、(1,1)。变换后i帽和 j帽分别落到新位置单位正方形变成了一个以新基向量为边的平行四边形。这个平行四边形的面积就是行列式的绝对值。假设矩阵是A [[a, b], [c, d]]那么 i帽落到 (a, c)j帽落到 (b, d)。这两个向量张成的平行四边形的有向面积是 a×d - b×c。所以二阶行列式的公式不是天上掉下来的它就是平面向量叉积的数值结果。三阶行列式的几何意义同样3×3 矩阵的三个列向量张成了一个平行六面体行列式的绝对值就是这个平行六面体的体积。这也是为什么三阶行列式看起来那么复杂但本质仍然是“三个基向量围出来的体积”。行列式是一个全局缩放因子。只要 A 的行列式是 2那么所有区域的面积都会被放大到原来的两倍不会有的地方放大有的地方缩小。因为线性变换在每个点上的局部性质完全一致这一点跟非线性函数截然不同。3.2 负行列式到底意味着什么一看到行列式出现负数很多人会疑惑面积怎么能是负的这个“负”不是负面积而是方向发生了翻转。二维平面里我们通常约定 i帽到 j帽的转向为正方向。如果变换之后原本的顺时针逆时针关系发生了反转行列式就取负号。举个例子镜像矩阵 M [[-1, 0], [0, 1]]作用后 x 轴方向反转i帽跑到了左边j帽留在上边。这时二维向量叉积方向和原来相反行列式等于 -1。所以绝对值代表缩放倍数符号代表“镜像”或者“手性翻转”。这一点在三维里更直观右手坐标系变成左手坐标系时行列式就是负的它意味着没法通过平滑旋转把一个体系变成另一个体系会像左右手手套一样无法重合。判断方法也很简单把矩阵的列向量按顺序看作坐标轴看看最后一根轴方向是朝前还是朝后了。3.3 行列式为零空间已经被压扁了行列式真正关键的时刻是它等于零。零意味着面积被缩放成零原本的单位正方形被压成了一条线段甚至一个点。从二维来说两个列向量共线整个平面被压到一条直线上三条共面说明三维被压成平面或更低维度。这个“降维”的想法会直接导向逆矩阵问题。你想把平面空间的整个历史恢复出来可如果变换把平面压成了一条线那么线上每一个点都对应原来一整条线上的向量。信息已经被丢弃了不存在一个可靠的映射把这些信息找回来。我经常对学生说行列式等于 0 不只是一个计算特例它是在告诉你这个矩阵所对应的变换把某些不同向量“识别”成了同一个输出。这种识别如何精确描述答案就在下面涉及的列空间和零空间里。4. 逆矩阵、线性方程组与空间压缩4.1 把方程组 Ax v 当空间问题看任何线性方程组都可以写成矩阵形式 A x v。大多数人习惯从方程组逐行消元去理解它但如果顺着线性变换的视角它是这样一句话存在一个向量 x它在经过变换 A 之后正好落到了 v 的位置上。换句话说线性方程组不是无聊的数字游戏而是在问空间中哪个点在变形后跑到了 v如果 A 是可逆的那你总能逆着变换路径找回去且答案唯一。逆矩阵 A^{-1} 描述的就是一个“撤销”变换它把 v 映射回 x。这也是逆矩阵最基本的几何意义不是“除以矩阵”而是“反向执行一次变换”。二维逆矩阵公式 A^{-1} 1/(a×d - b×c) × [[d, -b], [-c, a]] 里为什么前面会有行列式分母因为它要放大或缩小回来如果原来的变换把面积放大了 k 倍逆变换就要把面积缩小到 1/k。这个 k 恰好等于行列式分母就出现了。一旦行列式为 0就意味着原变换把空间压扁了逆变换没有办法把压掉的那一维重新长出来自然就不存在。4.2 行列式为零时方程可能有解也可能无解这里有一个初学者最容易出错的地方很多人以为矩阵不可逆就意味着方程组一定无解。其实不对。行列式为零只代表 A 不可逆并不代表 Ax v 一定没有解。关键是看 v 是否落在压缩后的空间里。我用一个具体例子演示。取矩阵A [[1, 2], [2, 4]]它的两个列向量分别是 (1,2) 和 (2,4)完全共线所以 det(A)0。这个矩阵把所有二维点都压到了直线 y2x 上。现在取 v (1,2)这个向量恰好就在直线上那么它确实能找到原像。比如 x(1,0) 就是一个解x(-1,1) 也是解事实上整个解集是条直线有无数个解。再取 v(1,3)这个向量不在直线 y2x 上所以找不到原像方程无解。用几何语言说不可逆矩阵的像空间是一个低维子空间如果 v 不在这个低维像空间里你就找不到解如果 v 恰好在这个像空间里那么不只有唯一解而是有一整个“平行于零空间”的无穷多条解。行列式为 0 时方程的解从“唯一”变成“无解或无穷多解”具体是哪一种要看 v 落点。4.3 列空间、零空间与秩为什么是一家人理解上面那两种情况就要引入两个概念列空间和零空间。矩阵的列向量张成的空间叫列空间它描述的是“所有可能的输出向量”集合。因为 A x 本质上是对列向量的线性组合所以 Ax 能得到哪些向量完全由列空间说了算。于是 v 在不在列空间里直接对应方程有没有解。刚才 A 的列空间就是直线 span((1,2))所以 v(1,3) 不在其中自然无解。能被 A 压到原点的那些输入向量构成了零空间。零空间里的向量满足 A x 0。对于一个压扁了的变换会有一整条直线甚至一个平面的向量被送到原点。这些向量会在解方程时扮演“自由变动项”的角色。一旦你找到了一个特解就可以在这个特解上任意叠加零空间中的向量得到的新向量仍满足方程。所以零空间的维度决定了解的自由度。列空间维度和零空间维度加起来恰好等于原始输入空间维度。这个关系在 2×2 的例子中就是 112。如果把输入空间看作一个橡皮空间经过变换后有些维度被保留进输出空间有些维度被压缩进零空间。列空间是保留下来的那一部分秩就是列空间的维数。满秩时没有维度被压掉方程自然有唯一解缺秩时那些被压掉的维度恰恰就是自由变量的来源。5. 用 Python 亲手验证这些“本质”5.1 画一个网格让矩阵作用上去看再多的静态图不如自己让矩阵作用到网格上。我这里给出一小段可以立刻运行的 Python 代码它会把一组网格点经过一个剪切矩阵变换并画出变换前后的位置。import numpy as np import matplotlib.pyplot as plt points np.array([[x, y] for x in range(-3, 4) for y in range(-3, 4)], dtypefloat) A np.array([[1, 1], [0, 1]]) # 水平剪切 new_points np.array([A p for p in points]) plt.figure(figsize(6, 6)) plt.scatter(points[:, 0], points[:, 1], s15, alpha0.6, labelbefore) plt.scatter(new_points[:, 0], new_points[:, 1], s15, alpha0.6, labelafter) plt.grid(True) plt.axis(equal) plt.legend() plt.show()这段代码里我用循环逐个向量做乘法因为多花一点点性能换来更直观的理解非常值得。运行之后你会看到原本均匀分布的网格点变换后向右上方倾斜x 方向保持不变y 方向越大的点被推得越远。这比单纯看矩阵公式更能让你相信行列式的面积缩放不是抽象概念。你也可以把上面的 A 换成旋转矩阵、镜像矩阵等任何你感兴趣的 2×2 矩阵多试几次空间感会迅速建立起来。5.2 在 NumPy 中比较乘法顺序和行列式在电脑上验证矩阵乘法不符合交换律非常简单import numpy as np R np.array([[0, -1], [1, 0]]) S np.array([[1, 1], [0, 1]]) print(RS ) print(R S) print(SR ) print(S R) print(det(R), np.linalg.det(R)) print(det(S), np.linalg.det(S)) print(det(RS), np.linalg.det(R S))运行结果会清晰显示 RS 和 SR 不相等同时行列式方面det(RS) 会等于 det(R)×det(S)。这个等式验证了复合变换的缩放倍数是两次变换缩放倍数的乘积。我第一次看到这个结果时心里某个“这大概不是巧合”的想法固定成了确定的认识。这里要提醒一个 Python 新手很常踩的坑矩阵乘法用 不能写成 *。A * B 在 NumPy 里是逐元素相乘不是矩阵乘法。如果你用 * 去算 RS很快会得到一套完全错误的数字然后怀疑自己的数学出了问题实际只是操作符用错。5.3 一个检测缺秩矩阵解情况的代码实验最后用 NumPy 来测试缺秩矩阵的解情况。还是用刚才那个 A [[1, 2], [2, 4]]。它的行列式是 0尝试直接求逆会报错A np.array([[1, 2], [2, 4]]) b1 np.array([1, 2]) b2 np.array([1, 3]) print(np.linalg.det(A)) # 0.0 try: x np.linalg.solve(A, b1) print(x) except np.linalg.LinAlgError as e: print(solve error:, e)使用 np.linalg.solve 时会得到 LinAlgError因为矩阵奇异。但前面我说过矩阵奇异不代表一定无解b1(1,2) 就是有解的。要找出这些解可以用最小二乘或伪逆不过更重要的教训是计算工具告诉你“singular matrix”不是最终答案你仍然需要回到列空间去思考v 到底落没落在输出空间里。把上面实验跑通后我建议再做一个练习把 R 和 S 分别换成第三个小节提到的镜像矩阵或者自己编一个秩为 1 的矩阵再观察网格点阵和行列式。反复几次你会发现矩阵乘法、行列式、列空间这些原本分开的知识点已经慢慢在脑子里拧成了一股绳。这里整理几个我见过的典型误区对应正确的理解决策常见误区正确的本质理解
返回列表