矩阵运算

前言

矩阵的运算有加,减,乘三种。

其实还有矩阵求逆但太难了我就不写了2333

这里m×nm\times n表示mmnn列,11开始

加法

同类型的矩阵加法

对于矩阵A,B,C,A+B=B+A,(A+B)+C=A+(B+C)A,B,C,A+B=B+A,(A+B)+C=A+(B+C)
假设现在有矩阵A=a11a12...a1na21a22...a2n...am1am2...amn(m×n)A=\begin{vmatrix}a_{11}&a_{12}&...&a_{1n}\\a_{21}&a_{22}&...&a_{2n}\\...\\a_{m1}&a_{m2}&...&a_{mn}\end{vmatrix}(m\times n)B=b11b12...b1nb21b22...b2n...bm1bm2...bmn(m×n)B=\begin{vmatrix}b_{11}&b_{12}&...&b_{1n}\\b_{21}&b_{22}&...&b_{2n}\\...\\b_{m1}&b_{m2}&...&b_{mn}\end{vmatrix}(m\times n)

A+B=a11+b11a12+b12...a1n+b1na21+b21a22+b22...a2n+b2n...am1+bm1am2+bm2...amn+bmn(m×n)A+B=\begin{vmatrix}a_{11}+b_{11}&a_{12}+b_{12}&...&a_{1n}+b_{1n}\\a_{21}+b_{21}&a_{22}+b_{22}&...&a_{2n}+b_{2n}\\...\\a_{m1}+b_{m1}&a_{m2}+b_{m2}&...&a_{mn}+b_{mn}\end{vmatrix}(m\times n)

不同类型的矩阵加法

假设现在有矩阵A=a11a12...a1na21a22...a2n...am1am2...amn(m×n)A=\begin{vmatrix}a_{11}&a_{12}&...&a_{1n}\\a_{21}&a_{22}&...&a_{2n}\\...\\a_{m1}&a_{m2}&...&a_{mn}\end{vmatrix}(m\times n)B=b11b12...b1pb21b22...b2p...bq1bq2...bqp(q×p)B=\begin{vmatrix}b_{11}&b_{12}&...&b_{1p}\\b_{21}&b_{22}&...&b_{2p}\\...\\b_{q1}&b_{q2}&...&b_{qp}\end{vmatrix}(q\times p)

A+B=A00B=a11a12...a1n00...0a21a22...a2n00...0...am1am2...amn00...000...0b11b12...b1p00...0b21b22...b2p...00...0bq1bq2...bqp[(m+q)×(n+p)]A+B=\begin{vmatrix}A&0\\0&B\end{vmatrix}=\begin{vmatrix}a_{11}&a_{12}&...&a_{1n}&0&0&...&0\\a_{21}&a_{22}&...&a_{2n}&0&0&...&0\\...\\a_{m1}&a_{m2}&...&a_{mn}&0&0&...&0\\0&0&...&0&b_{11}&b_{12}&...&b_{1p}\\0&0&...&0&b_{21}&b_{22}&...&b_{2p}\\...\\0&0&...&0&b_{q1}&b_{q2}&...&b_{qp}\end{vmatrix}[(m+q)\times (n+p)]

减法

减法只能同类型的矩阵相减。

同上,若有A=a11a12...a1na21a22...a2n...am1am2...amn(m×n)A=\begin{vmatrix}a_{11}&a_{12}&...&a_{1n}\\a_{21}&a_{22}&...&a_{2n}\\...\\a_{m1}&a_{m2}&...&a_{mn}\end{vmatrix}(m\times n)B=b11b12...b1nb21b22...b2n...bm1bm2...bmn(m×n)B=\begin{vmatrix}b_{11}&b_{12}&...&b_{1n}\\b_{21}&b_{22}&...&b_{2n}\\...\\b_{m1}&b_{m2}&...&b_{mn}\end{vmatrix}(m\times n)

AB=a11b11a12b12...a1nb1na21b21a22b22...a2nb2n...am1bm1am2bm2...amnbmn(m×n)A-B=\begin{vmatrix}a_{11}-b_{11}&a_{12}-b_{12}&...&a_{1n}-b_{1n}\\a_{21}-b_{21}&a_{22}-b_{22}&...&a_{2n}-b_{2n}\\...\\a_{m1}-b_{m1}&a_{m2}-b_{m2}&...&a_{mn}-b_{mn}\end{vmatrix}(m\times n)

乘法

乘法有数乘(矩阵乘一个数)和矩阵相乘。

数乘

若有A=a11a12...a1na21a22...a2n...am1am2...amn(m×n)A=\begin{vmatrix}a_{11}&a_{12}&...&a_{1n}\\a_{21}&a_{22}&...&a_{2n}\\...\\a_{m1}&a_{m2}&...&a_{mn}\end{vmatrix}(m\times n)和一个数λ\lambda

A×λ=a11×λa12×λ...a1n×λa21×λa22...a2n×λ...am1×λam2×λ...amn×λ(m×n)A\times \lambda=\begin{vmatrix}a_{11}\times\lambda&a_{12}\times\lambda&...&a_{1n}\times\lambda\\a_{21}\times\lambda&a_{22}&...&a_{2n}\times\lambda\\...\\a_{m1}\times\lambda&a_{m2}\times\lambda&...&a_{mn}\times\lambda\end{vmatrix}(m\times n)

矩阵乘法(矩阵乘矩阵)

一个m×nm\times n和一个q×pq\times p的矩阵相乘,仅当 n=qn=q时有意义,答案矩阵的大小是m×pm\times p

那么假设有A=a11a12...a1na21a22...a2n...am1am2...amn(m×n)A=\begin{vmatrix}a_{11}&a_{12}&...&a_{1n}\\a_{21}&a_{22}&...&a_{2n}\\...\\a_{m1}&a_{m2}&...&a_{mn}\end{vmatrix}(m\times n)B=b11b12...b1pb21b22...b2p...bn1bn2...bnp(n×p)B=\begin{vmatrix}b_{11}&b_{12}&...&b_{1p}\\b_{21}&b_{22}&...&b_{2p}\\...\\b_{n1}&b_{n2}&...&b_{np}\end{vmatrix}(n\times p)

那么答案矩阵C=???(m×p)C=\begin{vmatrix}???\end{vmatrix}(m\times p)(因为要写的东西太多,这里就不写了2333)

答案矩阵Cxy=i=1nAxi×BiyC_{xy}=\sum_{i=1}^nA_{xi}\times B_{iy}

在矩阵乘法中,矩阵满足如下规律:

  • (AB)C=A(BC)(AB)C=A(BC)
  • (A+B)C=AC+BC(A+B)C=AC+BC
  • C(A+B)=CA+CBC(A+B)=CA+CB

最后附注

在普通的乘法中,一个数乘11还是等于它本身,在矩阵乘法中也有这么一个“11”,它就是单位矩阵

不同于普通乘法中的单位11,对于不同矩阵他们的单位矩阵大小是不同的

对于m×nm\times n的矩阵,它的单位矩阵大小为m×mm\times m,对于p×qp\times q的矩阵,它的单位矩阵大小为p×pp\times p

也就是说,单位矩阵都是正方形的。

这是因为只有正方形的矩阵能保证结果和前一个矩阵形状相同

单位矩阵的元素非0011,从左上角到右下角的对角线上元素皆为11,其他皆为0。——子谦。

这里因为不想写了,直接摘抄子谦。大佬的话

代码如下:

#include<bits/stdc++.h>
#define ns "-1"
#define fs(i,x,y,z) for(ll i=x;i<=y;i+=z)
#define ft(i,x,y,z) for(ll i=x;i>=y;i+=z)
#define ll long long
#define ull unsigned long long
#define db double
#define ms(a,b) memset(a,b,sizeof(a))
#define sz(a) sizeof(a)
using namespace std;
const int N=151,inf=0x7f7f7f7f,moda=1000000007;//2个最大值是360,推荐值351
inline ll read(){
	ll date=0,w=1;char c=0;
	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
	return date*w;
} 
struct kucan{
	ll p,q,dlt[N][N];//p*q
	kucan(){
		p=1,q=1;
		ms(dlt,0);
	}
	kucan operator + (const kucan b) const{
		kucan c;
		if(b.p==p&&b.q==q){
			fs(i,1,p,1){
				fs(j,1,q,1){
					c.dlt[i][j]=dlt[i][j]+b.dlt[i][j];
				}
			}
			c.p=p;
			c.q=q;
		}else{
			fs(i,1,p,1){
				fs(j,1,q,1){
					c.dlt[i][j]=dlt[i][j];//+b.dlt[i][j];
				}
			}
			fs(i,1,b.p,1){
				fs(j,1,b.q,1){
					c.dlt[i+p][j+q]=b.dlt[i][j];
				}
			}
			c.p=p+b.p;
			c.q=q+b.q;
		}
		return c;
	}
	kucan operator - (const kucan b) const{
		kucan c;
		if(b.p==p&&b.q==q){
			fs(i,1,p,1){
				fs(j,1,q,1){
					c.dlt[i][j]=dlt[i][j]-b.dlt[i][j];
				}
			}
			c.p=p;
			c.q=q;
		}
		return c;
	}
	kucan operator * (const kucan b) const{
		kucan c;
		if(b.p==q){
			c.p=p;
			c.q=b.q;
			fs(i,1,c.p,1){
				fs(j,1,c.q,1){
					ll jk=0;
					fs(k,1,q,1){
						jk+=dlt[i][k]*b.dlt[k][j];
						jk%=moda;
					}
					c.dlt[i][j]=jk;
					c.dlt[i][j]%=moda;
				}
			}
			
		}
		return c;
	}
	kucan operator * (const ll b) const{
		kucan c;
		fs(i,1,p,1){
			fs(j,1,q,1){
				c.dlt[i][j]=dlt[i][j]*b;
			}
		}
		c.p=p;
		c.q=q;
		return c;
	}
	void out(){
		fs(i,1,p,1){
			fs(j,1,q,1){
				printf("%lld ",dlt[i][j]);
			}
			puts("");
		}
	}
	void in(int x,int y){
		p=x;
		q=y;
		fs(i,1,p,1){
			fs(j,1,q,1){
				dlt[i][j]=read();
			}
		}
	}
}a,ans;
kucan ksm(kucan a,ll b){
    kucan ans;
    while(b){
        if(b&1){
            ans=ans*a;
	    }
	    a=a*a;
	    b>>=1;
	}
    return ans;
}
int main(){
	return 0;
}