# 矩阵类型

*特殊的矩阵结构能够解锁计算捷径和数学保证。本文涵盖单位矩阵、对角矩阵、对称矩阵、三角矩阵、正交矩阵、正定矩阵、稀疏矩阵和随机矩阵，这些类型出现在协方差估计、图算法、正则化和马尔可夫链中。*

- 并非所有矩阵都一样。不同的结构赋予矩阵特殊的性质，使它们计算更快、更易于推理，或两者兼得。以下是你最常遇到的类型。

- **方阵**的行数和列数相同（$n \times n$）。大多数有趣的性质（行列式、特征值、逆）只适用于方阵。

- **单位矩阵** $I$ 是一个对角线为 1、其余为 0 的方阵。它是"什么都不做"的变换：$AI = IA = A$ 对任何兼容的矩阵 $A$。

```math
I = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}
```

- **零矩阵** $O$ 的所有元素都为零。它将每个向量映射到零向量，破坏所有信息。

- **对角矩阵**除主对角线外全为零。将向量乘以对角矩阵只是独立地缩放每个分量，非常高效。

```math
D = \begin{bmatrix} 3 & 0 \\ 0 & 7 \end{bmatrix}
```

- **对称矩阵**等于其转置：$A = A^T$，意味着 $A_{ij} = A_{ji}$。对称矩阵有一个特殊性质：它们的特征向量总是相互垂直。协方差矩阵总是对称的。

```math
S = \begin{bmatrix} 3 & -1 \\ -1 & 6 \end{bmatrix}
```

- **三角矩阵**在对角线的一侧全为零。**下三角**在上方全为零，**上三角**在下方全为零。它们对于通过前向或回代高效求解方程组至关重要。

```math
L = \begin{bmatrix} 2 & 0 & 0 \\ 1 & 3 & 0 \\ -1 & 2 & 4 \end{bmatrix} \qquad U = \begin{bmatrix} 5 & -1 & 2 \\ 0 & 1 & 3 \\ 0 & 0 & -2 \end{bmatrix}
```

- 三角矩阵的行列式就是其对角线元素的乘积。

- **正交矩阵**具有转置等于逆的性质：$Q^TQ = QQ^T = I$。

- 这意味着你只需转置就能"撤销"变换，计算成本很低。其列是标准正交的（单位长度且相互垂直）。

- **稀疏矩阵**的大多数元素为零，而**稠密矩阵**的大多数元素非零。

![稀疏 vs 稠密：点表示非零元素](../images/sparse_dense.svg)

- 在实践中，许多现实世界的矩阵是极其稀疏的。

- 一个拥有百万用户的社交网络可以表示为一个 $10^6 \times 10^6$ 的矩阵，但每个人只连接到少数其他人，所以几乎所有元素都是零。

![一个小型社交网络及其邻接矩阵：大多数元素为零](../images/social_network_matrix.svg)

- **置换矩阵**是通过重排单位矩阵的行得到的。乘以它会打乱向量的元素。每行每列恰好有一个 1，其余为 0。

- 例如，下面的矩阵将元素 3 移到位置 1，元素 1 移到位置 2，元素 2 移到位置 3：

```math
P = \begin{bmatrix} 0 & 0 & 1 \\ 1 & 0 & 0 \\ 0 & 1 & 0 \end{bmatrix}
```

- **托普利茨矩阵**沿每条对角线（左上到右下）具有相同的值。注意每条对角线是如何恒定的：

```math
T = \begin{bmatrix} a & b & c \\ d & a & b \\ e & d & a \end{bmatrix}
```

- 这种结构出现在信号处理和卷积中，因为将固定滤波器滑过信号等价于乘以托普利茨矩阵。

- **循环矩阵**是一种特殊的托普利茨矩阵，其中每一行是上一行的循环移位。当一行到达末尾时，它会绕回：

```math
C = \begin{bmatrix} 1 & 3 & 2 \\ 2 & 1 & 3 \\ 3 & 2 & 1 \end{bmatrix}
```

- 循环矩阵与离散傅里叶变换（DFT）密切相关，并且是循环卷积如何工作的核心。

- **埃尔米特矩阵**是对称矩阵在复数域中的等价形式：$A = A^\ast$（其中 $A^\ast$ 是共轭转置）。

- 对于实值矩阵，埃尔米特矩阵和对称矩阵是一回事。你会在量子计算和信号处理中遇到它们。

- **酉矩阵**是正交矩阵在复数域中的等价形式：$U^\ast U = UU^\ast = I$。正如正交矩阵在实空间中保持长度，酉矩阵在复空间中保持长度。

- **幂等矩阵**满足 $A^2 = A$。应用变换两次等同于应用一次，这使得它成为一个**投影**。一旦你投影了，再次投影不会改变任何东西。

- **幂零矩阵**满足对某个幂次 $k$ 有 $A^k = O$（零矩阵）。应用变换足够多次后，所有东西都坍缩为零。例如：

```math
\begin{bmatrix} 0 & 1 \\ 0 & 0 \end{bmatrix}^2 = \begin{bmatrix} 0 & 0 \\ 0 & 0 \end{bmatrix}
```

- **布尔矩阵**（或二元矩阵）只包含 0 和 1。它表示是/否关系。例如，在一个有 3 个节点的图中，**邻接矩阵**记录哪些节点相连：

```math
B = \begin{bmatrix} 0 & 1 & 1 \\ 1 & 0 & 0 \\ 1 & 0 & 0 \end{bmatrix}
```

- 这里，节点 1 连接到节点 2 和 3，但节点 2 和 3 之间没有连接。

- **范德蒙矩阵**由一组值的连续幂次构成。给定值 $x_1, x_2, x_3$：

```math
V = \begin{bmatrix} 1 & x_1 & x_1^2 \\ 1 & x_2 & x_2^2 \\ 1 & x_3 & x_3^2 \end{bmatrix}
```

- 这种结构出现在多项式插值中：找到通过给定点集的唯一多项式。

- **海森堡矩阵**是"几乎"三角的，在第一次次对角线以下全为零：

```math
H = \begin{bmatrix} 4 & 2 & 1 \\ 3 & 5 & -1 \\ 0 & 1 & 6 \end{bmatrix}
```

- 它是有效计算特征值的有用中间形式。先将矩阵化为海森堡形式可以使迭代算法收敛更快。

## 编程练习（使用 CoLab 或 notebook）

1. 创建一个正交矩阵（旋转矩阵），乘以其转置，验证得到单位矩阵。尝试不同的角度。
```python
import jax.numpy as jnp

theta = jnp.pi / 4
Q = jnp.array([[jnp.cos(theta), -jnp.sin(theta)],
               [jnp.sin(theta),  jnp.cos(theta)]])

print(f"Q @ Q.T:\n{Q @ Q.T}")
print(f"Determinant: {jnp.linalg.det(Q):.2f}")
```

2. 创建一个对称矩阵并验证它等于其转置。然后计算其特征值并检查特征向量是否垂直。
```python
import jax.numpy as jnp

S = jnp.array([[4.0, 2.0],
               [2.0, 3.0]])

print(f"Symmetric: {jnp.allclose(S, S.T)}")

eigenvalues, eigenvectors = jnp.linalg.eigh(S)
print(f"Eigenvalues: {eigenvalues}")
print(f"Dot product of eigenvectors: {jnp.dot(eigenvectors[:, 0], eigenvectors[:, 1]):.6f}")
```
