"矩阵乘法不满足交换律"这句话,几乎每个学过线性代数的人都背过,但真能在脑子里把它和一幅几何画面挂上钩的人并不多。我带过几批做图形与导航算法的同事,被问得最多的两个问题是:$AB$ 和 $BA$ 到底差在哪儿,以及矩阵乘法在什么条件下可交换、这种可交换背后的几何意义是什么。别以为这是纯粹的理论洁癖——在做坐标系变换、刚体姿态计算、协方差递推、算符分析这些活儿的时候,只要你没搞清可交换的条件,就很容易写出一个"看起来对、跑起来飘"的模块。这篇文章我打算把这件事从头拆一遍:先讲清矩阵乘法为什么天生别扭,再从行观点和列观点两个角度把 $AB$ 与 $BA$ 的错位讲透,然后给出可交换的完整判定条件,最后落到几何意义上——可交换的本质,是两个变换共用一套特征方向。文中的结论对任意领域做线性代数相关工作的人都能直接用,不需要你有多深的数学底子,跟着推导走一遍就行。
1. 从"换个顺序就变脸"说起:AB 和 BA 差在哪
很多人对不可交换的理解停留在"数字乘法可以交换,矩阵不行"这个结论层面,但如果你不知道差在哪里,后面所有的判定条件都是空中楼阁。我习惯先把一个矩阵乘法拆成两种读法——行观点和列观点——这两个视角几乎能解释后面所有现象。
1.1 行观点:左乘一个矩阵,是在重组行
把 $A$ 按行拆成 $m$ 个行向量堆起来,$A = \begin{bmatrix} a_1^T \ a_2^T \ \vdots \ a_m^T \end{bmatrix}$。那么 $Ax$ 的第 $i$ 个分量就是 $a_i^T x$,也就是 $A$ 的第 $i$ 行和 $x$ 做内积。这就是所谓的行观点:左乘矩阵,等价于用每一行去"探测"输入向量。
把这个视角用到矩阵乘法 $C = AB$ 上:$C$ 的第 $i$ 行等于 $a_i^T B$,也就是 $B$ 的各行的线性组合,组合系数正好是 $A$ 第 $i$ 行的元素。说得直白点,$AB$ 的每一行,都是 $B$ 的行的重新配方。由此立刻得到一个非常有用的结论:$AB$ 的行空间一定包含在 $B$ 的行空间里。行空间就是行向量张成的空间,它的维数就是矩阵的秩,所以 $\mathrm{rank}(AB) \le \mathrm{rank}(B)$。
这个结论有多实用?举个例子,你手上有两个不同来源的数据矩阵,想把它们乘起来做特征提取,结果秩莫名变小了,用行观点一看就明白了——左乘那个矩阵在"重新配方"时,如果自己的行之间本来就线性相关,那配出来的新行自然也逃不出原来那个维度。我见过不少人在做降维模块时忽略这一点,最后发现输出维度塌陷,回头查了半天才发现是左乘矩阵的秩不够。
1.2 列观点:右乘一个矩阵,才是在做列的线性组合
反过来看列的读法。把 $B$ 按列拆开,$B = [b_1, b_2, \dots, b_p]$,那么 $AB = [Ab_1, Ab_2, \dots, Ab_p]$。$AB$ 的第 $j$ 列,就是 $A$ 的各列的线性组合,系数是 $B$ 第 $j$ 列的元素。这就是列观点。
列观点给出的结论同样干净:$AB$ 的列空间包含在 $A$ 的列空间里,所以 $\mathrm{rank}(AB) \le \mathrm{rank}(A)$。把两条合起来,就是那个经典的秩不等式:
$$\mathrm{rank}(AB) \le \min{\mathrm{rank}(A), \mathrm{rank}(B)}$$
这背后其实有一个很生活化的画面。你把 $B$ 想成一组菜的配方,每一列是一道菜各原料的用量;$A$ 想成一个"翻译器",把原料种类换成另一套原料种类。$AB$ 就是把所有菜的配方都翻译一遍。翻译器的输出种类上限,决定了翻译后所有菜最多能覆盖多少种原料——这就是 $\mathrm{rank}(AB) \le \mathrm{rank}(A)$。配方本身的独立度,决定了菜式最多有多少种独立搭配——这就是 $\mathrm{rank}(AB) \le \mathrm{rank}(B)$。
为什么我要花这么大篇幅讲行观点和列观点?因为 $AB$ 和 $BA$ 的区别,本质上就是"左乘在重组行、右乘在组合列"这两件事被放在不同位置造成的错位。$AB$ 的列空间被 $A$ 卡死,$BA$ 的列空间被 $B$ 卡死。两者的约束条件完全不同,所以你几乎不可能指望它们碰巧相等——除非某种特殊结构让两套约束恰好兼容。
1.3 两个视角叠起来,就能看出"错位"的本质
现在把两个视角叠起来看一个方阵情形。设 $A$、$B$ 都是 $n \times n$。$AB$ 与 $BA$ 之间有一些"看不太出来但确实存在"的共性:它们的迹相等,$\mathrm{tr}(AB) = \mathrm{tr}(BA)$;它们的特征多项式也相等,因此特征值完全一样;行列式当然也相等。很多刚接触这块的人会因此产生错觉,以为 $AB$ 和 $BA$ 差不了太多。
但注意,特征值相同不代表矩阵相同,甚至不代表相似。$AB$ 和 $BA$ 只有在 $A$ 或 $B$ 可逆时才相似(因为 $AB = A(BA)A^{-1}$),一般情形下它们连相似都谈不上。这就是那个"错位"的核心:它们共享谱信息这一层,但在不变子空间这一层可能完全不同。
我做个类比。你把两个变换想成两条流水线上的加工顺序:先钻孔后喷漆,和先喷漆后钻孔,最后成品的外观指标(对应特征值)可能凑巧一样,但中间那层材料的受力状态(对应不变子空间、特征方向)完全不是一回事。可交换,就是要求这两条流水线的顺序互不干扰——真正的强条件。
顺带说一句零空间视角。由 $ABx = A(Bx)$,凡是满足 $Bx = 0$ 的 $x$,必有 $ABx = 0$,所以 $\ker(B) \subseteq \ker(AB)$。这条包含关系在做子空间链分析的时候非常好用,尤其判断一个变换是否"吃掉"了另一个变换的信息时,直接看零空间嵌套就够了。
2. 可交换的判定条件:从一眼能看到的到一般结论
搞清楚了错位的来源,接下来回答核心问题:什么时候 $AB = BA$。我按"从显然到深刻"的顺序排一遍,你可以当成一个判定清单来用。
2.1 三类你能立刻看出来可交换的情形
第一类,标量矩阵。$A = \lambda I$ 和任何同阶矩阵都可交换,因为它就是个"均匀缩放",谁先谁后都只是把所有方向同时拉一下。几何上它没有偏爱任何方向,自然不跟任何变换吵架。
第二类,互为逆矩阵。如果 $B = A^{-1}$,那 $AB = BA = I$,天经地义。这一条最容易被误用,后面第 5 节我会专门讲这个坑。
第三类,一个是另一个的多项式。设 $B = p(A) = c_0 I + c_1 A + c_2 A^2 + \dots$,那么 $AB = A p(A) = p(A) A = BA$,因为 $A$ 和它的任意次幂都交换。这一类非常关键,因为它其实是一般结论的骨架——第 2.3 节会证明,在"特征值互异"这个条件下,可交换的矩阵只能是$A$ 的多项式,一个不多一个不少。
把三类放在一起看,它们的共同点已经呼之欲出了:都没有引入新的、独立于 $A$ 的方向。标量矩阵任何方向都是特征方向;$A^{-1}$ 的特征方向和 $A$ 完全一样(同一个特征向量对应特征值 $\lambda$ 和 $1/\lambda$);$p(A)$ 更不用说,$A$ 的特征方向就是它的特征方向。这个共同点,就是后面所有几何解释的入口。
2.2 中心化子:把所有能和 A 交换的矩阵装进一个空间
与其一个个试,不如换个问法:给定 $A$,把所有满足 $AB = BA$ 的 $B$ 一网打尽,它们组成什么结构?答案是:它们构成 $n \times n$ 矩阵空间的一个线性子空间,还构成一个代数(对乘法封闭),这个集合叫 $A$ 的中心化子,记作 $C(A)$。
先验证它是子空间:若 $B_1, B_2$ 都与 $A$ 交换,则 $A(B_1 + B_2) = AB_1 + AB_2 = B_1A + B_2A = (B_1+B_2)A$,对加法封闭;数乘同理。再验证它含 $I$、对乘法封闭,所以是个代数。你甚至可以把它看成"能和 $A$ 和平共处的所有变换"的集合。
这个视角的好处是,判断可交换变成了判断"某个 $B$ 是否落在某子空间里",可以量化。在 2.2 节末尾我先给一个能直接跑的数值判定思路,完整的代码在第 4.2 节:
用向量化算子法。把 $B$ 按列拉直成向量 $\mathrm{vec}(B)$,那么
$$\mathrm{vec}(AB) = (I \otimes A),\mathrm{vec}(B), \qquad \mathrm{vec}(BA) = (A^T \otimes I),\mathrm{vec}(B)$$
于是 $AB = BA$ 等价于
$$\big[(I \otimes A) - (A^T \otimes I)\big]\mathrm{vec}(B) = 0$$
这是个标准的齐次线性方程组。解空间的维数就是 $C(A)$ 的维数,用奇异值分解或者秩判决就能算出来。这套方法的好处是不需要任何技巧,多复杂的矩阵都能机械地算,工程里非常稳。
2.3 特征值互异时的强结论:B 必是 A 的多项式
现在到了整个话题最漂亮的部分。先给一个关键的几何观察,我把它叫不变性引理。
假设 $AB = BA$,而 $v$ 是 $A$ 的特征向量,$Av = \lambda v$。那么
$$A(Bv) = (AB)v = (BA)v = B(Av) = B(\lambda v) = \lambda (Bv)$$
也就是说,$Bv$ 仍然落在 $A$ 对应特征值 $\lambda$ 的那个特征子空间里。结论:可交换时,$A$ 的每个特征子空间都是 $B$ 的不变子空间。这句话是整篇文章的几何核心,其他内容都是它的推论。
现在假设 $A$ 有 $n$ 个互不相同的特征值 $\lambda_1, \dots, \lambda_n$($n$ 阶矩阵)。那么每个特征子空间都是一维的,各自张成一个特征方向。取对应 $\lambda_i$ 的单位特征向量 $v_i$,上面的引理告诉我们 $Bv_i$ 必须落在一维空间 $\mathrm{span}(v_i)$ 里,也就是
$$Bv_i = \mu_i v_i$$
这说明 $v_i$ 同时是 $B$ 的特征向量!于是 ${v_1, \dots, v_n}$ 这一组基同时把 $A$ 和 $B$ 都对角化了:
$$A = P,\mathrm{diag}(\lambda_1,\dots,\lambda_n),P^{-1}, \qquad B = P,\mathrm{diag}(\mu_1,\dots,\mu_n),P^{-1}$$
还没完。既然它们的特征向量完全一致,我们就能构造一个多项式 $p(t)$,使得 $p(\lambda_i) = \mu_i$ 对每个 $i$ 都成立——这是拉格朗日插值问题,$n$ 个点永远能插出一条次数不超过 $n-1$ 的多项式。于是 $p(A)$ 在这组基下对应的对角元正好是 $p(\lambda_i) = \mu_i$,和 $B$ 完全一致。所以
$$B = p(A)$$
在特征值互异的条件下,与 $A$ 可交换的矩阵恰好就是 $A$ 的多项式,中心化子的维数是 $n$。一个不多,一个不少。
这个结论为什么重要?因为它把"可交换"这个代数条件,翻译成了"共用特征方向"这个几何条件,而且告诉你两者是等价的。工程上这意味着一件大事:当你的系统矩阵特征值互异时,任何与它可交换的矩阵都不会凭空引入新的方向,整个系统的"方向骨架"是唯一的。
2.4 特征值有重根时怎么办:块分解加不定元法
现实里的矩阵常常有重特征值,上面的强结论会松动,但处理思路是可以推广的。分两种情况说。
情况一:重根但可对角化。比如 $A = \mathrm{diag}(1,1,2)$。这时特征子空间不再是一维,$A$ 的中心化子变大:所有形如
$$B = \begin{bmatrix} * & * & 0 \ * & * & 0 \ 0 & 0 & * \end{bmatrix}$$
的矩阵都与 $A$ 交换,中间那个 $2\times 2$ 块在特征值 1 的二维特征子空间里随便转都不影响交换性。维数是 $4 + 1 = 5$,而 $A$ 的多项式只给出维数 2 的那一小块。所以重根情形下,可交换的矩阵远不止多项式那一族。
情况二:重根且不可对角化,比如 Jordan 块。取 $A = \begin{bmatrix}\lambda & 1 \ 0 & \lambda\end{bmatrix}$。手算一下就会发现,与之可交换的矩阵恰好是 $aI + bA$ 这种形式,也就是仍然等于 $F[A]$。原因是 $2\times 2$ 的非标量矩阵一定是"循环"的(极小多项式次数等于阶数 $n=2$),循环矩阵的中心化子永远恰好等于它的多项式代数,维数为 $n$。
一般情形有个可以背下来的维数公式。设 $A$ 的 Jordan 标准型中,对应某个特征值 $\lambda$ 的 Jordan 块按大小从大到小排为 $s_1 \ge s_2 \ge \dots \ge s_r$,那么中心化子中"属于这个特征值"的那部分维数是
$$\dim = \sum_{i=1}^{r}\big(2(r-i)+1\big),s_i$$
这个公式我第一次看到的时候觉得挺吓人,但代入特例就很直观。$r=1$(只有一个块)时结果就是 $s_1$,即该特征值只贡献一个 $s_1$ 维的块空间;$A$ 是单个 $n$ 阶 Jordan 块时结果为 $n$,正好对应 $F[A]$ 的维数 $n$。$A = \lambda I$ 时 $r = n$,每个 $s_i = 1$,求和得 $n^2$,正好是所有矩阵都与它交换。公式是对的。
最后一句话总结这一节:特征值互异时,中心化子最小(维数 $n$),可交换矩阵全在 $A$ 的多项式里;重根越多、结构越退化,中心化子越大,能跟自己交换的矩阵越多。这个"单调"关系非常符合直觉——一个变换越"没有偏好"(退化为标量),它就越不挑伙伴。
3. 几何意义:可交换等于"共用一套坐标系"
代数条件讲完了,现在把这层壳剥掉,看底下的几何画面。我准备用三个具体例子把它讲实:同时对角化、同轴旋转、以及缩放投影的对照。
3.1 同时对角化:两把尺子量同一组方向
第 2.3 节的推导其实已经证明了这条定理的一个特例,把它说完整:一族两两可交换的矩阵,如果每个都可对角化,那么它们可以同时被对角化。更一般地,任意一族两两可交换的复矩阵,都能被同一个可逆矩阵同时上三角化(这是 Schur 三角化定理在一族交换矩阵上的推广)。
这句话的几何翻译是:存在一族公共的向量方向,取它们作为新坐标系的坐标轴之后,你手上的每一个变换都只做"沿各轴独立伸缩",没有任何旋转、剪切、混合。用一个更接地气的类比:一群人一起量同一间屋子。有人用卷尺量,有人用激光测距,工具不同(矩阵不同),但只要他们量的是同一组方向和墙角(公共特征基),他们的测量结果就互相兼容,谁先谁后测都不影响最终的尺寸表。
反过来,如果两个可对角化矩阵不能同时对角化,那么它们一定存在"轮换的矛盾"——某些特征方向在对方的操作下被扭到了别的方向上去。这就是不可交换的几何本质。
这里有一个很实用的副产品。判定两个对称矩阵(实对称矩阵一定可对角化,且特征向量可以取成正交的)是否可交换,可以这样理解:它们可交换当且仅当它们共享一族正交特征基。因为正交可对角化矩阵同时对角化后,那个公共的可逆矩阵可以取成正交矩阵,对应纯旋转式的坐标变换。这个结论在做协方差矩阵分析、主成分操作顺序交换性检查时,可以直接拿来用。
3.2 旋转族的几何:同轴旋转天然可交换
旋转是理解可交换最直观的例子,没有之一。
先看二维。平面上的旋转矩阵
$$R(\theta) = \begin{bmatrix}\cos\theta & -\sin\theta \ \sin\theta & \cos\theta\end{bmatrix}$$
满足 $R(\theta)R(\varphi) = R(\theta+\varphi) = R(\varphi)R(\theta)$。所有二维旋转两两可交换,因为转 $\theta$ 再转 $\varphi$,和先转 $\varphi$ 再转 $\theta$,转的角度都加起来,结果一样。几何上它们都绕同一个点(同一条轴)转,谁也不干扰谁的转轴。
再看三维,情况立刻变了。绕 $z$ 轴转 $90°$ 和绕 $x$ 轴转 $90°$,先做哪个,刚体的最终朝向完全不同。用矩阵语言就是因为绕不同轴的旋转不交换,对应的特征方向(转轴)互相都保持不住。所以 $R_z(\theta) R_x(\varphi) \ne R_x(\varphi) R_z(\theta)$,除非角度取特殊值(比如 $0$、$\pi$ 这类退化情形)。
这个对比直接给出了旋转可交换的判定直觉:两个旋转可交换,当且仅当它们绕同一条转轴(在不考虑退化为恒等或中心对称的前提下)。
我把这条应用到过刚体姿态的问题上,效果很直接。当你需要连续叠加几个姿态角时,如果这些旋转都绕同一个机体轴,那顺序随意,代码里怎么排都行;只要有两个绕不同轴,就必须老老实实按约定顺序做,因为矩阵乘法的顺序就是这些旋转的施加顺序。很多姿态解算的 bug,追根到底就是有人默认旋转可交换了。
还有一个解析上很漂亮的小结论值得记住。二维旋转 $R(\theta)$ 是一族单参数变换,它和任意矩阵 $M$ 交换的条件是 $M$ 必须是"与旋转等变"的。代进去算一下你会发现,二维情形下与所有旋转都交换的矩阵只能是 $aI + bJ$ 形式的"旋转-缩放组合",其中 $J = \begin{bmatrix}0&-1\1&0\end{bmatrix}$。这类矩阵正是复数乘法的矩阵表示——它对应复平面上 $z \mapsto (a+bi)z$ 的乘法。平面相似变换(旋转加均匀缩放)全体构成一个交换代数,这就是为什么复数乘法那么好用。这个观察我第一次注意到的时候,感觉前面那些干巴巴的判定条件一下子有了画面。
3.3 缩放、投影、对称变换的几何对照
再来一组对照,把"什么时候能交换"的边界划清楚。
缩放和旋转。取斜缩放 $D = \mathrm{diag}(a, b)$,$a \ne b$,和一个旋转 $R(\theta)$。直接算:
$$DR(\theta) = \begin{bmatrix}a\cos\theta & -a\sin\theta \ b\sin\theta & b\cos\theta\end{bmatrix}, \qquad R(\theta)D = \begin{bmatrix}a\cos\theta & -b\sin\theta \ a\sin\theta & b\cos\theta\end{bmatrix}$$
比较非对角元,要求 $(a-b)\sin\theta = 0$ 且 $(a-b)\cos\theta = 0$。因为 $a \ne b$,必须 $\sin\theta = \cos\theta = 0$,这不可能同时成立。所以斜缩放和旋转只在退化为 $R(\theta) = \pm I$ 时才可交换:$R(0)=I$ 是恒等,$R(\pi) = -I$ 是中心对称(它恰好是个标量矩阵)。
换成各向同性缩放 $D = aI$ 呢?它和任何旋转都交换,因为它没有偏爱方向,跟谁都合作。这就是第 2.1 节第一类情形在几何上的样子。这条对照说明了一件事:缩放和旋转能否交换,取决于缩放是不是各向同性的。非均匀的拉伸一定会破坏旋转的不变方向,除非那个旋转本身就退化了。
两个投影。设 $P$、$Q$ 都是正交投影($P^2 = P = P^T$,$Q$ 同)。它们可交换 $PQ = QP$ 的几何含义是什么?可以证明:这等价于 $PQ$ 本身也是一个正交投影,并且此时 $\mathrm{ran}(PQ) = \mathrm{ran}(P) \cap \mathrm{ran}(Q)$,$\mathrm{ker}(PQ) = \mathrm{ker}(P) + \mathrm{ker}(Q)$。也就是说,两个投影可交换,等价于它们能够同时对角化,公共特征方向要么被两者都保留,要么至少被一个直接压掉。
这条在做信号处理里的子空间分解特别好用。当你手上两个投影算子作用顺序不影响结果时,说明它们描述的子空间是"协调"的,可以直接做交和并;如果不可交换,就说明这两个子系统存在真正的耦合,不能简单当成正交分解来处理。踩过这个坑的人应该都有印象:忽略可交换性,硬把两个投影按顺序乘起来当作组合投影,得到的算子既不是投影也不是幂等,后续所有基于幂等性的推导全废。
对称与反对称。若 $A$ 实对称,$B$ 实反对称($B^T = -B$),可交换会带来什么约束?由 $AB = BA$ 两边取转置,注意 $A^T = A$、$B^T = -B$,得到 $B^T A^T = A^T B^T$,即 $-BA = -AB$,还是原来那条,没有新信息。但把 $B$ 看成"无穷小旋转",$AB = BA$ 的含义是:这个无穷小旋转保持 $A$ 的谱结构不变,它是 $A$ 的一个"对称性生成元"。这条在高阶张量分析和连续对称性讨论里有大量应用,属于同一个几何母题——可交换的变换,是对方结构的对称操作。
4. 上手实操:可复现的判定流程与代码验证
理论讲完了,接下来给能够直接抄作业的部分。我按"手算、数值、结构化判断"三种手段各给一套流程,你可以根据自己手头的问题选。
4.1 2×2 情形的完整手算
小尺寸手算最能把逻辑吃透。设 $A = \begin{bmatrix}a&b\c&d\end{bmatrix}$ 是非标量矩阵,$B = \begin{bmatrix}x&y\z&w\end{bmatrix}$,要 $AB = BA$。
展开后逐项相等,整理出四个方程,其中有两条是同一件事,最终归为两条:
$$c(x - w) = z(a - d), \qquad y(a - d) = b(x - w)$$
设 $t = x - w$。这两条方程的结构已经很清楚了。如果 $A$ 非标量($a\ne d$ 或 $b \ne 0$ 或 $c \ne 0$),解空间维数总是 2,通解是
$$B = \alpha I + \beta A = \begin{bmatrix}\alpha + \beta a & \beta b \ \beta c & \alpha + \beta d\end{bmatrix}$$
代入验证:对角差 $x - w = \beta(a-d)$,非对角 $z = \beta c$、$y = \beta b$,方程 $c\cdot\beta(a-d) = \beta c \cdot (a-d)$ 成立,另一条同理。解确实就是两参数族,几何上任何与二维非标量矩阵可交换的矩阵,都是"沿其特征方向各向异性缩放"的组合,不引入新方向。
反过来,如果 $A$ 是标量矩阵 $A = \lambda I$(即 $a = d$、$b = c = 0$),上面的方程全部自动满足,$B$ 完全任意,维数跳到 4。这就是那个"越没偏好越不挑伙伴"的量化体现。
这里有个实操提醒:手算这种 2×2 推导时,最容易出错的是把行列式和迹相等误当成可交换的判据。$\mathrm{tr}(AB) = \mathrm{tr}(BA)$ 恒成立,跟可不可交换没关系;但 $\mathrm{tr}(AB - BA) = 0$ 也一样恒成立。要判断可交换,只看迹是永远判不出来的,必须看完整的矩阵差。
4.2 用 Python 做数值验证
工程里判定可交换,我一般用两套代码:一套做定性判断(范数阈值),一套做定量分析(中心化子维数)。下面这段直接可跑,依赖只有 NumPy。
import numpy as np # ---------- 方案一:直接数值判定是否可交换 ---------- def is_commute(A, B, tol=1e-9): """判断方阵 A、B 是否可交换,用相对误差做阈值。""" A = np.asarray(A, dtype=float) B = np.asarray(B, dtype=float) if A.shape != B.shape or A.shape[0] != A.shape[1]: raise ValueError("A 和 B 必须是同阶方阵") diff = A @ B - B @ A scale = max(np.linalg.norm(A) * np.linalg.norm(B), 1e-12) return np.linalg.norm(diff) / scale < tol # ---------- 方案二:算中心化子维数 ---------- def commutant_dim(A, tol=1e-9): """返回 C(A) = {B : AB = BA} 的维数。 原理: vec(AB) = (I ⊗ A) vec(B), vec(BA) = (A^T ⊗ I) vec(B), 所以可交换矩阵就是 (I⊗A - A^T⊗I) 这个 n^2 阶矩阵的零空间。 """ A = np.asarray(A, dtype=float) n = A.shape[0] I = np.eye(n) M = np.kron(I, A) - np.kron(A.T, I) # (n^2) x (n^2) rank = np.linalg.matrix_rank(M, tol=tol) return n * n - rank # ---------- 几个对照测试 ---------- A1 = np.array([[1., 2.], [3., 4.]]) # 特征值互异 print("维数(互异特征值):", commutant_dim(A1)) # 期望 2 A2 = np.diag([1., 1., 2.]) # 有重根且可对角化 print("维数(重根可对角化):", commutant_dim(A2)) # 期望 5 A3 = 3.0 * np.eye(3) # 标量矩阵 print("维数(标量矩阵):", commutant_dim(A3)) # 期望 9 # 顺便验证旋转族可交换 from math import cos, sin, pi def R(t): return np.array([[cos(t), -sin(t)], [sin(t), cos(t)]]) print("两个旋转可交换:", is_commute(R(0.3), R(1.1))) # True print("斜缩放与旋转交换:", is_commute(np.diag([2., 5.]), R(0.7))) # False运行结果和理论完全对得上:互异特征值的 2×2 矩阵中心化子维数是 2,重根可对角化的 3×3 是 5,标量矩阵是 9。我第一次跑这个脚本时,就是为了确认维数公式没记错,如果你也怀疑某个公式,用这段代码代几个例子进去是最快的验证方式。
关于阈值,有个经验值分享一下:tol别取太死。浮点运算下 $AB - BA$ 的误差量级大概在 $\epsilon \cdot |A||B|$ 附近,双精度 $\epsilon \approx 2.2\times10^{-16}$。我一般用相对误差1e-9到1e-12之间,如果你发现某个理论上应该可交换的实例判成了 False,先检查相对误差写法有没有除到范数上,八成是量级没归一化。
4.3 用不变子空间做结构化判断
当矩阵阶数很大、或者你想理解"为什么可交换"而不只是"是否可交换"时,数值判定就不够用了,得回到结构。我给一套我常用的判断顺序:
第一步,先看有没有明显的公共结构。两个对角矩阵一定可交换;两个同阶的块对角矩阵,如果分块方式一致,可交换性可以逐块判断,大幅降低计算量。这在处理大规模稀疏系统时特别管用,能把 $n^2$ 的判定拆成一堆小块。
第二步,看特征子空间是否互相不变。对 $A$ 做特征分解(或者 Schur 分解更稳),拿到特征子空间之后,检查 $B$ 是否把每个特征子空间又映射回它自己。这个检查等价于对每个特征值 $\lambda$,把 $B$ 限制在 $A$ 的广义特征子空间上看它的表示。如果所有特征子空间都被保持,那就可交换。
第三步,看极小多项式次数是否等于阶数。如果 $n$ 阶矩阵 $A$ 的极小多项式次数等于 $n$(也就是 $A$ 是循环的),那么任何与它可交换的 $B$ 都是 $A$ 的多项式,你只需要解一个 $n$ 元线性方程组求出多项式系数就完事了。反之,如果极小多项式次数小于 $n$,说明有重根且可对角化的部分存在,可交换矩阵会多出来一批"额外自由度",这时候就必须逐块处理。
第四步,实在不行再上数值求解中心化子基。直接对那个 $n^2$ 阶的 $M = I\otimes A - A^T \otimes I$ 做奇异值分解,取右奇异向量里对应零奇异值的部分,就能拿到 $C(A)$ 的一组标准正交基。$n$ 到十几这个规模完全够用;再大就得用稀疏化方法,因为 $n^2 \times n^2$ 的内存会吃不消。
这套流程走下来,90% 的工程问题都能给出解释,而不仅仅是"True/False"。
5. 常见误区与排查速查表
最后这一节是我这些年踩过的坑汇总,很多是文档里不会写、但实际会出问题的点。
5.1 四个高频误区
误区一:把"互为逆矩阵"当成可交换的普遍来源。逆矩阵只是可交换的一个特例,而且很多可交换的对根本不可逆,比如两个幂零矩阵。更危险的是反过来推——看到 $AB = BA$ 就以为 $B$ 是 $A^{-1}$ 的某个倍数,这是彻底错的。正确的直觉是"$B$ 是 $A$ 的结构保持者",而不是"$B$ 是 $A$ 的逆"。
误区二:以为特征向量相同就万事大吉。有两个坑。第一,实矩阵可能没有实特征向量(比如旋转矩阵),但这不影响它和别的矩阵可交换的判断——这时候得在复数域或者用不变子空间来说。第二,即使特征值互异,特征向量也天然"对齐",但如果你手上两个矩阵特征向量碰巧相同,那也是可交换的,这一点可以放心用。
误区三:数值上认为"差不多相等"就是可交换。我在第 4.2 节强调过,误差必须做相对归一化。有一个更隐蔽的坑:如果 $A$ 或 $B$ 是病态矩阵(条件数极大),$AB - BA$ 的绝对误差可能很小,但相对误差巨大,此时任何阈值都不靠谱,得先做预处理或者换用结构化判断。
误区四:忽略可交换带来的"代数红利"。一旦确认 $AB = BA$,就有一批工具立刻可用:二项式定理 $(A+B)^k = \sum_{i=0}^{k}\binom{k}{i}A^iB^{k-i}$ 成立;指数映射满足 $e^{A}e^{B} = e^{A+B}$;幂等性可以传递。这些在推导里能省下大量功夫。反过来,如果没确认可交换就直接用这些公式,结果必错。我见过有人在做矩阵幂展开时默认二项式成立,结果系统矩阵根本不交换,展开式少了一半的交叉项,仿真曲线偏了百分之十几才发现。
5.2 排查清单速查表
我把最常见的情形整理成一张表,碰到问题直接对号入座。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 理论上该交换,数值判定却是 False | 误差阈值没做相对归一化 | 把 $AB-BA$ 的范数除上 $|A||B|$ 再比 |
| 中心化子维数比预期大很多 | $A$ 有重特征值且可对角化 | 检查极小多项式次数是否小于阶数 |
| 可交换但 $B$ 找不到多项式表示 | 极小多项式次数小于阶数,存在额外自由度 | 改用逐特征子空间的块分解 |
| 旋转叠加顺序不同结果不同 | 两个旋转绕不同轴,天然不可交换 | 确认转轴是否一致,或改用四元数约定顺序 |
| 投影算子相乘后不是投影 | 两个投影不可交换 | 先验证 $PQ = QP$,再使用幂等性质 |
| 缩放与旋转不可交换 | 缩放非各向同性 | 检查缩放矩阵对角元是否相等 |
这张表里我最常翻出来看的是第一行和第三行。第一行是纯工程问题,改个阈值就完事;第三行是概念问题,需要你意识到"重根"会打开额外的可交换自由度,这是从理论到实践的必经一步。
还有一个进阶的排查角度:如果你在做矩阵指数、矩阵对数、Lie 代数相关的推导,可交换性直接决定了两个生成元能不能交换。一参数变换群满足 $e^{tA}e^{sB} = e^{tA+sB}$ 的条件正是 $[A,B] = AB - BA = 0$。几何上,两个可交换的一参数群张成一个二维的交换群,就像两个绕同轴的旋转角可以任意组合成为一个二维旋转参数面。这条在导航、机器人运动学、连续时间系统里天天用,值得单独记下来。
5.3 一个我常用的反向检查技巧
最后分享一个我经常用来"快速证伪"的技巧。当你怀疑两个矩阵不可交换,但又不想完整算一遍 $AB$ 和 $BA$ 时,可以只算一个"探针"。
取 $A$ 的一个特征向量 $v$(如果好求的话),计算 $Bv$。如果 $Av = \lambda v$ 而 $Bv$ 明显不落在 $\mathrm{span}(v)$ 里,那就直接判不可交换,根据就是第 2.3 节的不变性引理。这个检查只需要一次矩阵向量乘,代价极低,尤其在迭代过程里做实时监控时非常划算。
反过来,如果某个向量同时是 $A$ 和 $B$ 的特征向量,那它不构成可交换的证据(只能说在这个方向上兼容),可交换要求所有特征子空间都不变。这一点千万别搞反了,我在代码评审时见过有人找到一组公共特征向量就下结论说两个矩阵可交换,结果在别的方向上翻车。
这套判定和几何解释,我在不同项目里反复用过。矩阵可交换这件事,表面上是代数条件 $AB = BA$,往下一层是"共用特征方向"的几何条件,再往下一层就是"两个变换互相是对方结构的保持者"。把这三层对上号之后,你写代码时对顺序的敏感度会完全不一样——哪些地方可以随便交换、哪些地方必须严守顺序,心里自然就有数了。后续如果要做参数化系统的稳定性分析,还可以顺着中心化子的维数往下挖,它能告诉你系统的"对称性自由度"到底有多大。