行列式与矩阵相关与应用
行列式
行列式的概念
记一个n×nn \times nn×n行列式为:
D=∥a11a12...a1na21a22...a2n............an1an2...ann∥D=\left\| \begin{matrix} a_{11} & a_{12} & ... & a_{1n} \\ a_{21} & a_{22} & ... & a_{2n} \\ ... & ... & ... & ... \\ a_{n1} & a_{n2} & ... & a_{nn} \end{matrix} \right\| D=∥∥∥∥∥∥∥∥a11a21...an1a12a22...an2............a1na2n...ann∥∥∥∥∥∥∥∥
计算结果为:
∑(−1)ta1p1a2p2a3p3...anpn\sum (-1)^t a_{1p_1}a_{2p2}a_{3p_3}...a_{np_n}∑(−1)ta1p1a2p2a3p3...anpn
其中t是排列p1,p2...pnp_1,p_2...p_np1,p2...pn的逆序对个数。
也可以记忆一下,二阶行列式是a11a22−a12a21a_{11}a_{22}-a_{12}a_{21}a11a22−a12a21。
行列式的求法
性质1:交换行列式的两行,行列式的值会变成它的相反数。
证明:比如交换第i行和第j行,那么行列式由∑(−1)t1...aipi...ajpj...\sum (-1)^{t_1}...a_{ip_i}...a_{jp_j}...∑(−1)t1...aipi...ajpj...变成了∑(−1)t2...ajpj...aipi...\sum (-1)^{t_2}...a_{jp_j}...a_{ip_i}...∑(−1)t2...ajpj...aipi...,相当于把每一个排列都交换了两个元素,这样这个排列的逆序对数奇偶性一定会改变:
若只看每个数前面比其大的数,如果pi>pjp_i>p_jpi>pj,那么在pjp_jpj前面比其大的数的个数减1,而原来在pjp_jpj前面,现在不在的比pjp_jpj大的数,如果比pip_ipi大,则无影响。否则它们前面失去了一个比它们大的pip_ipi,个数都减1,而pjp_jpj失去了它们,个数也减一,相当于奇偶性不变.pi<pjp_i<p_jpi<pj可以视作考虑每个数后面的比其小的数的个数,也同理。
那么每个t1t_1t1一定和t2t_2t2奇偶性不同。
性质2:某一行乘以一个相同的数,加在另一行上,行列式不变。
证明:相当于变成∑x(−1)ta1p1a2p2a3p3...anpn\sum x(-1)^t a_{1p_1}a_{2p2}a_{3p_3}...a_{np_n}∑x(−1)ta1p1a2p2a3p3...anpn,由于行列式系数为正的项数和为负的相等,所以答案不变。
性质3:
D=∥a1100...0a21a220...0...............an1an2an3...ann∥=∏aiiD=\left\| \begin{matrix} a_{11} & 0 &0 &... & 0 \\ a_{21} & a_{22} &0 &... & 0 \\ ... & ... & ... & ...&... \\ a_{n1} & a_{n2} & a_{n3} &... & a_{nn} \end{matrix} \right\|=\prod a_{ii} D=∥∥∥∥∥∥∥∥a11a21...an10a22...an200...an3............00...ann∥∥∥∥∥∥∥∥=∏aii
性质4:某一行同时乘以一个相同的数,行列式也要乘以那个数。
由上述性质,我们可以得到一种类似于高斯消元的求矩阵行列式的方法(例题:spoj-DETER3):
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int n;LL p,a[205][205];
LL work() {LL re=1;for(int j=1;j<=n;++j) {int id=j; while(id<=n&&!a[id][j]) ++id;if(id>n) return 0;if(id!=j) swap(a[j],a[id]),re=-re;for(int i=j+1;i<=n;++i)while(a[i][j]) {LL t=a[j][j]/a[i][j];for(int k=j;k<=n;++k) a[j][k]=(a[j][k]-a[i][k]*t)%p;swap(a[j],a[i]),re=-re;}re=(re*a[j][j])%p;}return (re%p+p)%p;
}
int main() {while(~scanf("%d%lld",&n,&p)) {for(int i=1;i<=n;++i)for(int j=1;j<=n;++j) scanf("%lld",&a[i][j]),a[i][j]%=p;printf("%lld\n",work());}return 0;
}
按行(列)展开
余子式:一个行列式去掉它的第i行和第j列得到的行列式称为它的余子式,记做MijM_{ij}Mij
代数余子式:aij=(−1)i+jMija_{ij}=(-1)^{i+j}M_{ij}aij=(−1)i+jMij
行列式等于它的任一行(列)各元素与其对应的代数余子式乘积之和,即
D=ai1Ai1+ai2Ai2+...+ainAin(i=1,2...n)D=a_{i1}A_{i1}+a_{i2}A_{i2}+...+a_{in}A_{in} (i=1,2...n)D=ai1Ai1+ai2Ai2+...+ainAin(i=1,2...n)
或
D=a1jA1j+a2jA2j+...+anjAnj(j=1,2...n)D=a_{1j}A_{1j}+a_{2j}A_{2j}+...+a_{nj}A_{nj}(j=1,2...n)D=a1jA1j+a2jA2j+...+anjAnj(j=1,2...n)
这就是行列式按行(列)展开法则,可以简化行列式计算.
伴随矩阵:第i行j列为矩阵A的aija_{ij}aij的矩阵被称为A的伴随矩阵,记做A∗A^{*}A∗
应用
HDU5852
对于两个棋子的情况,如果路径不相交,则方案数为Cb1−a1+n−1n−1×Cb2−a2+n−1n−1C_{b_1-a_1+n-1}^{n-1} \times C_{b_2-a_2+n-1}^{n-1}Cb1−a1+n−1n−1×Cb2−a2+n−1n−1,如果相交,则可以看其最下面的一个交点,交换该交点后的路径,可以把一个相交的关系看作两条从a1a_1a1到b2b_2b2和从a2a_2a2到b1b_1b1的路径,方案数为Cb2−a1+n−1n−1×Cb1−a2+n−1n−1C_{b_2-a_1+n-1}^{n-1} \times C_{b_1-a_2+n-1}^{n-1}Cb2−a1+n−1n−1×Cb1−a2+n−1n−1。
而多条路径相交的情况,则考虑容斥。那么相当于终点被打乱了,成为一个排列。而奇排列(逆序数为奇数的排列)一定是由一个从1到n的排列经过奇数次元素两两交换得到的(自己证),因此原问题可以转化为一个行列式问题。
此外,交这道题千万不要用C++,请用G++,不然会超时(别问我是怎么知道的)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
const LL mod=1000000007;
int n,m,T;LL inv[200005],fac[200005];
int a[105],b[105];LL t[105][105];
LL ksm(LL x,LL y) {LL re=1;for(;y;x=x*x%mod,y>>=1) if(y&1) re=re*x%mod;return re;
}
void init() {fac[0]=inv[0]=1;for(LL i=1;i<=200000;++i) fac[i]=fac[i-1]*i%mod;inv[200000]=ksm(fac[200000],mod-2);for(int i=200000-1;i>=1;--i) inv[i]=inv[i+1]*(i+1)%mod;
}
LL C(LL d,LL u) {if(u>d) return 0;return fac[d]*inv[u]%mod*inv[d-u]%mod;
}
LL work() {LL re=1;for(int j=1;j<=m;++j) {int id=j; while(id<=m&&!t[id][j]) ++id;if(id>m) return 0;if(id!=j) swap(a[id],a[j]),re=-re;LL kl=ksm(t[j][j],mod-2);for(int i=j+1;i<=m;++i)if(t[i][j]) {re=re*kl%mod;//第i行乘t[j][j],相当于将行列式的值扩大了t[j][j]倍for(int k=m;k>=j;--k)t[i][k]=(t[i][k]*t[j][j]%mod-t[j][k]*t[i][j]%mod+mod)%mod;}re=(re*t[j][j])%mod;}return (re%mod+mod)%mod;
}
int main() {init(),scanf("%d",&T);while(T--) {scanf("%d%d",&n,&m);for(int i=1;i<=m;++i) scanf("%d",&a[i]);for(int i=1;i<=m;++i) scanf("%d",&b[i]);for(int i=1;i<=m;++i)for(int j=1;j<=m;++j) t[i][j]=C(n-1+b[i]-a[j],n-1);printf("%lld\n",work());}return 0;
}
矩阵相关
矩阵的逆
使得矩阵AA−1=IAA^{-1}=IAA−1=I(I是单位矩阵)的A−1A^{-1}A−1为AAA的逆矩阵,且A−1A=EA^{-1}A=EA−1A=E
A−1=1∣A∣A∗A^{-1}=\frac{1}{|A|} A^{*}A−1=∣A∣1A∗
矩阵的秩
在矩阵中任取kkk行kkk列,这些行列的交点处的元素取出来,不改变它们的相对位置,构成的一个行列式,称为该矩阵的kkk阶余子式。如果一个矩阵A的任一rrr阶子式不为000,而所有r+1r+1r+1阶子式为000,则rrr称为AAA的秩。
矩阵的秩等于阶数最大的非零余子式的阶数。
矩阵的特征值
若对于矩阵AAA,存在一个向量α\alphaα和一个实数λ\lambdaλ使得Aα=λαA\alpha=\lambda \alphaAα=λα则称α\alphaα为AAA的特征向量,λ\lambdaλ为AAA的特征值。
那么根据∣λI−A∣=0|\lambda I-A|=0∣λI−A∣=0可以解方程求出特征值,进而求出特征向量。
行列式与矩阵相关与应用相关推荐
- 矩阵迹的性质_矩阵(含逆)的迹、行列式关于矩阵自身的导数计算与Maple验证...
常见神经网络在计算相邻层权重关系式时,矩阵对矩阵求导所涉及的维度拼接操作对理论萌新往往不太友好:对于数据型为矩阵的最小二乘问题,尽管迹对矩阵求导操作十分实用但很多人仍习惯于逐项计算偏导.本文避开&qu ...
- 【线性代数】一、行列式和矩阵
一.行列式 文章目录 一.行列式 1.1 行列式性质 1.2 余子式 行列式按照行列展开的展开公式 一.行列式求解 1.用行列式 2.用矩阵 3.用特征值 1.3 行列式计算 一.具体形行列式 (1) ...
- 【应用C】C语言实现行列式与矩阵的运算系统(+源代码)
文章目录 01 - 行列式和矩阵 1.1 - 行列式定义 1.2 - 矩阵定义 02 - 基本运算 2.1 - 行列式基本运算 2.2 - 矩阵基本运算 03 - 数据结构 04 - 结果测试 4.1 ...
- 2020年李永乐线性代数强化笔记-行列式与矩阵
2020年李永乐线性代数强化笔记-行列式与矩阵 写在前面:矩阵的秩的知识 在向量那章讲解 若需要,请移步:2020年李永乐线性代数强化笔记-向量 文章目录 1 行列式 2 矩阵 1 行列式 2 矩阵 ...
- 李永乐线性代数手写笔记-行列式与矩阵
李永乐线性代数基础知识,整理放在博客上面,方便自己复习查看. 概览请移步李永乐线性代数2020年基础课手写笔记汇总 文章目录 一 行列式 二 矩阵 一 行列式 二 矩阵
- Python之数据分析(Numpy的矩阵相关操作、ufunc泛化函数对象)
文章目录 一.矩阵相关操作 二.ufunc统一泛化函数 一.矩阵相关操作 1.三种构造矩阵的方法 np.matrix(二维容器, copy=True) 一参为可被解释为矩阵的二维容器,比如二维数组.二 ...
- Mantel test: 两个矩阵相关关系的检验
转载 http://blog.sina.com.cn/s/blog_4b678be40100o464.html Mantel test 是对两个矩阵相关关系的检验,由Nathan Mantel在197 ...
- 常用的行列式和矩阵的性质
常用的行列式和矩阵的性质
- 矩阵相关操作和矩阵快速幂
矩阵相关操作和矩阵快速幂 矩阵基本运算以及快速幂模板 POJ - 3070. Fibonacci Hdu - 1757A. Simple Math Problem Codeforces - 185A. ...
- 总结利用秩为1的矩阵相关矩阵的秩的计算问题
总结利用秩为1的矩阵相关矩阵的秩的计算问题 @(线性代数) 对于一个秩为1的矩阵,常常给定的是一个列向量与自己的转置之积. http://blog.csdn.net/u011240016/articl ...
最新文章
- OpenCV 静态链接 libstdc++
- 向安卓模拟器中添加文件
- c语言 串口中断服务函数,GCC-AVR 编写中断服务函数的注意事项
- VTK修炼之道57:图形基本操作进阶_点云配准技术(LandMark标记点算法和坐标系显示方法)
- 某系统有6台输出设备 有多个进程均需要使用2台_从零开始学K8s: 2.开发与部署方式的演变...
- 汽车电子传感器科普:激光雷达 毫米波雷达 超声波雷达
- android生成aar无效,android studio生成aar包并在其他工程引用aar包的方法
- 在后台增加一个查询条件
- ASP.NET - 网页重定向 Response.Redirect()
- 《QTreeView表项实现排序的2种方式》:系列教程之九
- pcie gen3 bios设置_性价比无敌or搞笑? A卡传统回来了!(附刷bios教程)
- 基于spss的非线性回归(non-linear regression)
- 一个疯狂的地下市场--支付牌照的买卖
- (实战)决策树例子+画图
- css 屏幕背景图片 img.html
- Windows Azure 成为业内首家被授权为 FedRAMP JAB P-ATO 的供应商
- 推荐mac os 下更改键盘映射软件KeyRemap4MacBook
- 适合旅游时住的各地旅馆 超级便宜,绝对实用,谢谢分享!有好东西大家共享!
- Linux ssh 端口修改
- Metasploit的简单应用
热门文章
- 量化投资学习-30:股性与人性,从傅里叶变换谈谈股市大V的操作风格的观察
- 后端知识点:互联网中B端客户和C端客户的区别
- 电脑是linux下安装win7,Linux下安装win7
- Python 五角星的画法 five star
- 安装的photoshop cs2为什么一进去就说我的用户名、组织、或序列号无效或错误???
- 如何使用代理服务器上网
- 清华大学计算机系2016名单,清华大学2016年自主招生北京考生入选名单汇总
- 小葵花妈妈课堂开课了:《Runnable、Callable、Future、RunnableFuture、FutureTask 源码分析》
- 写HTML为什么骨架生成不了,HTML骨架
- 英特尔科技论坛 北京登场