矩阵

矩阵

基础知识

单位矩阵

一般用 \(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();
}
posted @ 2025-01-02 19:26  liyixin  阅读(3)  评论(0编辑  收藏  举报