O(n5)O(n^5)O(n5) 做法:

  • 先求出 AAA 的伴随矩阵 A∗A^{*}A∗,后利用 A∗A∗=∣A∣∗E⇒A−1=A∗∣A∣A*A^{*}=|A|*E\Rightarrow A^{-1}=\frac{A^{*}}{|A|}A∗A∗=∣A∣∗E⇒A−1=∣A∣A∗​ 求解
    需要求 O(n2)O(n^2)O(n2) 次行列式

O(n4)O(n^4)O(n4) 做法:

  • 对每一行来一波高斯消元

O(n3)O(n^3)O(n3) 做法:
首先介绍矩阵的初等变换(以下为初等行变换):

  1. 交换两行,记做 ri↔rjr_i\leftrightarrow r_jri​↔rj​
  2. 将一行的所有元乘上数 k≠0k\neq 0k​=0
  3. 将一行的所有元的 k≠0k\neq 0k​=0 倍加到另一行上
  • 若 AAA 能通过若干次初等行变换变为 BBB,则称 AAA 与 BBB 行等价,A∼BA\sim BA∼B(等价符号上有一个字母 rrr,没打出来,一下均用 ∼\sim∼ 表示行等价)
  • 定理:设 A,BA,BA,B 为 m×nm\times nm×n 矩阵,A∼BA\sim BA∼B 的充分必要条件是存在 mmm 阶可逆矩阵 PPP 使得 PA=BPA=BPA=B

引入:初等矩阵: 把单位矩阵 EEE 经过一次初等变换得到的矩阵称为初等矩阵。
性质1:设 AAA 为 m×nm\times nm×n矩阵,对 AAA 进行一次初等行变换相当于在 AAA 的左边乘上对应的 mmm 阶初等矩阵
性质2:方阵 AAA 可逆的充分必要条件是存在有限个初等矩阵 P1,P2,...,PlP_1,P_2,...,P_lP1​,P2​,...,Pl​ 使 A=P1P2...PlA=P_1P_2...P_lA=P1​P2​...Pl​
充分性:因为初等矩阵均可逆,所以有限个初等矩阵的乘积仍可逆,故 AAA 可逆。
必要性:设 AAA 可逆,它经过有限次初等行变换变为行最简矩阵 BBB,那么存在初等矩阵 Q1,Q2,...,QlQ_1,Q_2,...,Q_lQ1​,Q2​,...,Ql​ 使 Q1Q2...QlA=BQ_1Q_2...Q_lA=BQ1​Q2​...Ql​A=B,因为 A,QiA,Q_iA,Qi​ 均可逆,故 BBB 可逆,故 ∣B∣≠0,B=E|B|\neq 0,B=E∣B∣​=0,B=E
此时 A=Q1−1Q2−1...Ql−1B=Q1−1Q2−1...Ql−1=P1...PlA=Q_1^{-1}Q_2^{-1}...Q_l^{-1}B=Q_1^{-1}Q_2^{-1}...Q_l^{-1}=P_1...P_lA=Q1−1​Q2−1​...Ql−1​B=Q1−1​Q2−1​...Ql−1​=P1​...Pl​,此时 Pi=Qi−1P_i=Q_i^{-1}Pi​=Qi−1​为初等矩阵

  • 定理证明:A∼B⇔A\sim B \LeftrightarrowA∼B⇔ 存在有限个矩阵 P1,P2,...,PlP_1,P_2,...,P_lP1​,P2​,...,Pl​ 使 Pl...P2P1A=B⇔P_l...P_2P_1A=B \LeftrightarrowPl​...P2​P1​A=B⇔ 存在可逆矩阵 PPP使 PA=BPA=BPA=B

  • 推论:方阵 AAA 可逆的充分必要条件是 A∼EA\sim EA∼E
    证明:AAA 可逆 ⇔\Leftrightarrow⇔ 存在可逆矩阵 PPP,使 PA=E⇔A∼EPA=E\Leftrightarrow A\sim EPA=E⇔A∼E

  • 本题解法:现在知道 AAA,求 PPP 使 PA=EPA=EPA=E
    同时我们有 PE=EPE=EPE=E,那么我们有 P(A,E)=(E,P)P(A,E)=(E,P)P(A,E)=(E,P),于是我们对矩阵 (A,E)(A,E)(A,E) 做初等行变换,当 AAA 变为 EEE 时,EEE 就变成了 PPP,无解情况用推论判断即可,复杂度 O(n3)O(n^3)O(n3),非常好写

#include<bits/stdc++.h>
#define cs const
using namespace std;
int read(){int cnt = 0, f = 1; char ch = 0;while(!isdigit(ch)){ ch = getchar(); if(ch == '-') f = -1; }while(isdigit(ch)) cnt = cnt*10 + (ch-'0'), ch = getchar();return cnt * f;
}
cs int Mod = 1e9 + 7;
typedef long long ll;
int add(int a, int b){ return a + b >= Mod ? a + b - Mod : a + b; }
int dec(int a, int b){ return a - b < 0 ? a - b + Mod : a - b; }
int mul(int a, int b){ ll r=(ll)a*b; return r>=Mod?r%Mod:r; }
int ksm(int a, int b){ int as=1; for(;b;b>>=1,a=mul(a,a)) if(b&1) as=mul(as,a); return as; }
void Add(int &a, int b){ a = add(a, b); }
void Mul(int &a, int b){ a = mul(a, b); }
void Dec(int &a, int b){ a = dec(a, b); }
cs int N = 405, M = N + N;
#define poly vector<int>
int n; poly a[N];
poly operator - (poly a, poly b){for(int i=1; i<=n+n; i++) Dec(a[i],b[i]); return a;
}
poly operator * (poly a, int coe){for(int i=1; i<=n+n; i++) Mul(a[i],coe); return a;
}
int main(){n = read();for(int i = 1; i <= n; i++){a[i].resize(n+n+1);for(int j = 1; j <= n; j++)  a[i][j] = read();}for(int i = 1; i <= n; i++) a[i][i+n] = 1;for(int i = 1; i <= n; i++){int k = i; for(int j = i+1; j <= n; j++) if(a[j][i]){ k = j; break; }if(i ^ k) swap(a[i], a[k]);int iv = ksm(a[i][i], Mod-2);for(int j = i+1; j <= n; j++){int coe = mul(iv, a[j][i]);a[j] = a[j] - a[i] * coe;} }for(int i = n; i >= 1; i--){if(a[i][i] == 0){ puts("No Solution"); return 0; }for(int j = i+1; j <= n; j++) if(a[i][j]) a[i] = a[i] - a[j] * a[i][j];int iv = ksm(a[i][i],Mod-2); a[i] = a[i] * iv;} for(int i = 1; i <= n; i++){for(int j = n+1; j <= n+n; j++) cout << a[i][j] << " ";puts("");} return 0;
}

【模板】矩阵求逆(矩阵初等变换)相关推荐

  1. 3阶以内的矩阵求逆矩阵的3种手算方法

    我们知道求矩阵的逆具有非常重要的意义,本文分享给大家如何针对3阶以内的方阵,求出逆矩阵的3种手算方法:待定系数法.伴随矩阵法.初等变换法(只介绍初等行变换) 1.待定系数法求逆矩阵 首先,我们来看如何 ...

  2. 线性代数分块矩阵求逆矩阵_单位矩阵属性(AI = A)| 使用Python的线性代数

    线性代数分块矩阵求逆矩阵 Prerequisites: 先决条件: Defining Matrix 定义矩阵 Identity matrix 身份矩阵 numpy.matmul( ) matrix m ...

  3. 如何将矩阵化为约旦标准型_【解题方法】矩阵初等变换的应用

    [本文为了赚点知乎盐值而写, 供各位同学一笑 :P] 本文将介绍并总结矩阵初等变换的一系列的解题应用包括,内容全部整理自本人本科期间的学习笔,对于正在学习高等代数的同学解题应该很有用. 本文主要内容 ...

  4. LA@分块矩阵@初等变换@初等矩阵#逆矩阵计算@初等变换法

    文章目录 LA@分块矩阵@初等变换@初等矩阵#逆矩阵计算@初等变换法 分块矩阵 乘法 逆 例 准对角矩阵 转置 矩阵的初等变换

  5. 数学/线性代数 {矩阵初等变换,[阶梯形/最简形]矩阵,初等矩阵}

    数学/线性代数 {矩阵初等变换,[阶梯形/最简形]矩阵,初等矩阵}; @LOC_COUNTER: 3; 矩阵的初等变换 定义 矩阵的初等变换 和行列式的变换 是完全一样的; . LINK: (http ...

  6. C++三阶矩阵求逆矩阵

    记录一下第一次独立写的代码 感觉自己写的很粗糙,慢慢来吧. //=================== //三阶矩阵求逆矩阵 //===================#include <std ...

  7. 阐述矩阵初等变换方法在线性代数中的应用

    阐述矩阵初等变换方法在线性代数中的应用. 解:(1)矩阵初等变换的定义: 矩阵的初等变换包括矩阵的初等行变化与初等列变换.矩阵的初等行(列)变换:(1)对调矩阵的两行(列):(2)矩阵的某行(列)所有 ...

  8. 利用矩阵初等变换进行对角化

    目录 矩阵初等变换 对角化 证明 矩阵初等变换 记某矩阵为,其中为维度为n的行向量.则行初等变换有以下三种: 1. 交换两行的位置: 2. 3. 同样的,对应的列初等变换就是把行向量换成列向量即可. ...

  9. 矩阵初等变换与矩阵乘法的联系

    前置知识: [定义]矩阵 逆矩阵的性质 [定义]矩阵初等变换和矩阵等价 前置定义 1(矩阵等价) 如果矩阵 A\boldsymbol{A}A 经有限次初等行变换变成矩阵 B\boldsymbol{B} ...

  10. 矩阵初等变换的计算细节

    矩阵初等变换的计算细节: 随便选一行消元,叫做目标行.一般把目标行放到最下面,即运用第一种初等行变换-交换. 先用第二种初等行变换,即数乘化简. 再用第三种初等行变换,即倍加消,消不掉以后换一行消. ...

最新文章

  1. 读书:一百个 终身受益的 思维模型(持续更新)
  2. GNU/Linux下LVM配置管理以及快照卷、物理卷、卷组、逻辑卷的创建和删除
  3. latex 伪代码_Latex-算法伪代码
  4. springboot多数据源动态数据源(主从)
  5. 干货 | 阿里巴巴HBase高可用8年抗战回忆录
  6. flex布局_Flex布局,真香
  7. 计算机编程语言的分类,解释型语言、编译型语言、脚本语言的关系
  8. Linux操作系统中vi常见用法和相关配置
  9. 线程和进程有什么区别(简单介绍)
  10. UML的类图中各箭头的含义
  11. C语言课程设计(服装管理系统详解)
  12. 2012成都之行----幺祖祖
  13. 网上兼职编程赚钱的那点事
  14. 热敏电阻的选型参数含义解读
  15. django项目之官网需求分析实现
  16. Jupyter Notebook,day1 2019.3.25
  17. linux系统常用性能参数命令
  18. QT初尝试之熄灯游戏
  19. NMS——非极大值抑制
  20. 优秀的简历模版(给你们准备好了)

热门文章

  1. 双指针—指定区间的最大合数区间
  2. python中e的x次方_e的x次方的图像是怎么画的?
  3. discuz!论坛解决站帮网vip插件bug:VIP会员到期后还是在vip用户组,没有自动切换到默认用户组
  4. ExtJS 4.2 教程-01:Hello ExtJS
  5. 固定于计算机主机箱中承载,一种计算机用主机箱的制作方法
  6. EN 14315-1建筑物用隔热产品-现场制喷涂硬质聚氨酯(PUR)和聚异氰脲酯(PIR)泡沫产品,第1部分:硬质泡沫喷雾系统安装前规范--CE认证
  7. 京东赔付完之后钱怎么退回?
  8. 【Linux】守护进程( Daemon)的定义,作用,创建流程
  9. 思维导图之《七堂课穿越牛熊》(雪球网,民工君)
  10. typora的一些基本使用技巧