矩阵运算作为线性代数里面的一个知识点,在ACM竞赛中也有非常大的用处。
## 矩阵的定义
矩阵的一般表示形式为:
~~~[math]
\begin{bmatrix}
a_{11} & a_{12} & ... & ... & a_{1m}\\
a_{21} & a_{22} & ... & ... & a_{2m}\\
... & ... & ... & ... & ...\\
a_{n1} & a_{n2} & ... & ... & a_{nm}
\end{bmatrix}
~~~
矩阵的元素用一个中括号包括起来,上面这个式子表示的即为大小为n*m的矩阵。
当n=m时,这个矩阵也被称为n阶矩阵。
## 矩阵运算
### 矩阵加减法
矩阵加减法的前提是**两个矩阵的行和列相等**,比如下面这个两个式子:
加法:
~~~[math]
\begin{bmatrix}
1 & 4 & 2 \\
2 & 0 & 0
\end{bmatrix}
+
\begin{bmatrix}
0 & 0 & 5 \\
7 & 5 & 0
\end{bmatrix}
=
\begin{bmatrix}
1 & 4 & 7 \\
9 & 5 & 0
\end{bmatrix}
~~~
减法:
~~~[math]
\begin{bmatrix}
1 & 4 & 2 \\
2 & 0 & 0
\end{bmatrix}
-
\begin{bmatrix}
0 & 0 & 5 \\
7 & 5 & 0
\end{bmatrix}
=
\begin{bmatrix}
1 & 4 & -3 \\
-5 & -5 & 0
\end{bmatrix}
~~~
### 矩阵的转置
将矩阵的行和列互相调换即为矩阵的转置,比如下面的式子:
~~~[math]
{\begin{bmatrix}
1 & 2 & 3 \\
4 & 5 & 6
\end{bmatrix}}^T
=
\begin{bmatrix}
1 & 4 \\
2 & 5 \\
3 & 6
\end{bmatrix}
~~~
### **矩阵乘法**
矩阵乘法是重点要讲的,在ACM竞赛中使用最多的也是矩阵的乘法运算,尤其是矩阵快速幂。
两个矩阵相乘的前提条件为第一个矩阵的**列数**和第二个矩阵的**行数**必须相等!比如下面这个式子:
~~~[math]
\begin{bmatrix}
a_{11} & a_{12} & ... & a_{1k} \\
a_{21} & a_{22} & ... & a_{2k} \\
... & ... & ... & ...\\
a_{n1} & a_{n2} & ... & a_{nk}
\end{bmatrix}
*
\begin{bmatrix}
b_{11} & b_{12} & ... & b_{1m} \\
b_{21} & b_{22} & ... & b_{2m} \\
... & ... & ... & ...\\
b_{k1} & b_{k2} & ... & b_{km}
\end{bmatrix}
=
\begin{bmatrix}
c_{11} & c_{12} & ... & c_{1m} \\
c_{21} & c_{22} & ... & c_{2m} \\
... & ... & ... & ...\\
c_{n1} & c_{n2} & ... & c_{nm}
\end{bmatrix}
~~~
这是矩阵运算的基本形式,接下来我们看如何具体运算。
~~~[math]
c_{i,j}=a_{i1}*b{1j}+a_{i2}*b{2j}+...+a_{ik}*b_{kj}=\sum_{x=1}^{k}{a_{ix}*b_{xj}}
~~~
其中的k也就是第一个矩阵的列数和第二个矩阵的行数。
带入具体矩阵运算:
~~~[math]
\begin{bmatrix}
1 & 0 & 2 \\
-1 & 3 & 1
\end{bmatrix}
*
\begin{bmatrix}
3 & 1 \\
2 & 1 \\
1 & 0
\end{bmatrix}
=
\begin{bmatrix}
{(1*3+0*2+2*1)} & {(1*1+0*1+2*0)} \\
{(-1*3+3*2+1*1)} & {(-1*1+3*1+1*0)}
\end{bmatrix}
=
\begin{bmatrix}
5 & 1 \\
4 & 2
\end{bmatrix}
~~~
- 简介
- 零基础快速入门ACM
- C语言快速入门
- C语言快速入门
- C/C++基础
- 输入输出
- 数组和字符串
- 数组
- 字符数组
- 函数和递归
- C++标准容器库(STL)
- Vector
- Map
- Set
- String
- Stack
- Queue
- Priority_queue
- 贪心
- 硬币问题
- 区间调度问题
- 字典序最小问题
- 独木舟问题
- 搜索
- DFS
- BFS
- 剪枝
- 记忆化搜索
- 常用技巧
- 倍增
- 高精度
- 大数加法
- 大数减法
- 大数乘法
- 大数除法
- 大数阶乘
- 输入挂
- 前缀和
- 二分
- 本地预处理
- 尺取
- 枚举
- 坐标离散化
- 分治
- 数列分治
- 树上分治
- 平面分治
- 计算几何
- 凸包
- 点积
- 叉积
- 线段关系
- 皮克定理
- 最近点对
- 数据结构
- 线段树
- 树状数组
- 并查集
- 动态规划
- 基础知识
- 信息学竞赛中的动态规划
- 动态规划初步
- 最长上升子序列(LIS)
- 最长公共子序列(LCS)
- 最大子段和
- 背包问题
- 部分背包
- 0 1 背包
- 完全背包
- 多重背包
- 背包的可行性问题
- 线性DP
- 树形DP
- 区间DP
- 数位DP
- 动态规划优化
- 字符串
- KMP算法
- 拓展KMP
- 字符串Hash
- Manacher算法
- 后缀数组
- Trie树
- 博弈论
- Nim博弈
- Bash博弈
- 斐波那契博弈
- 威佐夫博弈
- SG函数
- 数论
- 整数研究
- 素数判断
- 素数筛选
- 快速幂
- 算数基本定理
- 最大公约数(Gcd)
- 费马小定理
- 扩展欧几里得
- 逆元
- 同余定理
- 组合数学
- 容斥原理
- 抽屉原理
- 卢卡斯(Lucas)
- 卡特兰(Catalan)
- 著名函数
- 欧拉函数
- 莫比乌斯函数
- 线性代数
- 矩阵运算
- 矩阵快速幂
- 图论
- 存图方法
- 邻接矩阵
- 邻接表
- Vector存图
- 链式前向星
- 图的遍历
- 拓扑排序
- 最短路
- Dijkstra算法
- SPFA算法
- Floyed 算法
- 最小生成树
- Prim算法
- Kruskal算法
- 最近公共祖先 (LCA)
- 二分图匹配
- 网络流
- 其他
- 莫队