矩阵
本文介绍线性代数中一个非常重要的内容——矩阵,主要讲解矩阵的性质、运算,以及矩阵乘法的一些应用。
向量与矩阵¶
在线性代数中,向量可以分为列向量和行向量。
- 通常研究对象是列向量,用粗体小写字母表示,如 $\mathbf{v}$。
- 行向量通常表示方程或约束,可以用列向量的转置表示 $\mathbf{v}^\mathsf{T}$。
- 向量可以看作特殊的矩阵:列向量是 $n \times 1$ 的矩阵,行向量是 $1 \times n$ 的矩阵。
- 为了书写方便,有时向量上方的箭头可以省略,但理解方向时仍需注意。
引入矩阵¶
矩阵的引入来自于线性方程组。它体现了一种对数据和运算“打包处理”的思想。
例如,考虑线性方程组:
视角一:几何理解¶
- 在平面直角坐标系中,每个方程对应一条直线。
- 两条直线的交点就是方程组的解:
$$ (x,y)=\left(\frac{8}{3},\frac{2}{3}\right) $$
- 每个方程相当于给解施加一个“约束”,交点是同时满足所有约束的点。
视角二:列向量表示¶
将方程组表示为列向量形式:
方程组可写作:
进一步分解成固定向量的线性组合:
- 直观理解:在平面上有两条固定方向的向量
$$ \mathbf{u} = \begin{bmatrix} 1 \ 2 \end{bmatrix},\quad \mathbf{v} = \begin{bmatrix} 2 \ 1 \end{bmatrix} $$
我们要找到系数 $x$ 和 $y$,使它们的线性组合得到目标向量 $\mathbf{C}$。
视角三:矩阵表示¶
将系数和未知数以及答案提取成矩阵:
方程组可写作矩阵形式:
- 矩阵乘以列向量的结果仍是列向量。
- 这一表示方式便于处理高维线性方程组,也与向量线性组合视角一致:
矩阵乘向量规则¶
其本质上是线性组合和内积的推广:
- 行向量视角:矩阵的每一行与列向量做内积,得到结果向量的对应元素。
- 列向量视角:矩阵乘以列向量可以看作矩阵的列向量按系数进行线性组合。
口诀:“左行右列”:行向量点列向量得到标量。
例如行向量视角:
- 这一规则保证矩阵乘以列向量与原方程组解一致。
例如列向量视角:
- 这一规则保证列向量左乘矩阵与视角二一致。
总结¶
- 列向量线性组合:矩阵乘列向量可看作列向量的加权叠加。
- 行向量内积:矩阵乘列向量可看作行向量与列向量的内积运算推广。
- 矩阵的几何意义:矩阵乘以列向量相当于对向量进行线性变换(旋转、拉伸、投影等)。
矩阵乘法不仅方便表达线性方程组,也为高维向量和线性变换的研究奠定基础。
核心概念¶
- 线性组合:用若干已知向量,通过“放大/缩小/反向 + 相加”得到的新向量。
- 线性变换:保持加法和数乘规则不变的映射,可以用矩阵表示。
- 线性空间(向量空间):一个向量集合,要求加法和数乘都不会“跳出”集合。
- 线性相关 / 无关:能否用其他向量拼出某个向量。
1. 线性组合¶
定义 给定向量 $\mathbf{u},\mathbf{v},\dots$,任意系数 $\alpha,\beta,\dots$ 的组合:
称为这些向量的线性组合。
例子
取系数 $2$ 和 $-1$:
直观理解
- 每个向量像一条“方向箭头”;系数就是“缩放/翻转”的程度。
- 线性组合就是在这些方向上“走一段路”,最终落在某个点上。
- 解线性方程组,就是在问:“能不能用给定的基向量拼出目标向量?”
2. 线性变换¶
定义 映射 $T:V\to V$,若满足:
则称为线性变换。
直观规则
- 保持“加法结构”:$T(x+y)=T(x)+T(y)$
- 保持“数乘结构”:$T(cx)=cT(x)$
- 一定有 $T(0)=0$
例子
- 缩放:$T(x,y)=(2x,2y)$ ✅
- 投影:$P(x,y)=(x,0)$ ✅
- 旋转:$R(x,y)=(-y,x)$ ✅
- 平移:$T(x,y)=(x+1,y)$ ❌(因为 $T(0)\neq 0$)
意义
- 所有线性变换都能写成矩阵乘法。
- 它把直线/平面保持为直线/平面,而不会变成曲线。
3. 线性空间(向量空间)¶
定义 一个集合 $V$,如果:
- 任意 $u,v \in V$,有 $u+v \in V$(对加法封闭)
- 任意 $c\in\mathbb{R}, v\in V$,有 $cv \in V$(对数乘封闭)
则 $V$ 是一个线性空间。
例子
- $\mathbb{R}^2,\ \mathbb{R}^3$(平面、三维空间)
- 所有 $n$ 维向量的集合
- 所有次数 $\leq n$ 的多项式集合
非例子
- 平面上“第一象限的向量”(因为数乘负数会跑出去)
- “不经过原点的直线”(因为必须包含 $0$)
4. 线性相关与线性无关¶
定义
- 如果存在某个向量能被其他向量线性组合得到 → 线性相关。
- 如果任何一个都不能由其他向量拼出 → 线性无关。
例子
- $(1,0)$ 和 $(0,1)$ → 线性无关(互相拼不出来)。
- $(1,2)$ 和 $(2,4)$ → 线性相关(第二个是第一个的 2 倍)。
👉 总结:
- 线性组合:拼向量的方法。
- 线性变换:保持拼法规则的变换,矩阵就是它的工具。
- 线性空间:一个允许随意拼而不会跑出去的集合。
- 相关/无关:能不能用已有的拼出多余的。
矩阵基本概念与类型总结¶
在线性代数中,矩阵(matrix) 是一个由数、符号或表达式按照长方形排列而成的数组。
一个 $m \times n$ 矩阵(读作 $m$ 行 $n$ 列矩阵)是一个有 $m$ 行、$n$ 列的数表:
其中:
- 每个元素 $a_{ij}$ 称为矩阵的 元素(element),表示在第 $i$ 行第 $j$ 列。
- 矩阵 $A$ 的大小(或维度)是 $m \times n$。
- 若 $m=n$,称 $A$ 为 方阵。
- 主对角线:方阵中从左上到右下的元素,即 $A_{i,i}$。
- 单位矩阵 $I$:方阵,主对角线元素为 $1$,其余元素为 $0$。
- 同型矩阵:行数和列数都相同的矩阵称为同型矩阵。
-
常用矩阵类型
- 对称矩阵
- 条件:$A_{i,j} = A_{j,i}$,即关于主对角线对称。
- 对角矩阵
- 条件:主对角线之外的元素全为 $0$。
- 记法:$\text{diag}{\lambda_1, \cdots, \lambda_n}$。
- 特殊情况:
- 所有对角线元素为 $1\rightarrow$ 单位矩阵 $I$。
- 三角矩阵
- 上三角矩阵:主对角线下方元素为 $0$。
- 下三角矩阵:主对角线上方元素为 $0$。
- 性质:
- 两个上(下)三角矩阵的乘积仍是上(下)三角矩阵。
- 对角线元素均非 $0\rightarrow$ 可逆,逆矩阵仍是上(下)三角矩阵。
- 单位三角矩阵
- 条件:三角矩阵对角线全为 $1$。
- 性质:
- 两个单位上(下)三角矩阵的乘积仍为单位上(下)三角矩阵。
- 单位上(下)三角矩阵可逆,逆矩阵仍为单位上(下)三角矩阵。
- 对称矩阵
-
应用场景
- 一般矩阵:用于研究方程组、向量组、矩阵的秩。
- 方阵:用于研究特征值、特征向量、二次型等问题。
矩阵运算总结¶
1. 矩阵的线性运算¶
- 内容:加法、减法、数乘
- 规则:
- 只有同型矩阵可以相加减。
- 运算逐元素进行。
- 数乘:矩阵的每个元素都乘以这个数。
例子:
- 加法:
- 减法:
- 数乘(例如乘以 $2$):
2. 矩阵转置¶
- 定义:将矩阵的行与列互换,记作 $A^T$。
- 性质:
- 对称矩阵 $A = A^T$。
例子:
3. 矩阵乘法¶
我们已经知道,对于矩阵 $A$ 和列向量 $x$,矩阵乘以向量的运算可以理解为两种等价方式:
- 行向量内积视角:每一行与 $x$ 做内积,得到结果向量的对应元素。
- 列向量线性组合视角:每一列向量按 $x$ 的系数加权叠加,得到结果列向量。
这两种视角帮助我们直观理解矩阵如何作用于向量。
假设我们有多个列向量 $x_1, x_2, \dots, x_p$,每个向量都要通过同一个矩阵 $A$ 变换:
- 直接操作每个向量很繁琐。
- 我们可以把所有列向量组合成一个矩阵:
-
这样一次性变换可以写作: $$ B = [b_1, b_2, \dots, b_p] = A X $$
-
直观理解:矩阵乘矩阵,其实就是矩阵乘以右边矩阵的每一列向量,得到新的列向量组成的矩阵。
- 定义:
- $A$ 为 $P \times M$ 矩阵,$B$ 为 $M \times Q$ 矩阵,则 $C = A\cdot B$ 是 $P \times Q$ 矩阵。
- 公式:
- 口诀:左行右列。
- 性质:
- 满足结合律 $(AB)C = A(BC)$。
- 不满足一般交换律 $AB \neq BA$。
- 利用结合律,矩阵乘法可以利用 快速幂 的思想来优化。
在比赛中,由于线性递推式可以表示成矩阵乘法的形式,也通常用矩阵快速幂来求线性递推数列的某一项。
例子:
结合律的证明¶
证明: 为了简单起见,证明 $A(Bx)=(AB)x$ 即可,其中 $x$ 为列向量。
假设 $A,B,x$ 的规模分别为 $n\times m$,$m\times p$,$p\times 1$。写出 $Bx$:
所以 $Bx$ 是 列向量的线性组合。再作用 $A$
最后就等于 $(AB)x$。
代码实现¶
一般来说可以用一个二维数组来模拟矩阵,搭配重载运算符来模拟矩阵乘法等运算。
struct matrix
{
int mat[N][N];
matrix() // 构造函数
{
memset(mat, 0, sizeof(mat));
}
};
matrix operator * (const matrix &a, const matrix &b) // 矩阵乘法
{
matrix c;
for (int k = 0; k < N; k++)
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
c.mat[i][j] += a.mat[i][k] * b.mat[k][j];
}
}
}
return c;
}
代码中将上限都改为了 $N$,相当于矩阵都视为了 $N\times N$ 的方阵。实际做题自己调整。