码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-05-02 20:58:37      阅读:54      评论:0      收藏:0      [点我收藏+]

标签:相同   read   clear   https   重载   lin   oid   关于   逆运算   

关于矩阵:

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

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

\(3.\) 矩阵乘法:

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

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

这里矩阵乘法没有交换律

\(4.\) 快速幂

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

\(5.\) 高斯消元

link

\(6.\) 矩阵求逆

定义:如果 \(A\times 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知识总结(矩阵求逆)

标签:相同   read   clear   https   重载   lin   oid   关于   逆运算   

原文地址:https://www.cnblogs.com/yspm/p/12819335.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!