前言
矩阵的运算有加,减,乘三种。
其实还有矩阵求逆但太难了我就不写了2333
这里m×n表示m行n列,从1开始。
加法
同类型的矩阵加法
对于矩阵A,B,C,A+B=B+A,(A+B)+C=A+(B+C)。
假设现在有矩阵A=∣∣∣∣∣∣∣∣a11a21...am1a12a22am2.........a1na2namn∣∣∣∣∣∣∣∣(m×n)和B=∣∣∣∣∣∣∣∣b11b21...bm1b12b22bm2.........b1nb2nbmn∣∣∣∣∣∣∣∣(m×n)。
则A+B=∣∣∣∣∣∣∣∣a11+b11a21+b21...am1+bm1a12+b12a22+b22am2+bm2.........a1n+b1na2n+b2namn+bmn∣∣∣∣∣∣∣∣(m×n)
不同类型的矩阵加法
假设现在有矩阵A=∣∣∣∣∣∣∣∣a11a21...am1a12a22am2.........a1na2namn∣∣∣∣∣∣∣∣(m×n)和B=∣∣∣∣∣∣∣∣b11b21...bq1b12b22bq2.........b1pb2pbqp∣∣∣∣∣∣∣∣(q×p)。
则A+B=∣∣∣∣A00B∣∣∣∣=∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣a11a21...am100...0a12a22am2000..................a1na2namn000000b11b21bq1000b12b22bq2..................000b1pb2pbqp∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣[(m+q)×(n+p)]
减法
减法只能同类型的矩阵相减。
同上,若有A=∣∣∣∣∣∣∣∣a11a21...am1a12a22am2.........a1na2namn∣∣∣∣∣∣∣∣(m×n)和B=∣∣∣∣∣∣∣∣b11b21...bm1b12b22bm2.........b1nb2nbmn∣∣∣∣∣∣∣∣(m×n)。
则A−B=∣∣∣∣∣∣∣∣a11−b11a21−b21...am1−bm1a12−b12a22−b22am2−bm2.........a1n−b1na2n−b2namn−bmn∣∣∣∣∣∣∣∣(m×n)
乘法
乘法有数乘(矩阵乘一个数)和矩阵相乘。
数乘
若有A=∣∣∣∣∣∣∣∣a11a21...am1a12a22am2.........a1na2namn∣∣∣∣∣∣∣∣(m×n)和一个数λ。
A×λ=∣∣∣∣∣∣∣∣a11×λa21×λ...am1×λa12×λa22am2×λ.........a1n×λa2n×λamn×λ∣∣∣∣∣∣∣∣(m×n)
矩阵乘法(矩阵乘矩阵)
一个m×n和一个q×p的矩阵相乘,仅当 n=q时有意义,答案矩阵的大小是m×p。
那么假设有A=∣∣∣∣∣∣∣∣a11a21...am1a12a22am2.........a1na2namn∣∣∣∣∣∣∣∣(m×n)和B=∣∣∣∣∣∣∣∣b11b21...bn1b12b22bn2.........b1pb2pbnp∣∣∣∣∣∣∣∣(n×p)。
那么答案矩阵C=∣∣???∣∣(m×p)(因为要写的东西太多,这里就不写了2333)
答案矩阵Cxy=∑i=1nAxi×Biy。
在矩阵乘法中,矩阵满足如下规律:
- (AB)C=A(BC)
- (A+B)C=AC+BC
- C(A+B)=CA+CB
最后附注
在普通的乘法中,一个数乘1还是等于它本身,在矩阵乘法中也有这么一个“1”,它就是单位矩阵
不同于普通乘法中的单位1,对于不同矩阵他们的单位矩阵大小是不同的
对于m×n的矩阵,它的单位矩阵大小为m×m,对于p×q的矩阵,它的单位矩阵大小为p×p。
也就是说,单位矩阵都是正方形的。
这是因为只有正方形的矩阵能保证结果和前一个矩阵形状相同
单位矩阵的元素非0即1,从左上角到右下角的对角线上元素皆为1,其他皆为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;
}