矩阵
矩阵
基础知识
单位矩阵
一般用 \(I\) 表示。
\(I_{i,i}=1\),其他位置是 \(0\) 的矩阵。
任何矩阵与 \(I\) 相乘,或者 \(I\) 于任何矩阵相乘,结果都是另一个矩阵。
方阵
即 \(n\times n\) 的正方形矩阵。
矩阵的秩
概述
矩阵的秩是线性代数中的一个基本概念,它描述了矩阵中行向量或列向量的最大线性无关组的个数。即行向量或列向量的线性基。
使用 \(\text{rank} (A)\) 表示矩阵 \(A\) 的秩。
性质
-
矩阵的转置不改变其秩,即 \(\text{rank} (A) = \text{rank} (A^T)\)。
-
矩阵的秩小于或等于其行数和列数的最小值。
-
矩阵与非零常数的乘积不改变其秩。
-
零矩阵的秩为零。
-
两个矩阵的和的秩小于或等于这两个矩阵的秩之和。
-
两个矩阵乘积的秩小于或等于这两个矩阵的秩的最小值。
方阵求逆
对矩阵 \(A\),求 \(A^{-1}\) 满足 \(A \cdot A^{-1} = I\)。(\(I\) 是单位矩阵)。
方法是对 \(A\) 进行高斯消元。将 \(A\) 消成 \(I\)。开一个新的矩阵 \(I\),每次对 \(A\) 操作时对 \(I\) 进行相同的操作。
实现的时候一般把 \(A\) 的右侧拼上 \(I\),变成一个 \(n \times 2n\) 的矩阵。然后对这个矩阵进行高斯消元。变成对角矩阵。也就是消成左半边是 \(I\) 的形式,这个时候右半边就是 \(A^{-1}\)。
证明不会,代码如下:
#include<bits/stdc++.h>
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
namespace juzhenqiuni {
constexpr int N=407,mod=1e9+7;
int add(int a,int b) { return a+b>=mod ? a+b-mod : a+b; }
void _add(int &a,int b) { a=add(a,b); }
int mul(int a,int b) { return 1ll*a*b%mod; }
void _mul(int &a,int b) { a=mul(a,b); }
int n;
int a[N][N<<1];
int ksm(int a,int b=mod-2) {
int s=1;
while(b) {
if(b&1) _mul(s,a);
_mul(a,a);
b>>=1;
}
return s;
}
void gauss() {
rep(i,1,n) {
int r=i;
rep(j,i+1,n) if(a[j][i]>a[r][i]) r=j;
if(r!=i) swap(a[i],a[r]);
if(!a[i][i]) puts("No Solution"), exit(0);
int t=ksm(a[i][i]);
rep(j,1,n) {
if(j==i) continue;
int p=mul(a[j][i],t);
rep(k,i,n<<1) _add(a[j][k],mod-mul(a[i][k],p));
}
rep(j,i,n<<1) _mul(a[i][j],t);
}
}
void main() {
sf("%d",&n);
rep(i,1,n) rep(j,1,n) sf("%d",&a[i][j]);
rep(i,1,n) a[i][i+n]=1;
gauss();
rep(i,1,n) {
rep(j,1,n) pf("%d ",a[i][j+n]); pf("\n");
}
}
}
int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("my.out","w",stdout);
#endif
juzhenqiuni :: main();
}
本文来自博客园,作者:liyixin,转载请注明原文链接:https://www.cnblogs.com/liyixin0514/p/18648620