
如果你翻过本科线性代数教材多半见过这样一个章节“共轭、转置、共轭转置和逆矩阵的性质”。我当年翻这一节大概只用了十分钟扫一眼觉得“哦就是行列互换再取个共轭嘛”然后把书一合再也没管过。直到后来在信号处理里处理复数据、在机器学习里推导最小二乘、被同事问了一句“你这里为什么用的是转置而不是共轭转置”时我才意识到自己当年的“懂了”是假的。这篇不是教科书复读而是把这一组性质掰开揉碎讲清楚它们为什么长成这样、彼此之间是什么关系、以及工程师在真实计算里到底用它们做了什么。这篇文章适合三类人正在学线性代数但被符号绕晕的学生写代码时在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{(AB)} \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_{i1}^n \overline{x_i}x_i \sum_{i1}^n |x_i|^2 ]这里的 (x^H) 就是共轭转置也叫 Hermitian 转置。它不是我们“闲着没事先共轭再转置”而是复数空间定义内积、定义长度、定义正交性的必然要求。2.3 一个手算例子向量长度为什么会逼出共轭举个最简单的例子。设 (x \begin{pmatrix} 1i \ 2-i \end{pmatrix})。如果按实数公式算长度平方(x^T x (1i)^2 (2-i)^2 (12i-1) (4-4i-1) 2i (3-4i) 3-2i)。结果是个复数你没法说一个向量的长度是 (3-2i)这没有几何意义。用共轭转置来算(x^H x (1i)(1\bar{i})?) 等等严谨一点[ x^H x \overline{(1i)}(1i) \overline{(2-i)}(2-i) (1-i)(1i) (2i)(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。软件里求逆其实也是先做分解再回代不是把每个代数余子式都算出来。需要特别提一句工程计算中几乎不应该显式求逆矩阵。要解 (Axb)就直接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^TA)、(A^*A)、(A^T AI)、(A^*AI) 这四种条件放在一起对比会看到非常整齐的结构矩阵类型定义实数域对应物核心性质典型场景实对称矩阵(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^FI) 时由定义自然得到 (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 节里的交换规则——转置和共轭这两种操作施加在一个矩阵上时顺序不影响最终结果。