boxmoe_header_banner_img

Hello! 欢迎来到DRheEheAM的blog!

加载中

文章导读

矩阵


hhhh 我复活了!!

最近学了亿一点点东西
慢慢来写吧

先来记录一下矩阵

定义 & 矩阵乘法 & 初等变换

矩阵

[a1,1a1,2a1,ma2,1a2,2a2,man,1an,2an,m]\begin{bmatrix} a_{1,1} & a_{1,2} & \cdots & a_{1,m} \\ a_{2,1} & a_{2,2} & \cdots & a_{2,m} \\ \cdots & \cdots & \cdots & \cdots \\ a_{n,1} & a_{n,2} & \cdots & a_{n,m} \end{bmatrix}

在线性代数中分为 行向量

(ai,1ai,2ai,m)\begin{pmatrix} a_{i,1} & a_{i,2} & \cdots & a_{i,m} \\ \end{pmatrix}

与 列向量

(a1,ja2,jan,j)\begin{pmatrix} a_{1,j} \\ a_{2,j} \\ \cdots \\ a_{n,j} \\ \end{pmatrix}
From OI-wiki

线性代数的主要研究对象是列向量,约定使用粗体小写字母表示列向量.在用到大量向量与矩阵的线性代数中,不引起混淆的情况下,在手写时,字母上方的向量记号可以省略不写.

向量也是特殊的矩阵.如果想要表示行向量,需要在粗体小写字母右上方写转置记号.行向量在线性代数中一般表示方程.

对于矩阵 $A$ ,主对角线指所有 $A_{i,i}$ 的元素

单位矩阵

一般以 $I$ 表示单位矩阵,形式为:

[100010001]\begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \cdots & \cdots & \cdots & \cdots \\ 0 &0 & \cdots & 1 \end{bmatrix}

对角矩阵

对角矩阵

[a10000a20000a30000an]\begin{bmatrix} a_1 & 0 & 0 & \cdots & 0 \\ 0 & a_2 & 0 & \cdots & 0 \\ 0 & 0 & a_3 & \cdots & 0 \\ \cdots & \cdots & \cdots & \cdots & \cdots \\ 0 & 0 & 0 & \cdots & a_n \end{bmatrix}

也可以表示为

diag{a1,a2,a3,,an}\text{diag} \{a_1,a_2,a_3,\cdots,a_n\}

同型矩阵

两个矩阵,行数与列数对应相同,称为同型矩阵。

方阵

行数等于列数的矩阵称为方阵.方阵是一种特殊的矩阵.对于”$n$ 阶矩阵”的习惯表述,实际上讲的是 $n$ 阶方阵.阶数相同的方阵为同型矩阵。

研究方程组、向量组、矩阵的秩的时候,使用一般的矩阵.研究特征值和特征向量、二次型的时候,使用方阵。

三角矩阵

如果方阵主对角线左下方的元素均为 00,称为上三角矩阵.如果方阵主对角线右上方的元素均为 00,称为下三角矩阵.

两个上(下)三角矩阵的乘积仍然是上(下)三角矩阵.如果对角线元素均非 0,则上(下)三角矩阵可逆,逆也是上(下)三角矩阵.

单位三角矩阵

如果上三角矩阵 AA 的对角线全为 11,则称 AA 是单位上三角矩阵.如果下三角矩阵 AA 的对角线全为 11,则称 AA是单位下三角矩阵.

两个单位上(下)三角矩阵的乘积仍然是单位上(下)三角矩阵,单位上(下)三角矩阵的逆也是单位上(下)三角矩阵.

矩阵乘法

矩阵乘法是 向量内积 的推广。
矩阵相乘只有在第一个矩阵行数等于第二个矩阵的列数是才有意义。

AAp×mp \times m 的矩阵,BBm×qm \times q 的矩阵。
C=A×BC=A\times B ,则 CCp×qp\times q 的矩阵。
其中 CC 的第 ii 行第 jj 列的元素 Ci,jC_{i,j} 表示为:

Ci,j=k=1mAi,kBk,jC_{i,j}= \sum_{k=1}^{m} A_{i,k}B_{k,j}

容易证明,矩阵乘法不满足一般的交换律,满足结合律。

初等矩阵

倍乘矩阵

倍乘矩阵是一种特殊的对角矩阵。

Di(k)=diag{1,,1,k,1,,1}D_i(k) = \text{diag} \{1,\cdots,1,k,1,\cdots,1\}

其中第 ii 个元素为 k (k0)k \ (k\not = 0)

特别的,当k=1k=1时,Di(k)=ID_i(k)=I

对换矩阵

对换矩阵是一种特殊的的对称矩阵。

pi,j=[Ii1     0 1   Iji1   1 0     Inj]p_{i,j}= \begin{bmatrix} I_{i-1} & \ & \ & \ &\ \\ \ & 0 & \ & 1 &\ \\ \ & \ & I_{j-i-1} & \ &\ \\ \ & 1 & \ & 0 &\ \\ \ & \ & \ & \ & I_{n-j} \\ \end{bmatrix}

对换矩阵主对角线上除了第 ii 个元素和第 jj 个元素都为 11,第 ii 个元素和第 jj 个元素为 00 ,而在第 ii 行第 jj 列和第 jj 行第 ii 列为 11,其余位置为 00

对换矩阵要求 iijj 不能相等.

倍加矩阵

倍加矩阵是在单位阵 II 的基础上,令第 ii 行第 jj 列为 kk

Ti,j(k)=[11k11]T_{i,j}(k)= \begin{bmatrix} 1 & & & & & & & \\ &\ddots & & & & & & \\ & & 1 &\cdots & k & & & \\ & & &\ddots & \vdots& & & \\ & & & & 1 & & & \\ & & & & &\ddots&&\\ &&&&&&1\\ \end{bmatrix}

倍加矩阵要求  iji \not = j

倍加矩阵是一种上三角矩阵或者下三角矩阵.

初等变换

不仅限于方阵,对于一般的矩阵 AA,可以进行初等行变换和初等列变换,统称为初等变换。

初等行变换与初等列变换一样,都有 3 种:

  • 倍乘(multiplication)
  • 对换(switching)
  • 倍加(addition)

这里先介绍初等行变换:

  • 第 𝑖 行乘非零数 kkBDi(k)BB\to D_{i}(k)B
  • 第 𝑖,𝑗 行互换:BPi,jBB\to P_{i,j}B
  • 第 𝑗 行乘 𝑘 加到第 𝑖 行:BTi,j(k)BB\to T_{i,j}(k)B

将上述操作的行改为列,即得到初等列变换。

From OI-wiki…

在初等变换中,对换可以通过倍乘和倍加实现。显然,倍加不能通过倍乘和对换实现。借助行列式的知识,以及下文的初等变换与矩阵乘法的等价性,也能说明倍乘不能通过倍加和对换实现。

因此,相较对换而言,倍乘和倍加是更为本质的操作。对换操作是为了在消元法中,保证消元的有序,而引入的辅助操作。

矩阵快速幂

对于矩阵 AA ,显然 AnA^nnn 可以被拆分成唯一分解 n=p0+p121+p222++pk2kn=p_0+p_12^1+p_22^2+\dots+p_k2^k ,其中 pi(0ik)[0,1]p_i(0\le i \le k) \in [0,1] pk0p_k\not=0

所以对于所有不为 00pip_iii 的集合 PPAn=iPA2iA^n=\sum _{i \in P} A^{2^i}

容易发现,这正是快速幂。
故我们可以用快速幂加速矩阵幂运算

例题:P3390 【模板】矩阵快速幂

//hanser!!!!!!!
#include<bits/stdc++.h>
using namespace std;
#define intc constexpr int
#define int long long
#define Cios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
intc mod=1e9+7;
intc N=200;
class Matrix {
    public:
    int line,col;
    int c[N][N];
    Matrix ()=default;
    Matrix (int n,int m):line(n),col(m) {
        memset (c,0,sizeof c);
    } 
    static Matrix unit (int n) {
        Matrix m=Matrix(n,n);
        for (int i=1;i<=n;i++) m.c[i][i]=1;
        return m;
    }
    int * operator [] (const int pos) {
        return c[pos];
    }
    Matrix operator * (Matrix &q) {
        Matrix ans=Matrix(line,q.col);
        for (int i=1;i<=ans.line;i++) {
            for (int j=1;j<=ans.col;j++) {
                for (int k=1;k<=col;k++) ans[i][j]=(ans[i][j]+c[i][k]*q[k][j])%mod;
            }
        }
        return ans;
    }
    Matrix pow (int b) {
        Matrix res=Matrix::unit(line),a=*this;
        if (b<=0) return res;
        while (b) {
            if (b&1) res=res*a;
            a=a*a;
            b>>=1;
        }
        return res;
    }
};
int n,k;
signed main() {
    cin>>n>>k;
    Matrix mx=Matrix(n,n);
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=n;j++) cin>>mx[i][j];
    }
    mx=mx.pow(k);
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=n;j++) cout<<mx[i][j]<<" ";
        cout<<"\n";
    }
    return 0;
}


评论(1)

查看评论列表
评论头像
FallenLeaf 2026年01月21日
awa

发表评论

表情 颜文字
插入代码
DRheEheAM_Gary Blog