矩阵入门
矩阵
向量与矩阵#
在线性代数中,向量分为列向量和行向量。
向量也是特殊的矩阵,行向量可以看作是一个
列向量可以看作是一个
也可以写成由行向量转置而来的,比如上面的列向量可以这样写:
线性代数的主要研究对象是列向量,约定使用粗体小写字母表示列向量。在用到大量向量与矩阵的线性在数中,不引起混淆的情况下,在手写时,字母上方的向量记号可以省略不写。
如果想要表示行向量,需要在粗体小写字母右上方写转置符号。行向量在线性代数中一般表示方程。
引入#
矩阵的引入来自于线性方程组,与向量类似,都是为了能以更少的字符来表示更多的信息,就比如下面的线性方程组:
一般使用圆括号或方括号来表示矩阵。上面的方程组写成矩阵的形式就是:
我觉得方括号更整齐好看于是就用的方括号
简记为:
表示位置数列向量
线性代数主要研究的运算模型是内积,内积是先相乘再相加,是行向量左乘列向量,得到一个数的过程。矩阵乘法是内积的拓展,矩阵乘法等价于左边矩阵拿出来一行与右边矩阵抽出一列来进行内积,得到结果矩阵的对应元素,口诀「左行右列」。
定义#
对于矩阵
一般用
同型矩阵#
两个矩阵,行数和列数对应相同,则称为同型矩阵。
方阵#
行数等于列数的矩阵称为方阵。方阵是一种特殊的矩阵。对于「
主对角线#
方阵中行数等于列数的元素构成主对角线
对称矩阵#
如果将方阵的元素关于主对角线对称,即对于任意的
对角矩阵#
主对角线之外的元素均为
式子中的
对角矩阵是对称矩阵。
如果对角矩阵的元素均为
三角矩阵#
如果方阵主对角线左下方的元素均为
两个上(下)三角矩阵的乘积仍是上(下)三角矩阵。如果对角线元素均非
单位三角矩阵#
如果上三角矩阵
两个单位上(下)三角矩阵的乘积仍然是单位上(下)三角矩阵,单位上(下)三角矩阵的逆也是单位上(下)三角矩阵。
运算#
矩阵的线性运算分为加减法与数乘,他们均为逐个元素进行。只有同型矩阵之间可以对应相加减。
矩阵的转置#
矩阵的转置,就是在矩阵的右上角写上转置「T」记号,表示将矩阵的行与列互换。
对称矩阵转置前后保持不变。
矩阵乘法#
矩阵的乘法是向量内积的推广。
矩阵相乘只有在第一个矩阵的列数和第二个矩阵的行数相同时才有意义。
设
其中矩阵
找了张好理解的图片:
原文:B2105 矩阵乘法 题解 - Daidly's Blog - 洛谷博客
在矩阵乘法中,结果
注意矩阵乘法满足结合律但不满足一般的交换律
如果不理解的话可以看看这个:http://matrixmultiplication.xyz/
利用结合律,矩阵乘法可以利用快速幂的思想来优化
小优化#
对于较小的矩阵,可以直接手动展开循环来减小常数。
可以重新排列循环以提高空间局部性,这样的优化不会改变时间复杂度,但是可以得到常数上的提升。
矩阵快速幂#
快速幂都会,那矩阵快速幂呢?
在后面的矩阵加速递推等都需要用到他,原理是什么?
大致的写法分为两种:重载运算符和函数,我个人比较喜欢函数的写法。
我们可以按正常的快速幂写法来,区别就是在其中的底数换成了矩阵,然后写一个矩阵乘法的函数来进行相乘即可。
参考代码:
#include<bits/stdc++.h>
#define int long long
#define P 1000000007
#define endl '\n'
#define N 110
using namespace std;
struct sb{int m[N][N];}ans;
int n,k;
inline int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){f=ch!='-';ch=getchar();}while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return f?x:-x;}
inline sb cheng(sb a,sb b)
{
sb c;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
c.m[i][j]=0;
for(int k=1;k<=n;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%P;
}
}
return c;
}
inline sb jzksm(sb x,int y)
{
sb res=x;y--;
while(y)
{
if(y&1)res=cheng(res,x);
x=cheng(x,x);
y>>=1;
}
return res;
}
signed main()
{
n=read();k=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
ans.m[i][j]=read();
ans=jzksm(ans,k);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<ans.m[i][j]<<" ";
cout<<endl;
}
return 0;
}
方阵的逆#
方阵
逆矩阵不一定存在,如果存在可以用高斯消元来求解。
方阵的行列式#
行列式是方阵的一种运算。
看待线性方程组的两种视角#
看待一个矩阵
第一种观点:按行看,观察
第二种观点:按列看,观察
例如:文章开头的例子变为:
解方程变为研究是否可以通过调整三个系数
按列看比按行看更新颖。在按列看的视角下,可以研究线性无关与线性相关。
矩阵乘法的应用#
矩阵加速递推#
斐波那契数列大家应该非常熟悉,在学习递归或者递推的时候应该是有做过相关题目的,在斐波那契数列里面,
我们在之前的题目遇见的求斐波那契数列第
设
试着来推导一个矩阵
因为
综上所述,
定义初始矩阵
注意矩阵乘法不满足交换律,所以不能将两个矩阵反过来,另外,对于
参考代码:
#include<bits/stdc++.h>
#define int long long
#define P 1000000007
#define N 110
using namespace std;
int n;
struct sb{int m[N][N];}ans,base;
inline sb cheng(sb a,sb b,int ok)
{
sb c;
for(int i=1;i<=ok;i++)
{
for(int j=1;j<=ok;j++)
{
c.m[i][j]=0;
for(int k=1;k<=ok;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%P;
}
}
return c;
}
inline sb jzksm(sb x,int y)
{
sb res=x;y--;
while(y)
{
if(y&1)res=cheng(res,x,2);
x=cheng(x,x,2);
y>>=1;
}
return res;
}
signed main()
{
cin>>n;
if(n==1||n==2){puts("1");return 0;}
ans.m[1][1]=1;ans.m[1][2]=1;
base.m[1][1]=1;base.m[1][2]=1;
base.m[2][1]=1;base.m[2][2]=0;
base=jzksm(base,n-2);
ans.m[1][1]=(base.m[1][1]+base.m[1][2])%P;
cout<<ans.m[1][1]<<endl;
return 0;
}
初等矩阵#
以下三种矩阵称为初等矩阵。
倍乘矩阵#
倍乘矩阵是一种特殊的对角矩阵。
表示一个对角矩阵,主对角线上第
特别的,当
对换矩阵#
对换矩阵是一种特殊的对称矩阵。
对换矩阵的元素全是
对换矩阵要求
倍加矩阵#
倍加矩阵是在单位矩阵
倍加矩阵要求
倍加矩阵是一种上三角或下三角矩阵。
初等变换#
不仅限于方阵,对于一般的矩阵
初等行变换与初等列变换一样,都有 3 种:倍乘、对换、倍加。这里先介绍初等行变换:
-
第
行乘非零数 : -
第
行互换: -
第
行乘 加到第 行:
将上述操作的行改为列,即得到初等列变换。
在初等变换中,对换可以通过倍乘和倍加实现。显然,倍加不能通过倍乘和对换实现。借助行列式的知识,以及下文的初等变换与矩阵乘法的等价性,也能说明倍乘不能通过倍加和对换实现。
因此,相较对换而言,倍乘和倍加是更为本质的操作。对换操作是为了在消元法中,保证消元的有序,而引入的辅助操作。
初等变换与矩阵乘法#
可以发现三类初等矩阵都是在单位矩阵
无论矩阵
倍乘操作#
左乘一个倍乘矩阵
对角矩阵乘对角矩阵还是对角矩阵,对于对角矩阵的乘法,将主对角线上对应的元素相乘。由于单位矩阵是特殊的倍乘矩阵,而倍乘矩阵要求
对于一般的对角矩阵,无论元素是否为
由于倍乘矩阵
倍乘矩阵的乘法可以交换,对角矩阵的乘法也可以交换,在乘法只有对角矩阵时,顺序可以任意排列。
单位阵对应的倍乘操作为保持矩阵
对换操作#
左乘一个对换矩阵
置换:可以理解为把一个有序的数列打乱一次。打乱后可以和原序列一样。
与倍乘矩阵和对角矩阵的关系类似,这里引入置换矩阵的概念。置换矩阵是一个方阵,每行每列均恰有一个
置换矩阵和对于单位矩阵
左乘一个置换矩阵等价于对原矩阵的行进行置换(也就是以行为单位进行置换),右乘一个置换矩阵等价于对原矩阵的列进行置换,相应置换的方法和对于单位矩阵
置换矩阵与置换完全对应,置换矩阵构成的乘法群与置换群同构。由于有定理,在恒等变换视为零个对换的乘积的情形下,任何置换都可以拆为对换的乘积,因此任何置换矩阵也可以拆分为对换矩阵的乘积。
由于对换矩阵的行列式为
对换矩阵的乘法不可交换,置换矩阵的乘法也不可交换。
置换矩阵的行列式为
倍加操作#
左乘倍加矩阵
如果难以记忆,可以观察倍加阵
由于倍加矩阵的行列式为
倍加矩阵的乘法不可交换。
单位矩阵对应的倍加操作为保持矩阵
上三角矩阵#
倍加矩阵是一种上三角矩阵或者下三角矩阵。由于两种矩阵关于主对角线对称,这里讨论上三角矩阵。事实上在这个例子中,只需要进行初等行变换,而不需要列变换。
如果一个上三角矩阵的主对角线均为
由于倍加矩阵的乘法不可交换,上述操作不可调换顺序。
如果一个上三角矩阵的主对角线均非
如果一个上三角矩阵的主对角线存在
无论上三角矩阵的主对角线上是否有
倍加操作将方阵转化为对角阵#
只使用倍加操作可以使任意一个方阵变为对角矩阵,这个例子既需要初等行变换也需要初等列变换。
如果方阵的第一行和第一列存在非零元素,则可以通过倍加办法将左上角元素变为非零,进而借助初等行变换和初等列变换,将第一行和第一列除了左上角元素以外,均变为
如果方阵的第一行和第一列已经均为
借助这个办法,甚至可以规定对角阵的非零元素均在左上角。
如果方阵的第一行和第一列已经均为
仅当剩余的行列也均没有非零元素时,左上角无法变为非零元素,此时剩余的方阵已经为零矩阵。
标准型矩阵#
借助初等变换可以将任意的矩阵,无论形状,化归为标准形矩阵。
标准形矩阵拥有一个单位矩阵
矩阵转化为标准形矩阵后,含有元素
可逆矩阵#
设
如果矩阵
可逆矩阵
两个可逆矩阵
可逆矩阵
作者: 北烛青澜
出处:https://www.cnblogs.com/Multitree/p/17421265.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!