目录
基本概念
矩阵(Matrix)—— 由 行
列数字构成的数表,一般用大写字母表示
记 ,其中
为实数集,表示矩阵中的数都来自此集合
例如, 是一个
的实矩阵
对于,矩阵中第
行
列的元素可记为
或
矩阵运算
✦加法✦
即矩阵的对应位置上的两个元素相加
✦减法✦
与加法同理,矩阵的对应位置上的两个元素相减
✦乘法✦
矩阵乘法的定义如下:
给定两个相容的矩阵 和
如果 是一个
的矩阵,并且
是一个
的矩阵
即
那么它们的积 是一个
的矩阵
其中,对于
即左矩阵 的列数要等与右矩阵
的行数,才能相乘
结果矩阵 中的第
行
列元素的计算方式为:
取出左矩阵 中第
行与右矩阵
的第
列,对应项相乘后相加
例:
根据计算规则可知,矩阵乘法一般不满足交换律,但满足结合律及对加法的分配律
●
●
●
代码实现
使用二维数组存储矩阵比较自然和方便,可考虑将其封装为结构体方便传参&存储信息
struct Matrix{
int a[MAXN][MAXN];
int n,m;
} A,B;
根据定义实现矩阵乘法如下,复杂度
for(int i=0;i<C.n;i++){
for(int j=0;j<C.m;j++){
C.a[i][j]=0;
for(int k=0;k<m;k++) C.a[i][j]+=A.a[i][k]*B.a[k][j];
}
}
记得重载运算符以适用于Matrix运算
整个矩阵乘法代码:
//输入时记得从0至n-1,0至m-1输入
#define MAXN 505
struct Matrix{
int a[MAXN][MAXN];
int n,m;
Matrix operator + (Matrix b){ //重载 +
Matrix c;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
c.a[i][j]=(a[i][j]+b.a[i][j]);
c.n=n,c.m=b.m;
return c;
}
Matrix operator - (Matrix b){ //重载 -
Matrix c;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
(c.a[i][j]=a[i][j]-b.a[i][j]);
c.n=n,c.m=b.m;
return c;
}
Matrix operator * (Matrix b){ //重载 *
Matrix c;
memset(c.a,0,sizeof(c.a));
for(int i=0;i<n;i++)
for(int k=0;k<m;k++)
for(int j=0;j<b.m;j++)
c.a[i][j]=c.a[i][j]+a[i][k]*b.a[k][j];
c.n=n,c.m=b.m;
return c;
}
bool operator == (Matrix b){ //重载 == 拿来判断两个矩阵是否相等
if(n!=b.n||m!=b.m) return false;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(a[i][j]!=b.a[i][j]) return false;
return true;
}
void output(){ //结构体内输出
for(int i=0;i<n;i++){
for(int j=0;j<m;j++) cout<<a[i][j]<<" ";
puts("");
}
}
} A,B,C;
✦快速幂✦
多次进行矩阵乘即可
Update:
2023/3/21 矩阵乘的码出锅,修改一下