【笔记】矩阵
矩阵基础
定义:
数学意义上有更加严谨的矩阵定义,这里不过多展开,如有需要还请自行查询。
由
两个或者两个以上的矩阵的行数和列数都相同,那么我们就说这两个或两个以上的矩阵是同型矩阵。
当且仅当矩阵
基本运算
加法
只有两个同型矩阵才能相加。
若
则
例如:
减法与加法同理。
乘法
矩阵与实数相乘:
定义矩阵
再来看看矩阵之间的乘法
设矩阵
只有当
矩阵之间的乘积依然是矩阵,我们
例如:
矩阵也同样存在幂运算,一个矩阵的
单位矩阵
在实数的运算中,我们规定
矩阵运算中,我们也有一个单位矩阵,单位矩阵乘任意矩阵的结果等于这个矩阵本身。
单位矩阵的主对角线值为
一个
例:
零矩阵
一个矩阵中的所有元素都为
零矩阵与任意矩阵相加都等于这个矩阵本身,与任意矩阵相乘都等于零矩阵。(前提是这两个矩阵能够相加或相乘)
矩阵的性质
一、加法:
定义
加法交换律:
加法结合律:
二、乘法
乘法结合律 :
左分配律:
右分配律:
由于矩阵乘法需要满足前者的列数等于后者行数这一性质,相乘顺序对于矩阵乘法非常重要。
矩阵乘法不一定满足交换律。
实际应用
矩阵快速幂
与整数运算一样,矩阵也存在同样的幂运算,也同样可以使用快速幂,时间复杂度同样为
矩阵与DP
矩阵快速幂优化递推式
拿最简单的斐波那契数列为例,递推式为:
假设我们现在要求斐波那契数列的第n位,用正常递推方法做的话时间复杂度为
假设这个递推式不是加法,而是乘法,最好是幂运算的形式,我们就可以使用快速幂实现
可惜这是一个加法递推式,但矩阵可以解决这个问题。
我们考虑把递推式左边写成一个矩阵的形式:
再试着把递推式右边也写成矩阵
我们利用矩阵乘法,使得上述矩阵乘以一个矩阵后得到递推式右边。我们设乘上的这个矩阵为转移矩阵,记作
那么:
我们反过来想,看看右边这个矩阵是怎么乘过来的。
根据矩阵乘法的定义,我们可以得到转移矩阵
即:
同样的,我们也可以用
换句话说,我们用
那么,只要我们用
由于我们知道斐波那契数列的前两位(也就是
再用矩阵快速幂算出转移矩阵
同样的,对于别的递推式,我们可以将已知的数作为初始矩阵,再根据递推式推导出转移矩阵,通过快速幂加快递推过程。
大部分DP都可以写成递推的形式,我们可以用矩阵加速递推式("矩阵能加速所有递推式"---Gym学长)
矩阵与动态DP
当一个DP问题需要支持修改操作的时候,一切都变得麻烦起来了。因为没一个修改对DP的影响我们都有可能需要从头再DP一遍,时间复杂度难以接受。
矩阵结合律以及不满足交换律这一特点给了它参与进动态DP的可能。
为什么呢?
首先矩阵是可以结合的,这使得我们我们可以直接维护矩阵,利用矩阵进行DP。
满足结合律,所以可以用快速幂加速。
不满足交换律,
广义矩阵乘法
为了更好的适应DP的需求,我们需要一个功能更强的矩阵乘法
我们规定
如果这两个运算满足这些规律,那么:
平时用的比较多的情况就是:
第一种情况前文讲过了,我们再来看看第二种情况。
实例:
给出一个序列
这是个很简单的问题,但是,你先别急。我们用广义矩阵做一下这个题。
我们设
我们写成矩阵的形式,为方便转移多维护一个0
这样做有什么用吗?没用,但如果带上修改操作的话就有用了。
给出T次修改操作,每次修改这个序列中的一个值,并询问修改后的答案,正常的线性DP每次都要从头再DP一遍,太慢了。试试矩阵。
提起修改操作,我们不难联想到线段树之类的数据结构。还记得矩阵满足结合律吗?利用这一点我们可以选择用数据结构来维护矩阵。
每次单点操作影响的都是该位置上的矩阵,以及包含该位置区间的广义矩阵乘积,我们用线段树维护广义矩阵乘积每次修改仅更新从叶到根的
对于一些树上DP,并且带修改操作的时候我们可以使用树剖+线段树,或者LCT实现全局平衡二叉树,维护矩阵。
插句题外话,动态DP这个猫坤在WC2018讲到的黑科技竟然在近几年的CSP和NOIP提高组中出现了两次,很怀疑他们是否有按照大纲出题。
更新ing,写的有点仓促,可能会有错误,还请指正。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧