矩阵TG知识总结(矩阵求逆)

Posted yspm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了矩阵TG知识总结(矩阵求逆)相关的知识,希望对你有一定的参考价值。

关于矩阵:

(1.) 矩阵加法:直接对应位置加

(2.) 矩阵减法:直接对应位置减

(3.) 矩阵乘法:

[ans_{i,j}=sum^{n}_ {k=1} a_{i,j} imes a_{k,j} ]

这里要求相乘的 (A) 的行和 (B) 的列相同

这里矩阵乘法没有交换律

(4.) 快速幂

重载一下运算符,和普通快速幂一样写

(5.) 高斯消元

link

(6.) 矩阵求逆

定义:如果 (A imes P equiv e (mod p)) 其中 (A,P) 为可矩阵乘矩阵,(e) 为单位矩阵

那么我们成矩阵(P) 为矩阵 (A)(mod p) 意义下的逆元

求法:

博主只会高斯消元求的一种

先考虑整一个矩阵 (B) 放在 (A) 的右侧,同时对 (A) 进行高斯消元

消成上三角之后接着消成单位矩阵就好了

我们对 (A) 进行得操作对 (B) 进行一样的,然后就没问题了

最后得到的 (B) 就是 (A)(mod p) 意义下的逆

(Code:)

#include<bits/stdc++.h>
using namespace std;
namespace yspm{
	inline int read()
	{
		int res=0,f=1; char k;
		while(!isdigit(k=getchar())) if(k==‘-‘) f=-1;
		while(isdigit(k)) res=res*10+k-‘0‘,k=getchar();
		return res*f;
	}
	const int mod=1e9+7;
	inline int ksm(int x,int y)
	{
		int res=1; for(;y;y>>=1,x=1ll*x*x%mod) if(y&1) res=res*1ll*x%mod;
		return res;
	}
	const int N=510;
	int n;
	struct mat{
		int a[N][N];
		inline void clear(){memset(a,0,sizeof(a)); return ;}
		inline void update(int id,int val)
		{
			for(int i=1;i<=n;++i) a[id][i]=a[id][i]*1ll*val%mod; 
			return ;
		}
		inline void ch(int x,int y,int val)
		{
			for(int i=1;i<=n;++i) a[x][i]=((a[x][i]+1ll*a[y][i]*val%mod)%mod+mod)%mod;
			 return ;
		}
		inline void swap(int x,int y){for(int i=1;i<=n;++i) swap(a[x][i],a[y][i]); return ;}
		int* operator [](int x){return a[x];}
		inline void print()
		{
			for(int i=1;i<=n;++i){for(int j=1;j<=n;++j) printf("%d ",a[i][j]); puts("");}
			return ;
		}
	}A,B;
	signed main()
	{
		n=read(); for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) A[i][j]=read();
		for(int i=1;i<=n;++i) B[i][i]=1;
		for(int i=1;i<=n;++i)
		{
			if(!A[i][i])
			{
				for(int j=i+1;j<=n;++j) if(A[j][i]){ A.swap(i,j),B.swap(i,j); break;}
			}
			if(!A[i][i]) return puts("No Solution"),0;
			int inv=ksm(A[i][i],mod-2); A.update(i,inv); B.update(i,inv);
			for(int j=i+1;j<=n;++j) B.ch(j,i,-A[j][i]),A.ch(j,i,-A[j][i]);
		}
		for(int i=n-1;i>=1;--i) for(int j=i+1;j<=n;++j) B.ch(i,j,-A[i][j]),A.ch(i,j,-A[i][j]);
		B.print();
		return 0;
	}
}
signed main(){return yspm::main();}

用途:我们在处理矩阵的逆运算的时候可以考虑求逆,比如把矩阵作为函数求其逆函数

以上是关于矩阵TG知识总结(矩阵求逆)的主要内容,如果未能解决你的问题,请参考以下文章

矩阵求逆操作的复杂度分析(逆矩阵的复杂度分析)

矩阵求逆_伴随矩阵法

矩阵求逆

没有 Numpy 的矩阵求逆

调整现有代码和内核代码以执行大量 3x3 矩阵求逆

(Gauss-Jordan)高斯消元法求逆矩阵(含C/C++实现代码)