如果你翻过本科线性代数教材,多半见过这样一个章节:“共轭、转置、共轭转置和逆矩阵的性质”。我当年翻这一节大概只用了十分钟,扫一眼觉得“哦,就是行列互换再取个共轭嘛”,然后把书一合,再也没管过。直到后来在信号处理里处理复数据、在机器学习里推导最小二乘、被同事问了一句“你这里为什么用的是转置而不是共轭转置”时,我才意识到自己当年的“懂了”是假的。这篇不是教科书复读,而是把这一组性质掰开揉碎,讲清楚它们为什么长成这样、彼此之间是什么关系、以及工程师在真实计算里到底用它们做了什么。
这篇文章适合三类人:正在学线性代数但被符号绕晕的学生,写代码时在A.T、A.conj().T、A^{-1}之间反复横跳的开发者,以及想补一补矩阵理论底子的科研/工程从业者。我不会列一堆冷冰冰的公式就完事,而是尽可能告诉你每个性质背后的直觉,以及在 Python、MATLAB 这类工具里怎么验证、怎么踩坑。
1. 为什么这四个运算总被绑定在一起:一次迟来的复盘
先想一个很基础的问题:矩阵世界里最常见的“一元运算”有哪些?加减乘除之外,你随手就能列出来的无非是转置、共轭、共轭转置、取逆。它们经常出现在同一个章节里,并不是编排者的习惯,而是因为这四个运算在结构上共享同一条“语法规则”。
矩阵的转置相当于把矩阵“翻面”,对角线不动,行列互换。共轭则是对每个元素取复数共轭,它只发生在复数域里,实数的共轭就是它自己,所以实数教材里根本不提。共轭转置看起来是转置和共轭的组合,实际上它是复数矩阵里更自然、更本质的“转置”。逆矩阵则完全是另一个维度的事——它处理的是矩阵乘法的逆元问题,跟“翻面”没啥关系。
但当你把转置、共轭、共轭转置、逆矩阵和“乘法”放在一起时,会发现一个贯穿始终的规律:凡是在乘积外面套了这些帽子,乘积内部就要反序。也就是说:
[ (AB)^T = B^T A^T,\quad (AB)^* = B^* A^*,\quad (AB)^{-1} = B^{-1} A^{-1} ]
转置反序、共轭转置反序、取逆也反序,唯独共轭不反序——因为共轭是逐元素操作,跟乘法交换顺序不影响结果,所以只有它不需要反序。
为什么乘法外面的这些运算都要反序?一个特别生活化的类比是穿衣服和脱衣服:你先穿衬衫、再穿外套,那么脱的时候必须先脱外套、再脱衬衫。矩阵乘法是有方向的组合,而转置/共轭转置/取逆本质上都在“折叠”这个组合,所以内部顺序必须倒过来。我第一次理解这个类比时,感觉一整页公式都串起来了。
这也是为什么教材要把这四个运算放在同一个章节里讲——它们的运算律几乎共享同一个“反序基因”,放在一起学,记忆成本最低。
2. 转置与共轭:从实数跨到复数的关键一步
2.1 转置的基本运算律
转置的定义人人都会:((A^T){ij} = A{ji})。它的一组核心运算律是这些:
- ((A^T)^T = A),转置两次回到自己;
- ((A + B)^T = A^T + B^T),加法与转置可交换;
- ((cA)^T = c(A^T)),数乘可以直接提出来;
- ((AB)^T = B^T A^T),乘法反序;
- (\det(A^T) = \det(A)),行列式不变;
- (\operatorname{rank}(A^T) = \operatorname{rank}(A)),秩不变。
前四条是线性代数里最常用的,后两条在做理论推导时会突然冒出来。比如求一个矩阵的逆时,如果有 ((AB)^T = B^T A^T),就能推出 ((A^T)^{-1} = (A^{-1})^T)。这个推导过程很典型,值得自己动手写一遍:
由 (A^{-1}A = I),两边同时转置,得 ((A^{-1}A)^T = I^T = I)。按乘法反序规则,左边等于 (A^T(A^{-1})^T)。于是 (A^T(A^{-1})^T = I),说明 ((A^{-1})^T) 正好是 (A^T) 的逆,也就是 ((A^T)^{-1} = (A^{-1})^T)。
还有一条细节容易被忽略:标量乘法的转置是 ((cA)^T = cA^T),这里没有共轭。这个规则在实数域完全没问题,但一旦进入复数域,就要小心了,见下一节。
2.2 共轭带来的“复数域修正”
共轭操作很简单:矩阵里每个元素都取复数共轭,记作 (\bar{A})。它在运算律上的表现也很直接:
- (\overline{(\bar{A})} = A);
- (\overline{(A+B)} = \bar{A} + \bar{B});
- (\overline{(cA)} = \bar{c}\bar{A});
- (\overline{(AB)} = \bar{A}\bar{B})(注意:这里不反序,因为逐元素共轭与乘法顺序无关);
- (\det(\bar{A}) = \overline{\det(A)})。
真正让共轭“必须要存在”的理由,是复数向量内积出了问题。在实数域里,向量 (x=(x_1,\dots,x_n)^T) 的长度平方是 (x^T x = \sum x_i^2),一个非负实数。但到了复数域,如果沿用 (x^T x = \sum x_i^2),结果可能是个复数,甚至可能为负。这显然没法用来表示“长度”。
于是复数域里的长度平方必须改为:
[ x^H x = \sum_{i=1}^n \overline{x_i}x_i = \sum_{i=1}^n |x_i|^2 ]
这里的 (x^H) 就是共轭转置(也叫 Hermitian 转置)。它不是我们“闲着没事先共轭再转置”,而是复数空间定义内积、定义长度、定义正交性的必然要求。
2.3 一个手算例子:向量长度为什么会逼出共轭
举个最简单的例子。设 (x = \begin{pmatrix} 1+i \ 2-i \end{pmatrix})。如果按实数公式算长度平方:(x^T x = (1+i)^2 + (2-i)^2 = (1+2i-1) + (4-4i-1) = 2i + (3-4i) = 3-2i)。结果是个复数,你没法说一个向量的长度是 (3-2i),这没有几何意义。
用共轭转置来算:(x^H x = (1+i)(1+\bar{i})?) 等等,严谨一点:
[ x^H x = \overline{(1+i)}(1+i) + \overline{(2-i)}(2-i) = (1-i)(1+i) + (2+i)(2-i) = 2 + 5 = 7 ]
得到的是实数为 7,那才是向量长度的平方。这个例子虽然基础,但每次都能提醒我:复数世界的所有“二次型”里,只要涉及模长、能量、功率,背后一定是共轭转置在起作用。
3. 共轭转置:复数矩阵真正的主角
3.1 共轭转置的定义与运算律
共轭转置的符号写法很多:(A^*)、(A^H)、(A^{\dagger})。定义就一句话:先对矩阵做共轭,再做转置,即
[ A^* = \overline{(A^T)} = (\bar{A})^T ]
它的一组运算律和转置长得非常像,只差在标量乘法的位置上多了一个共轭:
- ((A^)^= A);
- ((A + B)^* = A^* + B^*);
- ((cA)^* = \bar{c}A^*)(这就是和转置最大的区别:共轭转置会对标量取共轭);
- ((AB)^* = B^* A^*)(依然是反序);
- (\det(A^*) = \overline{\det(A)});
- (\operatorname{rank}(A^*) = \operatorname{rank}(A))。
这里最容易翻车的就是第三条。很多人记得 ((AB)^* = B^A^),却忘了 ((cA)^* = \bar{c}A^)。我见过不止一次在推导里把 ((iA)^) 直接写成 (iA^*) 的,结果后面全乱了。记住一个判断标准:共轭转置这个名字里包含两个动作,转置不影响标量,但共轭必然影响标量。
3.2 为什么 (AB)^*=B^A^:展开看一下
这条公式值得手动推一次,因为它是理解“反序”的关键。设 (C = AB),那么
[ (C^*){ij} = \overline{C{ji}} = \overline{\sum_k A_{jk} B_{ki}} = \sum_k \overline{A_{jk}},\overline{B_{ki}} ]
注意 (\overline{A_{jk}} = (A^){kj}),(\overline{B{ki}} = (B^)_{ik}),所以
[ (C^)_{ij} = \sum_k (B^){ik}(A^*){kj} = (B^* A^*)_{ij} ]
下标索引的顺序决定了结果必须是 (B^A^),而不是 (A^B^)。这就是反序的来历。你如果能自己把下标写一遍,以后就不会忘。
3.3 内积视角:伴随算子的定义
共轭转置不只是“符号拼接”,它在数学上对应线性算子的伴随算子(adjoint)。用内积语言说,如果 (A) 是某个线性变换,那么它的伴随算子 (A^*) 由下面这个等式唯一确定:
[ \langle Ax, y \rangle = \langle x, A^* y \rangle ]
这个式子才是共轭转置的“内在定义”,而“先共轭再转置”只是它在标准正交基下的坐标表现形式。学习线性代数时我很长时间没搞懂这一点,后来学泛函和量子力学时才发现,几乎所有关于矩阵的漂亮结论,都是从这个内积等式推出来的。比如厄米矩阵的特征值是实数、酉矩阵保持内积,根源都在这里。
3.4 Hermitian 与酉矩阵:工程中最常见的两个家族
Hermitian 矩阵满足 (A^* = A)。它的核心性质是:特征值必为实数。证明非常短:设 (Ax = \lambda x),两边左乘 (x^*),得 (x^*Ax = \lambda x^*x)。因为 (x^Ax) 是个标量,对它取共轭转置得到的是它自己(标量的共轭转置就是共轭),再利用 (A^=A),就有:
[ \overline{x^Ax} = x^A x ]
而左边又等于 (\bar{\lambda}x^*x),与右边比较就得到 (\lambda = \bar{\lambda}),所以 (\lambda) 必须是实数。这是一个非常优雅的证明,也是协方差矩阵、哈密顿量、刚度矩阵等一切“带物理意义矩阵”的核心支撑。
**酉矩阵(Unitary matrix)**满足 (U^U = I),也就是 (U^{-1} = U^)。它在实数域的对应物就是正交矩阵((Q^TQ = I))。酉矩阵最漂亮的性质是保持内积:
[ \langle Ux, Uy \rangle = \langle x, y \rangle ]
也就是说,乘一个酉矩阵不会改变向量的长度和夹角。通信、信号处理里的 DFT 矩阵、傅里叶矩阵都是酉矩阵,这直接决定了逆变换的成本可以为零——见第 6 节。
4. 逆矩阵:可逆的判别与四条关键运算律
4.1 逆矩阵的存在条件与求解思路
逆矩阵处理的是乘法逆元:如果 (A^{-1}A = AA^{-1} = I),那么 (A) 可逆,且逆唯一。可逆的前提是矩阵必须是方阵,且行列式不等于零;等价地说,矩阵满秩、列向量线性无关、零空间只包含零向量——这些说法都是同一件事。
实际求解通常不推荐用伴随矩阵法,那个计算量太大。高斯消元/初等行变换是手算标准做法,数值计算里则用 LU 分解或直接调用np.linalg.inv。软件里求逆其实也是先做分解再回代,不是把每个代数余子式都算出来。
需要特别提一句:工程计算中几乎不应该显式求逆矩阵。要解 (Ax=b),就直接np.linalg.solve(A, b),这比“先求 (A^{-1}) 再乘 (b)”数值稳定性好得多,速度也更快。但这是“计算习惯”层面的问题,本节讨论的是“运算律”层面的性质,两者不矛盾。
4.2 核心运算律:反序、交换与复合
逆矩阵的基本运算律如下:
- ((A^{-1})^{-1} = A);
- ((AB)^{-1} = B^{-1}A^{-1})(乘法反序);
- ((cA)^{-1} = c^{-1}A^{-1})((c \neq 0));
- (\det(A^{-1}) = 1/\det(A));
- 如果 (A) 对称且可逆,则 (A^{-1}) 也对称;
- 如果 (A) 是 Hermitian 且可逆,则 (A^{-1}) 也是 Hermitian。
第二条的性质和应用都极其广泛。比如在很多推导里,需要把 ((X^TX)^{-1}) 看成是“先作用 (X),再作用 (X^T),再求逆”,利用反序规则可以把它的结构拆开,避免展开一个巨复杂的矩阵乘法。
4.3 转置/共轭转置与取逆的互换
这一组性质是我当年最不敢相信的,因为太“好”了:
[ (A^T)^{-1} = (A^{-1})^T,\qquad (A^)^{-1} = (A^{-1})^]
翻译成大白话:转置和取逆可以交换顺序,共轭转置和取逆也可以交换顺序。这意味着在公式里你可以任意调整这两个帽子的先后顺序,不会影响结果。
证明思路我在 2.1 节已经演示过一遍,关键是利用“乘积的反序规则”。对共轭转置版本,从 (A^{-1}A = I) 两边取共轭转置:
[ (A^{-1}A)^* = A^* (A^{-1})^* = I^* = I ]
于是 ((A^)^{-1} = (A^{-1})^)。要留意的是这里的推导依赖 (A) 是方阵,左右逆才一致;如果不是方阵,只能用伪逆,那条性质和这里的结论不完全一样。
5. 把四个运算放在同一张表里:组合规则与高频误区
5.1 “帽子运算”的交换规则总结
在矩阵表达式中,转置、共轭、共轭转置、取逆看起来都像“戴帽子”的操作。它们之间有几个固定的交换关系,我用表格整理一下,方便随时查阅:
| 运算组合 | 结果 | 注意点 |
|---|---|---|
| 转置再转置 | ((A^T)^T = A) | 双重转置抵消 |
| 共轭再共轭 | (\bar{(\bar{A})} = A) | 双重共轭抵消 |
| 共轭转置再共轭转置 | ((A^)^= A) | 双重共轭转置抵消 |
| 转置与共轭组合 | (\bar{(A^T)} = (\bar{A})^T = A^*) | 顺序可交换,等于共轭转置 |
| 转置与取逆组合 | ((A^T)^{-1} = (A^{-1})^T) | 顺序可交换 |
| 共轭转置与取逆组合 | ((A^)^{-1} = (A^{-1})^) | 顺序可交换 |
| 乘积的转置 | ((AB)^T = B^T A^T) | 反序 |
| 乘积的共轭转置 | ((AB)^* = B^* A^*) | 反序 |
| 乘积的逆 | ((AB)^{-1} = B^{-1} A^{-1}) | 反序 |
| 乘积的共轭 | (\bar{(AB)} = \bar{A}\bar{B}) | 不反序 |
一个实用的记忆口诀是:除共轭外,其余三种帽子翻越乘法时都要反序;转置、共轭转置、取逆之间互相换序不影响结果。
5.2 实对称/Hermitian/正交/酉:四大家族对照
把 (A^T=A)、(A^*=A)、(A^T A=I)、(A^*A=I) 这四种条件放在一起对比,会看到非常整齐的结构:
| 矩阵类型 | 定义 | 实数域对应物 | 核心性质 | 典型场景 |
|---|---|---|---|---|
| 实对称矩阵 | (A^T = A) | 就是它自己 | 特征值为实数,特征向量可正交 | 协方差矩阵、二次型 |
| Hermitian 矩阵 | (A^* = A) | 实对称矩阵 | 特征值为实数,特征向量可酉正交 | 量子力学、谱分析 |
| 正交矩阵 | (Q^T Q = I) | 就是它自己 | 保持内积,(Q^{-1}=Q^T) | 旋转、反射、QR分解 |
| 酉矩阵 | (U^* U = I) | 正交矩阵 | 保持内积,(U^{-1}=U^*) | DFT、傅里叶变换、量子门 |
从这个表里能看出一个特别重要的原则:当你从实数转到复数时,所有公式里的转置 (^T) 都要换成共轭转置 (^*),才仍然成立。实对称对应 Hermitian,正交对应酉。很多写复数代码的人只把A.T改成别的什么,却没意识到背后的替换逻辑就在这里。
5.3 我见过的常见错误与记忆口诀
- 错误 1:以为 ((A^)^{-1}) 和 ((A^{-1})^) 不相等。你只要在 numpy 里跑一次就知道它们相等。这个性质太重要了,以至于很多人反而不敢相信。
- 错误 2:把 ((cA)^) 写成 (cA^)。正确结果还必须多一个共轭:(\bar{c}A^*)。
- 错误 3:搞混
A'和A.'。MATLAB 中A'是共轭转置,A.'才是普通转置;Python numpy 中A.T是普通转置,共轭转置要写成A.conj().T。这个差异在实矩阵上没有任何区别,但处理复数据时会带来莫名其妙的 bug。 - 错误 4:把 ((AB)^{-1}) 等同于 (A^{-1}B^{-1})。顺序反了。取逆的反序规则和转置完全一样。
我在写代码时习惯用一个很笨但有效的办法:每遇到“转置还是共轭转置”的犹豫,就回到“内积定义”这个原点。如果你在推导中要求某种“正交性”,或者某个量必须保持是实数,那答案多半是共轭转置。
6. 性质不是背来考试用的:三个实际场景里的“白给时刻”
6.1 最小二乘与正规方程:共轭转置决定了解的形状
最小二乘问题是最能体现“为什么必须用共轭转置”的场景。给定 (Ax \approx b),我们想最小化残差范数 (|Ax-b|_2^2)。把这个范数写开:
[ |Ax-b|_2^2 = (Ax-b)^*(Ax-b) ]
当 (A) 是复矩阵时,这里出现的不是转置而是共轭转置。目标函数对 (x) 求梯度并令其为零,得到正规方程:
[ A^*Ax = A^*b ]
如果当时手滑把共轭转置写成了普通转置,求出来的“最优解”根本不是真正的最小二乘解,尤其当数据是复数时,误差会在相位上完全跑偏。工程里做复最小二乘、信道估计、自适应滤波,几乎天天在用这个公式。共轭转置在这里不只是“符号习惯”,它决定了目标函数的几何意义。
6.2 DFT矩阵的酉性:FFT逆变换只要取共轭转置
离散傅里叶变换矩阵 (F) 的定义是 (F_{kn} = \frac{1}{\sqrt{N}} e^{-2\pi i kn/N})。这个矩阵最非凡的性质就是酉性:
[ F^*F = I ]
它意味着 DFT 的逆变换就是它的共轭转置,不需要额外计算任何逆矩阵。你在 NumPy 里做np.fft.ifft时,本质上就是np.conj(F).T @ X(乘一个缩放系数)。如果没有酉性,FFT 的逆变换就要求一个维数巨大的逆矩阵,工程上完全不可行。
这个例子特别适合用来检验自己是否理解共轭转置和逆矩阵的关系:当 (F^F=I) 时,由定义自然得到 (F^{-1}=F^),所以酉矩阵的“求逆”成本为零。而这种“零成本求逆”在信号处理、图像处理里反复出现。
6.3 PCA 与谱分析中 Hermitian 矩阵的特征值实数性
主成分分析(PCA)要计算协方差矩阵,而协方差矩阵天然满足实对称或 Hermitian 性质。为什么这是好消息?因为 Hermitian 矩阵的特征值一定是实数,这意味着我们不会得到复数的主成分方差,排序、解释、可视化都变得干净利落。
更深入一层,Hermitian 矩阵还有谱分解定理:它可以被酉对角化,即 (A = U\Lambda U^*)。这保证了特征向量可以选成一组标准正交基。所以 PCA 里旋转到主成分方向这一整套操作,本质上都是在利用“共轭转置和转置带来的正交结构”。谱分解定理和特征值实数性共享同一个根源——内积等式 (\langle Ax, y\rangle = \langle x, A^*y\rangle)。
6.4 用 numpy 亲手验证一遍所有性质
理论看再多都不如跑一遍代码。用一段简短的 Python 代码验证本文的核心性质,顺便帮你检查自己的环境里有没有把转置和共轭转置搞混:
import numpy as np np.random.seed(42) A = np.random.randn(3, 3) + 1j * np.random.randn(3, 3) B = np.random.randn(3, 3) + 1j * np.random.randn(3, 3) # 共轭转置两种写法等价 print("conj().T == T.conj():", np.allclose(A.conj().T, A.T.conj())) # (A^*)^* == A print("double conjugate transpose == A:", np.allclose(A.conj().T.conj().T, A)) # (AB)^* == B^* A^* lhs = (A @ B).conj().T rhs = B.conj().T @ A.conj().T print("(AB)^* == B^* A^*:", np.allclose(lhs, rhs)) # (A^*)^{-1} == (A^{-1})^* lhs = np.linalg.inv(A.conj().T) rhs = np.linalg.inv(A).conj().T print("(A^*)^(-1) == (A^(-1))^*:", np.allclose(lhs, rhs)) # 验证 DFT 矩阵的酉性 N = 8 k = np.arange(N).reshape(-1, 1) n = np.arange(N).reshape(1, -1) F = np.exp(-2j * np.pi * k * n / N) / np.sqrt(N) print("DFT matrix is unitary:", np.allclose(F.conj().T @ F, np.eye(N)))我在写这类验证代码时有个经验:浮点比较务必用np.allclose而不是==。因为转置、共轭、求逆这些操作在浮点数上会引入微小的舍入误差,直接用相等判断大概率会得到False,那不是理论错误,而是数值误差。用allclose才是比较矩阵性质是否成立的正确保养方式。
还有一个容易被忽略的小细节:共轭转置在 numpy 里的写法,A.conj().T和A.T.conj()都是合法的,因为它们正好可交换。这本身也印证了第 5 节里的交换规则——转置和共轭这两种操作施加在一个矩阵上时,顺序不影响最终结果。