【暖*墟】#逆矩阵# 矩阵求逆的思路与方法
生活随笔
收集整理的這篇文章主要介紹了
【暖*墟】#逆矩阵# 矩阵求逆的思路与方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
矩陣求逆的思路與方法
?
逆矩陣的定義
若一個n*n的方陣A可逆,則存在一個n*n的方陣B, 使得。則稱B是A的一個逆矩陣。A的逆矩陣記作A-1。 (1)驗證兩個矩陣互為逆矩陣 矩陣?????? 按照矩陣的乘法滿足: 。 故A,B互為逆矩陣。 (2)逆矩陣的唯一性若矩陣A是可逆的,則A的逆矩陣是唯一的。
- 【證明】若B,C都是A的逆矩陣,則有:
?????????? 。
- 所以B=C,即A的逆矩陣是唯一的。
逆矩陣的性質定理
- 轉置矩陣:將矩陣的行列互換得到的新矩陣,轉置矩陣的行列式不變。
?
可逆等價條件
若|A|≠0,則矩陣A可逆,且?? 。 其中,A*為矩陣A的伴隨矩陣。求逆矩陣的初等變換法
將一n階可逆矩陣A和n階單位矩陣I寫成一個nX2n的矩陣 。 對B施行初等行變換,即對A與I進行完全相同的若干初等行變換,目標是把A化為單位矩陣。 當A化為單位矩陣I的同時,B的右一半矩陣同時化為了A的逆矩陣。 如求 ?的逆矩陣A-1。 , 故A可逆并且,由右一半可得逆矩陣A-1 = 。初等變換法計算原理
若n階方陣A可逆,即A行等價I,即存在初等矩陣P1,P2,...,Pk; 使得 ,在此式子兩端同時右乘A-1得: 。 比較兩式可知:對A和I施行完全相同的若干初等行變換, 在這些初等行變化把A變成單位矩陣的同時,這些初等行變換也將單位矩陣化為A-1。 如果矩陣A和B互逆,則AB=BA=I。這兩個矩陣的秩等于它們的級數(或稱為階)。 換句話說,這兩個矩陣可以只經由初等行變換,或者只經由初等列變換,變為單位矩陣。?
實例分析說明
- 相關知識介紹可以看? 這里 ?
假設孩子和家長出去旅游,去程坐的是bus,小孩票價為3元,家長票價為3.2元;
回程坐的是Train,小孩票價為3.5元,家長票價為3.6元。問題是分別求小孩和家長的人數。
我們亦可以用下列矩陣求之(縱向)。
?
洛谷P4783 【模板】矩陣求逆
#include <cstdio> #include <algorithm> #include <cctype> using namespace std;const int mod=1e9+7,N=888;int n,a[N][N];inline int add(int a,int b){return a+b>=mod?a+b-mod:a+b;}#define mul(a,b) (1ll*(a)*(b)%mod)int ksm(int d,int k){int f=1;while(k){if(k&1)f=mul(f,d);d=mul(d,d),k>>=1;}return f;} //ksm用于求逆元int read(){ int x=0;char c=getchar(); while(!isdigit(c)) c=getchar();while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x; }int main(){ n=read();for(int i=1;i<=n;i++) //在原矩陣右邊接一個單位矩陣↓↓{ for(int j=1;j<=n;j++) a[i][j]=read(); a[i][i+n]=1; }for(int i=1;i<=n;i++){ //矩陣初等變換,即高斯消元int id=-1; for(int j=i;j<=n;j++) if(a[j][i]){id=j;break;}if(id==-1) return puts("No Solution"),0;std::swap(a[i],a[id]); int inv=ksm(a[i][i],mod-2);for(int j=i;j<=n<<1;j++) a[i][j]=mul(a[i][j],inv);for(int j=i+1;j<=n;j++) for(int k=n<<1;k>=i;k--)a[j][k]=add(a[j][k],mod-mul(a[i][k],a[j][i]));} /* 【原理】把原矩陣通過初等變換消成單位矩陣,右邊的單位矩陣做同樣的變換,就成了逆矩陣。 */for(int i=n;i;i--) for(int j=i-1;j;j--)for(int k=n<<1;k>=i;k--)a[j][k]=add(a[j][k],mod-mul(a[i][k],a[j][i]));for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++)printf("%d ",a[i][j+n]); puts(""); } }?
洛谷P4100 [HEOI2013]鈣鐵鋅硒維生素
#include <cmath> #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <algorithm> #include <stack> #include <queue> #include <iomanip> using namespace std; typedef long long ll; typedef unsigned long long ull;/*【p4100】鈣鐵鋅 給定n個線性無關(不能用其他的加減表示)的向量A[1..n](如果不是線性無關直接輸出無解即可), 另外n個向量B[1..n],求能否給A中的每一個向量選擇一個B中的備用向量, 使得任意兩個備用向量在B中編號不同,且A中的一個向量的備用向量和A中其余向量線性無關。*///【標簽】二分圖匹配 + 矩陣求逆/*【分析】先對A中的每一個向量確定哪些向量可以備用,進行二分圖最小字典序完美匹配。 首先可以考慮一個系數矩陣V,V[i][j]表示“B中第i個向量用A的線性組合表示時,A[j]項的系數”。 容易證明A[i]可以使用B[j]作為備用向量當且僅當Vji≠0(如果Vji=0,B[j]是A中其余向量的線性組合)。 那么Bij?=∑(k=1~n)?Vik*?Akj?,B=VA,即V=BA-1,求A矩陣的逆即可。*/void reads(int &x){int fx=1;x=0;char s=getchar();while(s<'0'||s>'9'){if(s=='-')fx=-1;s=getchar();}while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+(s-'0');s=getchar();}x=x*fx;//正負號 }const int mod=998244353,N=666; //mod必須是質數//----------------矩陣求逆---------------------\\ inline int add(int x,int y){return x+y>=mod?x+y-mod:x+y;}#define mul(x,y) (1ll*(x)*(y)%mod)int ksm(int a,int b){int anss=1;while(b){if(b&1)anss=mul(anss,a);a=mul(a,a),b>>=1;}return anss;} //ksm用于求逆元int a[N][N],b[N][N],V[N][N],g[N][N],n;bool Matrixinv(){ //矩陣求逆for(int i=1;i<=n;i++) a[i][i+n]=1; //右接單位矩陣for(int i=1;i<=n;i++){ //矩陣初等變換,即高斯消元int id=-1; for(int j=i;j<=n;j++) if(a[j][i]){id=j;break;}if(id==-1) return false; std::swap(a[i],a[id]);int inv=ksm(a[i][i],mod-2); //a[i][i]位置元素的逆元for(int j=n<<1;j>=i;j--) a[i][j]=mul(a[i][j],inv);for(int j=i+1;j<=n;j++) for(int k=n<<1;k>=i;k--)a[j][k]=add(a[j][k],mod-mul(a[j][i],a[i][k]));}/*【原理】把原矩陣通過初等變換消成單位矩陣,右邊的單位矩陣做同樣的變換,就成了逆矩陣。 */for(int i=n;i;i--) for(int j=i-1;j;j--)for(int k=n<<1;k>=i;k--)a[j][k]=add(a[j][k],mod-mul(a[j][i],a[i][k]));for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=a[i][j+n]; return true; //將逆矩陣復制回原矩陣 }//----------------二分圖匹配---------------------\\int used[N],match[N],to[N],ban[N];bool dfs(int x){for(int i=1;i<=n;i++)if(g[x][i]&&!used[i]&&!ban[i]){ used[i]=1; if(!match[i]||dfs(match[i])){ match[i]=x,to[x]=i; return true; }} return false; }//----------------主程序---------------------\\int main(){reads(n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) reads(a[i][j]);for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) reads(b[i][j]);if(!Matrixinv()) return puts("NIE"),0; //不是可逆矩陣,沒有答案for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)for(int k=1;k<=n;k++) //矩陣乘法,即V=B*(A^(-1))V[i][j]=add(V[i][j],mul(b[i][k],a[k][j]));for(int i=1;i<=n;i++) //逆向記錄可行性for(int j=1;j<=n;j++) if(V[i][j]) g[j][i]=1;for(int i=1;i<=n;i++){ //二分圖匹配memset(used,0,sizeof(used));if(!dfs(i)) return puts("NIE"),0;} puts("TAK"); int tto[N],tmatch[N];for(int i=1;i<=n;i++){memset(used,0,sizeof(used));for(int j=1;j<=n;j++) //用于保存原數據tto[j]=to[j],tmatch[j]=match[j];int ver=to[i],flag=0; match[ver]=0;for(int j=1;j<ver;j++)if(g[i][j]&&!ban[j]&&!used[j]){used[j]=1; if(!ban[j]&&dfs(match[j])){ to[i]=j; match[j]=i; flag=1; break; }} if(!flag) for(int j=1;j<=n;j++) //此處只能用to[i]to[j]=tto[j],match[j]=tmatch[j]; ban[to[i]]=1;} for(int i=1;i<=n;i++) printf("%d\n",to[i]); //輸出方案 }?
?
?
?????????????????? ? ? ? ? ? ? ? ——時間劃過風的軌跡,那個少年,還在等你。
?
轉載于:https://www.cnblogs.com/FloraLOVERyuuji/p/10397751.html
總結
以上是生活随笔為你收集整理的【暖*墟】#逆矩阵# 矩阵求逆的思路与方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jaxb的实际应用
- 下一篇: sqlserver 查找某个字段在哪张表