矩阵的基本运算

1、加法

(数乘、加、减差不多)

一个数a,一个矩阵A,求a+A。即把A里的每一个元素加上a

2、矩阵乘法

两个矩阵A、B(保证A是一个n * m的矩阵,B是一个m * q的矩阵),求A*B。即将A中每一行的第i个元素,乘B中每一列的第i个元素,再相加,如此一组计算后,得到一个元素。所以结果的矩阵是n * q的。

下举两例:

\begin{bmatrix} 1 &2 &3 \\ -1&-2 &-3 \end{bmatrix} * \begin{bmatrix} 4&5 &6 \\ -4&-5 &-6\\ 7& 8 &9 \end{bmatrix} = \begin{bmatrix} (1*4)+(2*(-4))+(3*7) &(1*5)+(2*(-5))+(3*8) &(1*6)+(2*(-6))+(3*9) \\ (-1*4)+(-2*(-4))+(-3*7) &(-1*5)+(-2*(-5))+(-3*8) &(-1*6)+(-2*(-6))+(-3*9) \end{bmatrix}

(此图为转载) 

3、矩阵的行列式

 只有方阵才有其行列式(记作det()或\begin{vmatrix} \end{vmatrix})。行列式的求法:任意找一行或一列数,循环到第i行第j列的数时,删除原矩阵的第i行,第j列,得到一个方阵,用这个方阵的行列式,乘第i行第j列的数,再乘 -1^(i+j) ,最后全部加起来。如果方阵是2*2的,是直接算的。即A=\begin{bmatrix} a &b \\ c&d \end{bmatrix},则det(A)=ad-bc。例:

A=\begin{bmatrix} 1 &2 &3 \\ 4& 5 &6 \\ 7& 8 &9 \end{bmatrix},假如分别用第一行来算: 

det(A)=1*(-1)^{i+j}*\begin{vmatrix} 5 &6 \\ 8&9 \end{vmatrix}+2*(-1)^{1+2}*\begin{vmatrix} 4&6 \\ 7&9 \end{vmatrix}+3*(-1)^{1+3}*\begin{vmatrix} 4&5 \\ 7&8 \end{vmatrix}

每一个方阵的行列式,无论取哪一行,哪一列来算,行列式的值是唯一的。

模板

矩阵加、乘(矩阵乘法,非数乘)、幂(只能用于方阵)的模板:

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44025325/article/details/88946701