矩阵运算

矩阵

本蒟蒻刚刚学习矩阵,还很辣鸡。。
矩阵,顾名思义,就是由数字组成的矩形
通常用Anm表示一个有n列m行的矩阵,其中aij表示第i列第j行的元素,又称元
例如:

1   2
3   5
就是一个2*2的矩阵【不会放数学公式所以括号就不画了= =】

矩阵加法

两个矩阵相加,首先必须是两个行列n*m都相同的矩阵
相加就是把相同位置的数加起来得到一个新的n*m的矩阵

矩阵减法

类似于矩阵加法,相同位置相减

矩阵数乘

表示为a*A,也就是用一个数去乘一个矩阵
得到一个相同大小的矩阵,每个位置上的数字扩大a倍

矩阵乘法

以上三种运算都十分直观而好理解
但矩阵乘法就很迷了【本蒟蒻表示好难QAQ】

前提:
如果两个矩阵A,B能相乘,必须满足  A的列数=B的行数
比如:
1 2 3       5 8
4 5 6       3 4
               2 6
这两个矩阵就可以相乘

怎么乘呢?
对于上边两个矩阵,相乘结果为:
(1*5+2*3+3*2)   (1*8+2*4+3*6)
(4*5+5*3+6*2)   (4*8+5*4+6*6)
看出来了吗?
得到的新矩阵的第一列第一个数,为A矩阵的第一行所有数与B矩阵第一列数每个数对应相乘后相加的结果,
同理,第一列第二个数,等于A矩阵第一行与B矩阵第二列进行同样的操作
也就是说,对于第i列第j个数,等于A矩阵第i行与B矩阵第j列进行一次对应相乘相加

矩阵乘法的意义大概就是两组数之间的映射运算关系
比如方程5x+3y=1
可以写成:
5 3     x          =    1
          y
【没有扩号看着好难看= =】

为了方便,通常把矩阵写成进结构体,然后重载运算符
struct Matrix{
	LL s[maxn][maxn],n,m;
	Matrix() {n=m=0;fill(s[0],s[0]+maxn*maxn,0);}
};

矩阵乘法:
inline Matrix operator *(const Matrix& a,const Matrix& b){
	Matrix c;
	if(a.m!=b.n) return c;
	c.n=a.n;c.m=b.m;
	for(int i=1;i<=c.n;i++)
		for(int j=1;j<=c.m;j++)
			for(int k=1;k<=a.m;k++)
				c.s[i][j]=(c.s[i][j]+a.s[i][k]*b.s[k][j]%P)%P;
	return c;
}

矩阵快速幂

矩阵乘法没有交换律,但满足结合率,所以在对数的快速幂仍然可以运用到矩阵中来
但矩阵能自乘必须满足自身是方阵(n==m)
Matrix qpow(Matrix a,LL b){
	Matrix ans;
	ans.n=ans.m=a.n;
	for(int i=1;i<=a.n;i++)
		for(int j=1;j<=a.m;j++)
			ans.s[i][j]=(i==j);
	for(;b;b>>=1,a=a*a)
		if(b&1) ans=ans*a;
	return ans;
}




我那么弱,没看懂还是看其他dalao的吧QAQ
原文地址:https://www.cnblogs.com/Mychael/p/8282885.html