1、加法
(数乘、加、减差不多)
一个数a,一个矩阵A,求a+A。即把A里的每一个元素加上a
2、矩阵乘法
两个矩阵A、B(保证A是一个n * m的矩阵,B是一个m * q的矩阵),求A*B。即将A中每一行的第i个元素,乘B中每一列的第i个元素,再相加,如此一组计算后,得到一个元素。所以结果的矩阵是n * q的。
下举两例:
(此图为转载)
3、矩阵的行列式
只有方阵才有其行列式(记作det()或)。行列式的求法:任意找一行或一列数,循环到第i行第j列的数时,删除原矩阵的第i行,第j列,得到一个方阵,用这个方阵的行列式,乘第i行第j列的数,再乘 -1^(i+j) ,最后全部加起来。如果方阵是2*2的,是直接算的。即,则。例:
,假如分别用第一行来算:
每一个方阵的行列式,无论取哪一行,哪一列来算,行列式的值是唯一的。
模板
矩阵加、乘(矩阵乘法,非数乘)、幂(只能用于方阵)的模板:
struct juzhen{
int n,m,c[105][105];
juzhen(){
memset(c,0,sizeof c);
}
void read(){
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
scanf("%d",&c[i][j]);
}
juzhen operator *(const juzhen &a){
juzhen b;
b.n = n;
b.m = a.m;
for(int i = 1;i <= b.n;i++)
for(int j = 1;j <= b.m;j++)
for(int k = 1;k <= m;k++)
b.c[i][j] =(b.c[i][j] + c[i][k] * a.c[k][j] % mod) % mod;
return b;
}
void print(){
for(int i = 1;i <= n;i++){
for(int j = 1;j < m;j++)
printf("%d ",c[i][j]);
printf("%d",c[i][m]);
if (i != n)
printf("\n");
}
}
};
juzhen power(juzhen a,int b)
{
juzhen ans;
ans.n = ans.m = a.n;
for(int i = 1;i <= ans.n;i++)
ans.c[i][i] = 1;
while(b){
if (b % 2 == 1)
ans = ans * a;
a = a * a;
b /= 2;
}
return ans;
}