线性代数学习笔记
本文含有较多公式,请耐心等待渲染。
一、向量
定义
有大小、有方向的量称为向量,记为 或 ,向量可以任意平移。向量以有向线段的方式表示,有向线段有三要素:起点,方向,长度。
有向线段 的长度称为它的模长,记为 。特别的,当模长为 的时候,这个特殊向量称为零向量,零向量的方向是任意的,长度始终为 0。
若两个非零向量 方向相同或相反,称这两个向量平行,记作 。对于多个互相平行的向量,我们可以找到一条直线,使得所有向量都能移动到该直线上,所以平行又可以称为共线。
若已知两个向量 ,做 , 即为向量 的夹角,记作 。特别的,当 的时候,两向量同向,当 的时候,两向量反向,当 的时候,两向量垂直。
计算
对于向量的加法,我们可以类比力的合成,使用三角形公式与平行四边形公式进行计算。
- 平行四边形公式,即若两个向量起点相同,则以两个向量为两边,做出一个平行四边形,他们的和的起点为两个向量的公共起点,终点为平行四边形内不与这两个向量相邻的端点。
- 三角形公式,即对于两个首尾相接的向量,做出一个以两个向量为两边的三角形,它们的和即为第三边。
对于向量的减法,可以类比数的减法,即 。
二、线性代数简介
“线性”的来由
由于一次函数 的函数图像是一条直线,故一次函数又称为线性函数。推广一下,所有类似这种 乘法的变换都被称为线性变换。
域
简单来说,域是带有符合运算律的加减乘除运算的集合。要求有 ,倒数、相反数存在,加、乘满足交换律、结合律、分配律。如有理数域 ,实数域 。
域的判定
对于一个集合 和上述运算 ,,若 满足以下条件,则称其为一个域。
- 满足交换律,即 。
- 满足结合律,即 。
- 满足分配律,即 。
- 有加法、乘法逆元,即 ,。
- 有单位元,即 。
线性空间
一般的,一个线性空间 基于一个域 定义,要求 内有加法运算,且 内的元素可以域 内的元素相乘,并且满足运算律。
如果 内有加法,域 到 有乘法,满足以下条件则称 是 F-线性空间: 内的加法满足交换律和结合律,有“0”,有“” ,且满足结合律、交换律、分配律。
线性变换
顾名思义,线性变换指一个线性的一个空间到另一个空间的变换。
具体而言,应用这个变换应该有和乘以特定值类似的性质。
也就是上面线性空间的定义中,把乘法换成应用变换。
我们称一个变换 是线性的,其中 都是 F-线性空间,当且仅当:
- ;
- 。
实际上,乘以一个数也是一个线性变换,平面上或者空间中的绕原点旋转是一个线性变换,针对单一分量的伸缩也是线性变换。
线性变换的复合
类似于函数的复合,我们定义线性变换的复合为先执行一个再执行另一个。容易验证,线性变换的复合结果仍然是线性变换。注意线性变换的复合不满足交换律,而且是从右往左执行。
描述线性变换
既然有了线性变换,我们自然会想要讨论如何用尽量少的信息来描述一个线性变换。
我们记单位向量 的第 维是 ,其他都是 。
那么对于每个向量 ,就可以表示为 ,那么,对于变换 就有 ,这样,我们就用每个 的变换结果描述了整个线性变换。
进一步,如果我们在结果线性空间上取单位向量 ,那么我们就可以用 个数 表示这个线性变换,即 ,我们把所有 写成 行 列,这就是线性变换对应的矩阵了。
三、矩阵
定义
将一些元素排列成若干行,每行放上相同数量的元素,就是一个矩阵。这里说的元素可以是数字,例如以下的矩阵:
矩阵乘法
两个矩阵 能够相乘,当且 的列数与 的行数相同。我们设 为 的矩阵, 为 的矩阵,那么他们的矩阵 是 的。
中的元素为:
这就是矩阵乘法的定义。
实现
我们在 OI 中一般使用 的算法,即暴力乘法。
for (int i = 1; i <= m; ++i)
for (int j = 1; j <= p; ++j)
for (int k = 1; k <= n; ++k)
c[i][j] += a[i][k] * b[k][j];
实际上,最优的复杂度为 左右,但是由于常数很大,一般不这么使用。
矩阵乘法的性质
线性变换不满足交换律,矩阵乘法自然也不满足交换律。
不过,由于 与 的意义都是按照 顺序执行线性变换,矩阵乘法是满足结合律的。
可以发现,矩阵乘列向量与矩阵乘一列的矩阵是一样的,因此列向量可以视为只有一列的矩阵。
单位矩阵
对于 的矩阵,它的单位矩阵大小为 ,对于 的矩阵,它的单位矩阵大小为 。
也就是说单位矩阵都是正方形的,这是因为只有正方形的矩阵能保证结果和前一个矩阵形状相同。
对于一个单位矩阵 ,他的定义为
矩阵快速幂
对于一个 的方阵 ,求 。
矩阵快速幂与普通的快速幂几乎一样,稍微修改下代码即可通过。
struct M
{
long long a[MAXN][MAXN] = {{0}, {0}};
M operator*(M b)
{
M tmp;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
for (int k = 1; k <= n; ++k)
{
tmp.a[i][j] = ((a[i][k] * b.a[k][j] % MOD) + tmp.a[i][j]) % MOD;
}
}
}
return tmp;
}
} G;
M res;
void qp()
{
for (int i = 1; i <= n; ++i)
{
res.a[i][i] = 1;
}
while (k)
{
if (k & 1)
res = res * G;
G = G * G;
k >>= 1;
}
}
四、矩阵加速递推
斐波那契数列
斐波那契数列 满足 。
我们发现这个递推式是线性的,因此可以使用线性变换描述。
具体的,我们将 写为一个矩阵,将 写为一个矩阵。
我们想要通过一个矩阵 ,使得
由于 ,所以说我们要让 的第一行都为 。 在两个矩阵都出现了,所以直接令 的第 行、第 列为 ,第 行、第 列为 即可,也就是说
将式子 无限递归下去,得到我们要求的
从特殊到一般
考虑总结出一个通用的递推式。
给定一个线性的递推关系式 ,考虑求出这个式子的加速矩阵,其中 是一个常量,代表权重。
那么,我们可以用以下这个式子来快速求出答案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效