参考资料:

nealchen
Rose_max

求解A的代数余子式:

(1)rank(A)<=n-2,每个位置均为0
(2)rank(A)=n,有A∗=∣A∣∗A−1A^*=|A|*A^{-1}A∗=∣A∣∗A−1,其中A*是代数余子式矩阵的转置矩阵,实现的时候需要注意这点
(3)rank(A)=n-1,则求出非0行向量p,满足pA=0,以及非0列向量q,满足Aq=0
找出一对r,c,满足pr≠0,qc≠0p_r\neq 0,q_c\neq 0pr​​=0,qc​​=0,我们有Ai,j=piqjprqcAr,cA_{i,j}=\frac{p_iq_j}{p_rq_c}A_{r,c}Ai,j​=pr​qc​pi​qj​​Ar,c​
实现的时候,为了方便可以设置pr=1,qc=1p_r=1,q_c=1pr​=1,qc​=1
至于求解一个矩阵的秩,模拟高斯消元,还剩下多少个非0的行向量就是矩阵的秩
至于求解一个矩阵的逆,由于保证了逆是良定义的,所以一定可以用:
1.一行乘上某个数
2.一行乘上某个数加到某行
2.交换两行
变成单位矩阵
注意到,上面3个变换都可以表示成矩阵,意思是你求出了个
Ek....E1A=IE_k....E_1A=IEk​....E1​A=I,那么Ek..E1=A−1E_k..E_1=A^{-1}Ek​..E1​=A−1
上面的时间复杂度都是O(n3)O(n^3)O(n3)

例题

求出代数余子式后随便做
复杂度:O(n3+m)O(n^3+m)O(n3+m)
正经人谁考场上写代数余子式啊

#include<bits/stdc++.h>
using namespace std;
const int Mod=1000000007;
int n,m;
#define Maxn 305
#define E 100010
struct Edge{int s,e,t;
}edge[E];
int A[Maxn][Maxn],invA[Maxn][Maxn],B[Maxn][Maxn],Ans[Maxn][Maxn],C[Maxn][Maxn];namespace modular{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){return 1ll*a*b%Mod;}int Fast_Pow(int a,int b){int res=1;while(b){if(b&1)res=1ll*res*a%Mod;a=1ll*a*a%Mod;b>>=1;}return res;}
}using namespace modular;int p[Maxn],q[Maxn];
void Gauss(int A[][Maxn],int *p,int &r){for(int i=1,t=1;i<=n&&t<=n;++i,++t){for(int j=i;j<=n;++j)if(A[j][t]){if(j^i)for(int k=t;k<=n;++k)swap(A[i][k],A[j][k]);break;}if(!A[i][t]){--i;r=t;}else{int f=Fast_Pow(A[i][t],Mod-2);for(int j=i+1;j<=n;++j){int v=mul(f,A[j][t]);if(v)for(int k=t;k<=n;++k)A[j][k]=dec(A[j][k],mul(A[i][k],v));}}}p[r]=1;int at;for(int i=n-1;i>=1;--i){if(i<r)at=i;else at=i+1;p[at]=0;for(int j=at+1;j<=n;++j)p[at]=dec(p[at],mul(p[j],A[i][j]));p[at]=mul(p[at],Fast_Pow(A[i][at],Mod-2));}
}
int Det(int A[][Maxn]){int res=1;for(int i=1;i<=n;++i){for(int j=i;j<=n;++j)if(A[j][i]){if(j^i){for(int k=i;k<=n;++k)swap(A[i][k],A[j][k]);res=dec(0,res);}break;}int f=Fast_Pow(A[i][i],Mod-2);for(int j=i+1;j<=n;++j){int v=mul(f,A[j][i]);for(int k=i;k<=n;++k)A[j][k]=dec(A[j][k],mul(A[i][k],v));}}for(int i=1;i<=n;++i)res=mul(res,A[i][i]);return res;
}
void solve(){for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){A[i][j]=B[i][j];invA[i][j]=0;if(i==j)invA[i][j]=1;}int cnt=0,ty=1;for(int i=1,t=1;i<=n&&t<=n;++i,++t){for(int j=i;j<=n;++j)if(A[j][t]){if(j^i){for(int k=t;k<=n;++k){swap(A[i][k],A[j][k]);swap(invA[i][k],invA[j][k]);}for(int k=1;k<t;++k)swap(invA[i][k],invA[j][k]);ty=dec(0,ty);}break;}if(!A[i][t]){--i;cnt++;}else{int f=Fast_Pow(A[i][t],Mod-2);for(int j=i+1;j<=n;++j){int v=mul(f,A[j][t]);for(int k=t;k<=n;++k){A[j][k]=dec(A[j][k],mul(A[i][k],v));invA[j][k]=dec(invA[j][k],mul(invA[i][k],v)); }for(int k=1;k<t;++k)invA[j][k]=dec(invA[j][k],mul(invA[i][k],v));}}}if(cnt>=2){for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)Ans[i][j]=0;return;}if(!cnt){for(int i=n;i>=1;--i){ty=mul(ty,A[i][i]);for(int j=i+1;j<=n;++j)for(int k=1;k<=n;++k)invA[i][k]=dec(invA[i][k],mul(A[i][j],invA[j][k]));int t=Fast_Pow(A[i][i],Mod-2);for(int k=1;k<=n;++k)invA[i][k]=mul(invA[i][k],t);}for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){Ans[j][i]=mul(invA[i][j],ty);}return;}for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)C[j][i]=B[i][j];int r,c;Gauss(C,p,r);Gauss(A,q,c);int t1,t2;for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(i!=r&&j!=c){if(i<r)t1=i;else t1=i-1;if(j<c)t2=j;else t2=j-1;C[t1][t2]=B[i][j];}n--;int res=Det(C);if((r+c)&1)res=dec(0,res);n++;for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)Ans[i][j]=mul(p[i],mul(q[j],res));
}inline void rd(int &x){x=0;char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
}int main(){rd(n);rd(m);for(int i=1;i<=m;++i){rd(edge[i].s);rd(edge[i].e);rd(edge[i].t);B[edge[i].s][edge[i].e]=dec(B[edge[i].s][edge[i].e],1);B[edge[i].s][edge[i].s]++;}n--;solve();n++;int res=0;for(int i=1;i<=m;++i)if(edge[i].s<n)res=add(res,mul(dec(Ans[edge[i].s][edge[i].s],Ans[edge[i].s][edge[i].e]),edge[i].t));   printf("%d\n",res);return 0;
}

[Bzoj 3168]求出逆矩阵后,变成二分图最小字典序的完美匹配
时间复杂度O(n3)O(n^3)O(n3)

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-8;
int n;
#define Maxn 305
double A[Maxn][Maxn],invA[Maxn][Maxn],B[Maxn][Maxn],C[Maxn][Maxn];int head[Maxn<<1],v[200010],nxt[200010],tot=0;
inline void add_edge(int s,int e){tot++;v[tot]=e;nxt[tot]=head[s];head[s]=tot;}int S,mn,fr[Maxn<<1];
int match[Maxn<<1];
bool vis[Maxn<<1];
bool dfs1(int u){for(int i=head[u];i;i=nxt[i])if(!vis[v[i]]){vis[v[i]]=true;if(!match[v[i]]||dfs1(match[v[i]])){match[u]=v[i];match[v[i]]=u;return true;}}return false;
}void dfs2(int u){for(int i=head[u];i;i=nxt[i])if(!vis[v[i]]){vis[v[i]]=true;fr[match[v[i]]]=u;dfs2(match[v[i]]);}else if(v[i]==S)mn=min(mn,u);
}void calc_inv(){for(int i=1;i<=n;++i)invA[i][i]=1.0;for(int i=1;i<=n;++i){if(fabs(A[i][i])<eps){for(int j=i+1;j<=n;++j)if(fabs(A[j][i])>=eps){for(int k=i;k<=n;++k){swap(A[i][k],A[j][k]);swap(invA[i][k],invA[j][k]);}for(int k=1;k<i;++k)swap(invA[i][k],invA[j][k]);break;}}if(fabs(A[i][i])<eps){puts("NIE");exit(0);} for(int j=i+1;j<=n;++j){double t=A[j][i]/A[i][i];for(int k=i;k<=n;++k)A[j][k]-=A[i][k]*t,invA[j][k]-=invA[i][k]*t;for(int k=1;k<i;++k)invA[j][k]-=invA[i][k]*t;}}for(int i=n;i>=1;--i){for(int j=i+1;j<=n;++j)for(int k=1;k<=n;++k)invA[i][k]=(invA[i][k]-invA[j][k]*A[i][j]);for(int j=1;j<=n;++j)invA[i][j]=invA[i][j]/A[i][i];}
}int main(){scanf("%d",&n);for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)scanf("%lf",&A[i][j]);for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)scanf("%lf",&B[i][j]);calc_inv();for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)for(int k=1;k<=n;++k)C[i][k]+=B[i][j]*invA[j][k];for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){if(fabs(C[i][j])>=eps)add_edge(j,i+n),add_edge(i+n,j);}for(int i=1;i<=n;++i)if(!match[i]){memset(vis,false,sizeof(bool)*(2*n+1));if(!dfs1(i)){puts("NIE");return 0;}}puts("TAK");for(int i=1;i<=n;++i){S=i;mn=match[i];for(int j=i+1;j<=n;++j)vis[j]=false;vis[i]=true;dfs2(match[i]);int z=match[i];int at=mn,pre=match[at];while(at!=z){int to=pre;match[to]=fr[at];pre=match[fr[at]];match[fr[at]]=to;at=fr[at];}match[i]=mn;match[mn]=i;}for(int i=1;i<=n;++i)printf("%d\n",match[i]-n);return 0;
}

矩阵的秩,行列式,代数余子式啥的相关推荐

  1. 线性代数之矩阵我们需要了解的知识点(增广矩阵矩阵的迹 矩阵的秩阶梯型...)

                                                                          线性代数之矩阵基础点常见概念与示例汇总 矩阵的定义 由m乘n ...

  2. 线性代数行列式计算之迭代法

    线性代数行列式计算之迭代法 声明与简介 线性代数行列式计算之迭代法是利用行列式逐阶展开式会发现或总结出n阶和n-1阶.n-2阶以及剩余阶的关系式,进而推算出整个行列式的最终结果.比如可以由  或反过来 ...

  3. 【Python科学计算系列】行列式

    1.二元线性方程组求解 import numpy as np a = np.array([[3, -2], [2, 1]]) b = np.array([12, 1]) d = np.linalg.s ...

  4. 【线性代数(4)】行列式按行展开,异乘变零,拉普拉斯定理

    行列式按行展开 1 余子式 2 代数余子式 3 按行展开(降阶) 4 异乘变零定理 5 拉普拉斯定理 6 行列式相乘 手动反爬虫: 原博地址 知识梳理不易,请尊重劳动成果,文章仅发布在CSDN网站上, ...

  5. 行列式(determinant)求值

    如果A是一个矩阵(n*n方阵),则det(A)或| A |表示和A对应的n阶行列式,是一个标量. 行列式值直接求解(1阶行列式的值等于其唯一元素值): 2阶矩阵的行列式:∣a11a12a21a22∣= ...

  6. [数学]——一文记录高数、线代、概统知识点

    目录 高数 线代(50min) 概统(50min) 补充 高数 高数 数列和函数极限的定义: 数列:任意ε,存在N,n>N时,|x-极限| < ε 函数:任意ε,存在δ,0<|x-x ...

  7. 线性代数重难点笔记总结(上)

    文章目录 前言 一.行列式 定理1.1.1:对换,改变奇偶 定理1.1.2:奇偶排列数量均为n!/2 行列式的性质 代数余子式 异乘变零定理: 定理1.1.3:拉普拉斯展开定理 基本结论: 应用: 分 ...

  8. 矩阵分析 第二章 lambda矩阵和Jordan标准型

    这一章的知识太杂了,有必要整理一下 什么是矩阵 矩阵元素是的多项式就是矩阵 矩阵的秩 行列式可以是的多项式但是能是零,就可以求 矩阵的逆 首先,求它的行列式,只有行列式为常数且非0:这个矩阵才有逆. ...

  9. 信息与通信工程学科面试——线性代数

    行列式.矩阵的秩 行列式可以理解为n维向量组成的n维空间的体积,比如说22的行列式,就可以看成是两组向量组成的平行四边形的面积,三维就是平行六面体的体积,以此类推.若其中有两组或以上的向量线性相关,围 ...

  10. Harris 角点检测(Harris Corner Detection)(OpenCV实现)

    匹配问题 Harris角点检测是Chris Harris和Mike Stephens在1988年提出的.主要用于运动图像的追踪.当时的普遍想法是利用边缘进行追踪,但是当相机或物体运动时你不知道朝哪个方 ...

最新文章

  1. MS SQL Server和MySQL区别
  2. 参加LinuxCon Japan 2012
  3. JavaScript中 for、for in、for of、forEach等使用总结
  4. xamarin ios html5 video.js 无法播放
  5. (十三)其他设计模式
  6. 解决内存不能为read或者0x0***的错误
  7. 面向过程、面向函数、面向对象的区别浅谈
  8. 网络操作系统 第七章 管理TCP/IP网络
  9. linux 环境搭建Jenkins
  10. .eslintrc.js相关配置
  11. halcon学习之边缘检测
  12. ubuntu下安装g++
  13. java 打印素数_Java 素数打印
  14. blender_(uv应用)................http://digitalman.blog.163.com/blog/static/23874605620174172058299/...
  15. 微信H5分享、复制链接遇到的坑
  16. leaflet地图原理_Leaflet地图框架使用手册
  17. SD卡驱动-基础知识
  18. 【转载】应聘总经理的答卷,供大家打分
  19. 传统安防企业资本运作:找准定位、创新为本
  20. Linux 下检测是否插入U盘

热门文章

  1. 如何写出规范的好代码
  2. 《学习之道》第四章继续回想
  3. Nvidia Xavier Nx平台多路imx274相机视频通路调试记录
  4. 鉴权/认证框架Spring Security和Apache Shiro比较
  5. 数字孪生智慧场馆项目应用场景展示
  6. next数组和nextval数组值
  7. [Linux] PHP程序员玩转Linux系列-升级PHP到PHP7
  8. 【安全知识分享】DOCX|常见生产安全事故现场应急处置方案汇编(附下载)
  9. 个人实验第二次记录过程
  10. 中英文视频识别字幕并对其添加字幕--自用可白嫖--中/英/中英双语字幕