数学基础 -- 线性代数之伴随矩阵

伴随矩阵

1. 余子式(Minor)

给定一个 n × n n\times n n×n 的方阵
A = ( a i j ) n × n , A = \bigl(a_{ij}\bigr)_{n\times n}, A=(aij)n×n,
余子式(又称“子式”)定义为:
M i j    =    det ⁡  ⁣ ( 从  A  中去掉第  i 行和第  j 列后得到的  ( n − 1 ) × ( n − 1 )  子矩阵 ) . M_{ij} \;=\; \det\!\Bigl(\text{从 }A\text{ 中去掉第 }i\text{行和第 }j\text{列后得到的 }(n-1)\times (n-1)\text{ 子矩阵}\Bigr). Mij=det( A 中去掉第 i行和第 j列后得到的 (n1)×(n1) 子矩阵).
它不带有 ( − 1 ) i + j (-1)^{i+j} (1)i+j 这样的符号因子。

例如对于 3 × 3 3\times 3 3×3 矩阵
A = ( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ) , A = \begin{pmatrix} a_{11} & a_{12} & a_{13}\\ a_{21} & a_{22} & a_{23}\\ a_{31} & a_{32} & a_{33} \end{pmatrix}, A= a11a21a31a12a22a32a13a23a33 ,
若要计算 M 11 M_{11} M11,就是去掉第 1 行与第 1 列,得到
( a 22 a 23 a 32 a 33 ) , \begin{pmatrix} a_{22} & a_{23}\\ a_{32} & a_{33} \end{pmatrix}, (a22a32a23a33),
其行列式即为 M 11 = a 22 a 33 − a 23 a 32 M_{11} = a_{22}a_{33} - a_{23}a_{32} M11=a22a33a23a32

**注意:**这里的 M i j M_{ij} Mij 称为 余子式,是一个数值(标量),不包含任何符号 ( − 1 ) i + j (-1)^{i+j} (1)i+j


2. 代数余子式(Cofactor)

代数余子式(cofactor)一般记为 C i j C_{ij} Cij,定义为:
C i j    =    ( − 1 )   i + j   M i j . C_{ij} \;=\; (-1)^{\,i+j}\,M_{ij}. Cij=(1)i+jMij.

因此,如果先写出余子式矩阵 ( M i j ) \bigl(M_{ij}\bigr) (Mij),再对其中每个元素乘上对应的 ( − 1 ) i + j (-1)^{i+j} (1)i+j,就能得到代数余子式矩阵 ( C i j ) \bigl(C_{ij}\bigr) (Cij)


3. 伴随矩阵(Adjugate 或 Adjoint)

伴随矩阵 adj ( A ) \text{adj}(A) adj(A) 定义为 “代数余子式矩阵的转置”,即
adj ( A )    =    ( C i j ) T    =    ( C 11 C 21 ⋯ C n 1 C 12 C 22 ⋯ C n 2 ⋮ ⋮ ⋱ ⋮ C 1 n C 2 n ⋯ C n n ) . \text{adj}(A) \;=\; \bigl(C_{ij}\bigr)^T \;=\; \begin{pmatrix} C_{11} & C_{21} & \cdots & C_{n1}\\ C_{12} & C_{22} & \cdots & C_{n2}\\ \vdots & \vdots & \ddots & \vdots \\ C_{1n} & C_{2n} & \cdots & C_{nn} \end{pmatrix}. adj(A)=(Cij)T= C11C12C1nC21C22C2nCn1Cn2Cnn .


4. 2×2 矩阵示例


A = ( a b c d ) . A = \begin{pmatrix} a & b \\ c & d\end{pmatrix}. A=(acbd).

  1. 首先,计算各个 余子式 M i j M_{ij} Mij

    • M 11 = d M_{11} = d M11=d (去掉第 1 行与第 1 列)
    • M 12 = c M_{12} = c M12=c (去掉第 1 行与第 2 列)
    • M 21 = b M_{21} = b M21=b (去掉第 2 行与第 1 列)
    • M 22 = a M_{22} = a M22=a (去掉第 2 行与第 2 列)
      因而 余子式矩阵
      ( M 11 M 12 M 21 M 22 )    =    ( d c b a ) . \begin{pmatrix} M_{11} & M_{12}\\ M_{21} & M_{22} \end{pmatrix} \;=\; \begin{pmatrix} d & c\\ b & a \end{pmatrix}. (M11M21M12M22)=(dbca).
  2. 再乘上符号 ( − 1 )   i + j (-1)^{\,i+j} (1)i+j,得到 代数余子式矩阵
    ( + 1 ⋅ d ( − 1 ) ⋅ c ( − 1 ) ⋅ b + 1 ⋅ a )    =    ( d − c − b a ) . \begin{pmatrix} +1\cdot d & (-1)\cdot c\\[6pt] (-1)\cdot b & +1\cdot a \end{pmatrix} \;=\; \begin{pmatrix} d & -c\\ -b & a \end{pmatrix}. (+1d(1)b(1)c+1a)=(dbca).

  3. 最后,伴随矩阵 adj ( A ) \text{adj}(A) adj(A) 是上面矩阵的转置:
    adj ( A )    =    ( d − b − c a ) . \text{adj}(A) \;=\; \begin{pmatrix} d & -b\\ -c & a \end{pmatrix}. adj(A)=(dcba).
    (对于 2×2 矩阵,很多人会直接记住“伴随矩阵就是把主对角元对调、把非对角元加负号后再换位置”——实际上就是以上三个步骤的综合效果。)


5. 用伴随矩阵求逆

det ⁡ ( A ) ≠ 0 \det(A)\neq 0 det(A)=0,则矩阵 A A A 可逆,并有著名公式:
A − 1 = 1 det ⁡ ( A )   adj ( A ) . A^{-1} = \frac{1}{\det(A)}\,\text{adj}(A). A1=det(A)1adj(A).


6. 小结

  • 本文详细阐述了“余子式”“代数余子式”和“伴随矩阵”之间的关系。
  • 计算伴随矩阵的步骤为:
    1. 计算余子式 M i j M_{ij} Mij
    2. 乘上符号 ( − 1 ) i + j (-1)^{i+j} (1)i+j 得到代数余子式矩阵 C i j C_{ij} Cij
    3. 对代数余子式矩阵转置,得到伴随矩阵。
  • 伴随矩阵在矩阵求逆中非常重要,是计算逆矩阵的关键步骤之一。
代数余子式是矩阵的一个重要概念。在C语言中,我们可以通过二维数组来表示矩阵,并且可以通过递归的方式求解矩阵的代数余子式。 代数余子式的定义是:对于n阶方阵A中的元素a[i][j],其代数余子式记为A[i][j],其值为(-1)^(i+j)乘以A[i][j]的代数余子式,即去掉第i行和第j列得到的n-1阶子阵的行列式。 以下是C语言实现矩阵的代数余子式的代码示例: ```c #include <stdio.h> #define N 3 // 矩阵的阶数 int det(int a[][N], int n) { int i, j, k, sign = 1, res = 0; int b[N - 1][N - 1]; if(n == 1) { return a[0][0]; } for(i = 0; i < n; i++) { for(j = 0; j < n - 1; j++) { for(k = 0; k < n - 1; k++) { b[j][k] = a[j + 1][(k >= i) ? k + 1 : k]; } } res += sign * a[0][i] * det(b, n - 1); sign = -sign; } return res; } int cofactor(int a[][N], int n, int i, int j) { int b[N - 1][N - 1]; int sign = ((i + j) % 2 == 0) ? 1 : -1; int det_b; int k, l; for(k = 0; k < n - 1; k++) { for(l = 0; l < n - 1; l++) { b[k][l] = a[(k < i) ? k : k + 1][(l < j) ? l : l + 1]; } } det_b = det(b, n - 1); return sign * det_b; } int main() { int a[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int i, j; printf("matrix:\n"); for(i = 0; i < N; i++) { for(j = 0; j < N; j++) { printf("%d ", a[i][j]); } printf("\n"); } printf("\ncofactor matrix:\n"); for(i = 0; i < N; i++) { for(j = 0; j < N; j++) { printf("%d ", cofactor(a, N, i, j)); } printf("\n"); } return 0; } ``` 代码中使用了两个函数,det和cofactor。其中,det函数用于计算矩阵的行列式,cofactor函数用于计算矩阵的代数余子式。 在主函数中,我们定义了一个3阶矩阵,并将其输出到屏幕上。然后,我们使用cofactor函数计算矩阵的每个元素的代数余子式,并将结果输出到屏幕上。 注意,这里的矩阵大小是预定义的,如果要处理不同大小的矩阵,需要修改代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值