Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第三十 矩阵(Matrix)

矩阵(Matrix)是线性代数的核心概念,是由 $m \times n$ 个数排成的 $m$ 行 $n$ 列的矩形数表。矩阵不仅是描述线性变换的工具,也是解决线性方程组、数据分析、机器学习等问题的基础。


一、矩阵的基本概念

1.1 矩阵的定义

一个 $m \times n$ 矩阵 $A$ 可以表示为:

$$A = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} \ a_{21} & a_{22} & \cdots & a_{2n} \ \vdots & \vdots & \ddots & \vdots \ a_{m1} & a_{m2} & \cdots & a_{mn} \end{pmatrix}$$

其中 $a_{ij}$ 表示第 $i$ 行第 $j$ 列的元素。

1.2 特殊矩阵

矩阵类型定义示例
零矩阵所有元素为 0$O$
单位矩阵主对角线为 1,其余为 0$I_n$
对角矩阵非主对角线元素全为 0$\text{diag}(d_1, d_2, \ldots, d_n)$
数量矩阵单位矩阵的常数倍$kI$
上三角矩阵主对角线下方全为 0
下三角矩阵主对角线上方全为 0
对称矩阵$A^T = A$
反对称矩阵$A^T = -A$
正交矩阵$A^T A = I$旋转矩阵
use nalgebra as na;
use na::{Matrix2, Matrix3};

fn main() {
    // 单位矩阵
    let i2 = Matrix2::<f64>::identity();
    println!("单位矩阵 I₂:\n{}", i2);

    // 对角矩阵
    let diag: Matrix3<f64> = Matrix3::from_diagonal(&na::Vector3::new(1.0, 2.0, 3.0));
    println!("对角矩阵 diag:\n{}", diag);

    // 零矩阵
    let zero: Matrix2<f64> = Matrix2::zeros();
    println!("零矩阵 zero:\n{}", zero);
}

二、矩阵的基本运算

2.1 矩阵的加法与减法

两个同型矩阵(行数和列数相同)可以相加或相减,对应元素相加减:

$$C[i,j] = A[i,j] + B[i,j]$$

$$C[i,j] = A[i,j] - B[i,j]$$

2.2 矩阵的数乘

矩阵与标量相乘,每个元素都乘以该标量:

$$(kA)[i,j] = k \cdot A[i,j]$$

2.3 矩阵的乘法

矩阵乘法是线性代数中最重要的运算。设 $A$ 是 $m \times n$ 矩阵,$B$ 是 $n \times p$ 矩阵,则 $AB$ 是 $m \times p$ 矩阵:

$$C[i,j] = \sum_{k=1}^{n} A[i,k] \cdot B[k,j]$$

注意: 矩阵乘法不满足交换律,即一般情况下 $AB \neq BA$。

fn matrix_multiply(a: &Vec<Vec<f64>>, b: &Vec<Vec<f64>>) -> Option<Vec<Vec<f64>>> {
    let rows_a = a.len();
    let cols_a = a[0].len();
    let cols_b = b[0].len();

    if cols_a != b.len() {
        return None;
    }

    let mut result = vec![vec![0.0; cols_b]; rows_a];
    for i in 0..rows_a {
        for j in 0..cols_b {
            for k in 0..cols_a {
                result[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    Some(result)
}

fn main() {
    let a = vec![vec![1.0, 2.0], vec![3.0, 4.0]];
    let b = vec![vec![5.0, 6.0], vec![7.0, 8.0]];

    if let Some(c) = matrix_multiply(&a, &b) {
        println!("A × B =");
        for row in &c {
            println!("  {:?}", row);
        }
        // [19, 22]
        // [43, 50]
    }
}

2.4 矩阵乘法的性质

性质说明
结合律$(AB)C = A(BC)$
分配律$A(B+C) = AB + AC$
单位元$AI = IA = A$
不满足交换律一般 $AB \neq BA$
转置性质$(AB)^T = B^T A^T$

2.5 矩阵的转置

将矩阵的行和列互换:

$$(A^T){ij} = A{ji}$$

转置的性质:

  • $(A^T)^T = A$
  • $(A + B)^T = A^T + B^T$
  • $(kA)^T = kA^T$
  • $(AB)^T = B^T A^T$
  • $(A^{-1})^T = (A^T)^{-1}$
fn transpose(matrix: &Vec<Vec<f64>>) -> Vec<Vec<f64>> {
    let rows = matrix.len();
    let cols = matrix[0].len();
    let mut result = vec![vec![0.0; rows]; cols];
    for i in 0..rows {
        for j in 0..cols {
            result[j][i] = matrix[i][j];
        }
    }
    result
}

fn main() {
    let a = vec![vec![1.0, 2.0, 3.0], vec![4.0, 5.0, 6.0]];
    let at = transpose(&a);
    println!("A 的转置:");
    for row in &at {
        println!("  {:?}", row);
    }
    // [1, 4]
    // [2, 5]
    // [3, 6]
}

三、方阵的行列式

对于 $n$ 阶方阵 $A$,其行列式具有以下性质:

性质公式
转置不变$\det(A^T) = \det(A)$
数乘矩阵$\det(kA) = k^n \det(A)$
乘积性质$\det(AB) = \det(A) \det(B)$
幂性质$\det(A^m) = (\det(A))^m$

四、可逆矩阵

4.1 定义

$n$ 阶方阵 $A$,如果存在 $n$ 阶方阵 $P$,使得 $PA = AP = I$,则称 $P$ 为 $A$ 的逆矩阵,记作 $A^{-1} = P$。

方阵可逆的充要条件: 矩阵的行列式不为零($\det(A) \neq 0$)。

当 $\det(A) = 0$ 时,$A$ 称为奇异矩阵(不可逆);否则称为非奇异矩阵(可逆)。

4.2 逆矩阵的计算公式

$$A^{-1} = \frac{1}{|A|} \cdot A^*$$

其中 $A^*$ 是 $A$ 的伴随矩阵。

4.3 逆矩阵的性质

性质公式
唯一性逆矩阵若存在则唯一
双重逆$(A^{-1})^{-1} = A$
转置的逆$(A^{-1})^T = (A^T)^{-1}$
乘积的逆$(AB)^{-1} = B^{-1} A^{-1}$
数乘的逆$(kA)^{-1} = \frac{1}{k} A^{-1}$
fn inverse_2x2(a: f64, b: f64, c: f64, d: f64) -> Option<[[f64; 2]; 2]> {
    let det = a * d - b * c;
    if det == 0.0 {
        return None;
    }

    Some([
        [d / det, -b / det],
        [-c / det, a / det],
    ])
}

fn main() {
    match inverse_2x2(1.0, 2.0, 3.0, 4.0) {
        Some(inv) => {
            println!("逆矩阵:");
            for row in &inv {
                println!("  {:?}", row);
            }
        }
        None => println!("矩阵不可逆"),
    }
}

五、伴随矩阵

5.1 定义

伴随矩阵 $A^*$(或 $\text{adj}(A)$)是由 $A$ 的代数余子式矩阵转置而来:

$$(A^*){ij} = C{ji} = (-1)^{i+j} M_{ji}$$

5.2 性质

$$AA^* = A^*A = |A|I$$


六、初等矩阵与初等变换

6.1 三种初等行变换

  1. 交换两行:$r_i \leftrightarrow r_j$
  2. 某行乘以非零常数:$r_i \times k$
  3. 某行的 $k$ 倍加到另一行:$r_i + k r_j$

6.2 初等矩阵

由单位矩阵经过一次初等变换得到的矩阵称为初等矩阵

定理:

  • 用一个初等矩阵左乘 $A$,相当于对 $A$ 进行一次相应的初等行变换
  • 用一个初等矩阵右乘 $A$,相当于对 $A$ 进行一次相应的初等列变换

重要推论: 一个矩阵 $A$ 可逆当且仅当它可以表示为一系列初等矩阵的乘积。


七、矩阵的秩

7.1 定义

矩阵的秩(Rank)是矩阵中非零子式的最高阶数,也等于矩阵的行秩(线性无关行的最大个数)或列秩。

7.2 性质

  • $0 \le r(A) \le \min(m, n)$
  • $r(A) = r(A^T)$
  • $r(AB) \le \min(r(A), r(B))$
  • 初等变换不改变矩阵的秩

7.3 秩与线性方程组的解

对于 $n$ 元线性方程组 $Ax = b$:

条件解的情况
$r(A) < r(A, b)$无解
$r(A) = r(A, b) = n$有唯一解
$r(A) = r(A, b) < n$有无穷多解
use nalgebra::Matrix3;

fn main() {
    let a = Matrix3::new(
        1.0, 2.0, 3.0,
        4.0, 5.0, 6.0,
        7.0, 8.0, 9.0,
    );
    println!("矩阵的秩: {}", a.rank(1e-9));  // 2
}

八、特征值与特征向量

8.1 定义

对于 $n$ 阶方阵 $A$,如果存在数 $\lambda$ 和非零向量 $\vec{v}$,使得:

$$A\vec{v} = \lambda\vec{v}$$

则称 $\lambda$ 为 $A$ 的特征值,$\vec{v}$ 为对应的特征向量

特征值和特征向量描述了线性变换中“方向不变“的量。特征值表示在该方向上的缩放倍数。

8.2 特征值的计算

特征值是特征方程 $|\lambda I - A| = 0$ 的根。

8.3 相似矩阵

若存在可逆矩阵 $P$,使得 $P^{-1}AP = B$,则称 $A$ 与 $B$ 相似

相似矩阵的性质:

  • 秩相同
  • 行列式相同
  • 特征值相同
  • 迹相同

8.4 矩阵的对角化

若 $n$ 阶矩阵 $A$ 有 $n$ 个线性无关的特征向量,则 $A$ 可以对角化

$$P^{-1}AP = \Lambda = \text{diag}(\lambda_1, \lambda_2, \ldots, \lambda_n)$$

其中 $P$ 的列是 $A$ 的特征向量,$\Lambda$ 是对角矩阵。

use nalgebra::{Matrix2, Vector2};

fn main() {
    let a = Matrix2::new(3.0, 1.0, 1.0, 3.0);

    // 计算特征值
    let eigen = a.symmetric_eigen();
    println!("特征值: {:?}", eigen.eigenvalues);
    println!("特征向量:\n{}", eigen.eigenvectors);
}

九、正交矩阵与旋转矩阵

9.1 正交矩阵

若方阵 $A$ 满足 $A^T A = I$,则称 $A$ 为正交矩阵

性质:

  • $A^{-1} = A^T$
  • 行(列)向量组为单位正交向量组
  • $\det(A) = \pm 1$

9.2 旋转矩阵

二维旋转矩阵:

$$R(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \ \sin\theta & \cos\theta \end{pmatrix}$$

性质:

  • 旋转矩阵是正交矩阵
  • $\det(R(\theta)) = \cos^2\theta + \sin^2\theta = 1$
use nalgebra::{Rotation2, Vector2};

fn main() {
    let v = Vector2::new(1.0, 0.0);
    let angle = std::f64::consts::FRAC_PI_4; // 45°

    let rotation = Rotation2::new(angle);
    let rotated = rotation * v;

    println!("原向量: {:?}", v);
    println!("旋转 45° 后: {}", rotated);
    // (0.7071, 0.7071)
}

三维旋转矩阵:

  • 绕 X 轴旋转 θ $$R_x(\theta) = \begin{pmatrix} 1 & 0 & 0 \ 0 & \cos\theta & -\sin\theta \ 0 & \sin\theta & \cos\theta \end{pmatrix}$$

  • 绕 Y 轴旋转 θ $$R_y(\theta) = \begin{pmatrix} \cos\theta & 0 & \sin\theta \ 0 & 1 & 0 \ -\sin\theta & 0 & \cos\theta \end{pmatrix}$$

  • 绕 Z 轴旋转 θ $$R_z(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta & 0 \ \sin\theta & \cos\theta & 0 \ 0 & 0 & 1 \end{pmatrix}$$

use nalgebra::{Rotation3, Vector3, UnitVector3};

fn main() {
    let v = Vector3::new(1.0, 1.0, 1.0);
    let angle = std::f64::consts::FRAC_PI_4; // 45°

    // 旋转轴:Z轴单位向量
    let axis = UnitVector3::new_normalize(Vector3::new(0.0, 0.0, 1.0));
    let rotation = Rotation3::from_axis_angle(&axis, angle);

    let rotated = rotation * v;

    println!("原向量: {:?}", v);
    println!("绕Z轴旋转45°后: {:.4?}", rotated);
}

三维旋转 想象一下是向量在旋转(x轴、y轴不动)

十、矩阵分解

矩阵分解是将复杂矩阵分解为更简单矩阵乘积的方法,在数值计算和机器学习中广泛应用。

10.1 LU 分解

将矩阵分解为下三角矩阵 $L$ 和上三角矩阵 $U$ 的乘积:

$$A = LU$$

LU 分解常用于求解线性方程组。

use nalgebra::{Matrix3, Vector3};

fn main() {
    let a = Matrix3::new(
        5.0, -3.0, -4.0,
        4.0, -10.0, 5.0,
        2.0, 1.0, -10.0,
    );

    let b = Vector3::new(10.0, -20.0, -12.0);

    // LU 分解求解
    let x = a.lu().solve(&b).expect("矩阵奇异");
    println!("解 x = {}", x);
    println!("验证 A*x = {}", a * x);
}

10.2 QR 分解

将矩阵分解为正交矩阵 $Q$ 和上三角矩阵 $R$ 的乘积:

$$A = QR$$

use nalgebra as na;

fn main() {
    let a = na::Matrix3::new(
        1.0, 2.0, 3.0,
        4.0, 5.0, 6.0,
        7.0, 8.0, 10.0,
    );

    let qr = a.qr();
    let q = qr.q();
    let r = qr.r();

    println!("Q:\n{}", q);
    println!("R:\n{}", r);
    println!("验证 Q*R:\n{}", &q * &r);
}

10.3 奇异值分解(SVD)

SVD 是线性代数中最重要的矩阵分解之一,可以应用于任意形状的矩阵:

$$A = U\Sigma V^T$$

其中 $U$ 和 $V$ 是正交矩阵,$\Sigma$ 是对角矩阵(对角线元素为奇异值,非负且按降序排列)。

SVD 是 PCA、最小二乘、图像压缩、推荐系统的数学基础。

use nalgebra::Matrix3;

fn main() {
    let a = Matrix3::new(
        1.0, 2.0, 3.0,
        4.0, 5.0, 6.0,
        7.0, 8.0, 10.0,
    );

    let svd = a.svd(true, true);
    println!("奇异值: {:?}", svd.singular_values);
}

十一、实对称矩阵与二次型

11.1 实对称矩阵的性质

  • 特征值均为实数
  • 特征向量可以取为实向量
  • 一定可以对角化
  • 不同特征值对应的特征向量正交

11.2 二次型

$n$ 元二次型可以表示为:

$$f(x_1, x_2, \ldots, x_n) = \sum_{i=1}^{n} \sum_{j=1}^{n} a_{ij} x_i x_j = \vec{x}^T A \vec{x}$$

其中 $A$ 是实对称矩阵。

11.3 正定矩阵

若对任意非零向量 $\vec{x}$,都有 $\vec{x}^T A \vec{x} > 0$,则称 $A$ 为正定矩阵

判定条件:

  • 所有特征值大于 0
  • 所有顺序主子式大于 0

十二、矩阵的等价关系

关系定义不变量
等价$A \sim B$:存在可逆 $P, Q$ 使 $PAQ = B$
相似$A \sim B$:存在可逆 $P$ 使 $P^{-1}AP = B$秩、行列式、特征值、迹
合同$A \simeq B$:存在可逆 $P$ 使 $P^TAP = B$秩、正/负惯性指数
正交相似存在正交 $Q$ 使 $Q^TAQ = B$秩、行列式、特征值

十三、总结

概念要点
矩阵乘法$C[i,j] = \sum_k A[i,k]B[k,j]$,不满足交换律
转置$(AB)^T = B^T A^T$
逆矩阵$A^{-1} = A^* /
非零子式的最高阶数,初等变换不变
特征值$
对角化$P^{-1}AP = \Lambda$,需 $n$ 个线性无关特征向量
正交矩阵$A^T A = I$,$A^{-1} = A^T$
LU 分解$A = LU$,用于解方程组
QR 分解$A = QR$,$Q$ 正交,$R$ 上三角
SVD$A = U\Sigma V^T$,最通用的分解

矩阵是描述线性变换的代数工具。理解矩阵的各种运算和分解,是掌握线性代数、机器学习、计算机图形学等领域的基础。

练习建议:

  1. 实现矩阵乘法、转置、求逆的基本算法
  2. 用特征值分解判断矩阵是否正定
  3. 使用 SVD 进行图像压缩实验