zoukankan      html  css  js  c++  java
  • 基础矩阵学习笔记

    基础知识

    矩阵的概念

    矩阵( (matrix) )是一个由数排列成的矩形,例如

    [A= egin{bmatrix} a_{1,1} & a_{1,2} & a_{1,3} \ a_{2,1} &a_{2,2}&a_{2,3} end{bmatrix}= egin{bmatrix} 1 & 2&3 \ 4 & 5&6 end{bmatrix} quad ]

    是一个 (2 imes3) 的矩阵 (A=(a_{i,j}))。其中 (i=1,2)(j=1,2,3)。第 (i) 行第 (j) 列的元素用 (a_{i,j}) 表示。

    由此,可以开一个结构体 (Matrix),并作初始化。

    struct Matrix
    {
        int a[N][N];	
        Matrix()
        {
            memset(a,0,sizeof a);
        }
    }a,ans;
    

    矩阵的运算

    加法和减法就是每个对应的元素加或减。但是注意,两个矩阵行数、列数要相等。

    Matrix operator +(const Matrix x)
    {
        Matrix z;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                z.a[i][j]=(a[i][j]+x.a[i][j])%mod;
            }
        }
        return z;
    }
    

    乘法比较复杂 (qwq)。有两个矩阵 (Z)(Y)。当 (Z) 的列数等于 (Y) 的行数时,定义一个矩阵 (Z),可得 (Z=XY)。如果 (X)(m imes n) 矩阵,(Y)(n imes p) 矩阵,那么 (Z)(n imes p) 矩阵。

    其中 (Z_{i,j}) 满足

    [Z_{ij}=sum_{k=1}^mX_{ik}Y_{kj} ]

    根据这个定义容易得到 (O(n^3)) 的矩阵乘法,由于作者很逊,所以不会复杂度更优秀的做法。

    Matrix operator *(const Matrix x)
    {
        Matrix z;
        for(int i=1;i<=n;i++)
        {
            for(int k=1;k<=n;k++)//据说k写在第二层循环会快一点?
            {   
                for(int j=1;j<=n;j++)
                {
                    z.a[i][j]=(z.a[i][j]+a[i][k]*x.a[k][j])%mod;
                }
            }
        }
        return z;
    }
    

    然后,去做做这道题练手吧

    对了,矩阵乘法还有个性质,就是矩阵乘法也是满足乘法结合律的,这对接下来很有帮助。

    逆矩阵

    在取模下,每个元素 (a) 都有唯一的逆元 (a^{-1}) 使得 (a imes a^{-1}=a^{-1} imes a=1)。(可以用 (exgcd) 来计算)

    同样,对于 (n imes n) 的矩阵,也存在一些特殊的矩阵 (A) 存在唯一的逆元 (A^{-1}) 使得 (A imes A^{-1}=A^{-1} imes A=I_{n}),其中 (I_{n})(n) 阶的单位矩阵。

    [ I{n}= egin{bmatrix} 1&0&cdots&0\0 &1&cdots&0\vdots &vdots &ddots&vdots\0&0&cdots&1 end{bmatrix} ]

    矩阵快速幂

    传送门

    就是一个快速幂不过把之前的数变成了矩阵而已。

    构造矩阵

    讲的差不多了,讲下构造矩阵吧 (qwq)

    例题 (1)

    先定义一个 (1 imes 2) 的矩阵

    [ egin{bmatrix} fib_{n-2}&fib_{n-1} end{bmatrix} ]

    根据题意,显然,通过递推式,我们要得到一个 (1 imes 2) 的矩阵

    [ egin{bmatrix} fib_{n-1}&fib_{n} end{bmatrix} ]

    然后,因为 (fib_{n}=fib_{n-1}+fib_{n-2}),所以转换为

    [ egin{bmatrix} fib_{n-1}&fib_{n-1}+fib_{n-2} end{bmatrix} ]

    设通过乘以一个 (2 imes 2) 的矩阵 (A)来实现,即

    [ egin{bmatrix} fib_{n-1}&fib_{n} end{bmatrix} imes A= egin{bmatrix} fib_{n-1}&fib_{n-1}+fib_{n-2} end{bmatrix} ]

    根据矩阵乘法,很容易构造出这个矩阵 (A)

    [ A= egin{bmatrix} 0&1\1&1 end{bmatrix} ]

    因为矩阵满足乘法结合律,所以

    [ egin{bmatrix} fib_{1}&fib_{2} end{bmatrix} imes A^{n-1}= egin{bmatrix} fib_{n}&fib_{n+1} end{bmatrix} ]

    的第一个元素即为所求。

    例题 (2)

    跟例题1很类似,我们用同样的方法构造一个矩阵 (A)

    先定义一个 (1 imes 3) 的矩阵

    [ egin{bmatrix} fib_{n}&fib_{n-1 }&fib_{n-2} end{bmatrix} ]

    根据题意,显然,通过递推式,我们要得到一个 (1 imes 3) 的矩阵

    [ egin{bmatrix} fib_{n+1}&fib_{n}&fib_{n-1} end{bmatrix} ]

    然后,因为 (fib_{n}=fib_{n-1}+fib_{n-3}),所以转换为

    [ egin{bmatrix} fib_{n}+fib_{n-2}&fib_{n}&fib_{n-1} end{bmatrix} ]

    于是就很容易构造出这个矩阵 (A)

    [ A= egin{bmatrix} 1&1&0\0&0&1\1&0&0 end{bmatrix} ]

    所以

    [ egin{bmatrix} fib_{3}&fib_{2}&fib_{1} end{bmatrix} imes A^{n-3}= egin{bmatrix} fib_{n}&fib_{n-1}&fib_{n-2} end{bmatrix} ]

    的第一个元素即为所求。

    例题 (3)

    题目是我自己口胡的

    求数列
    (f_n=f_{n-1}+f_{n-2}+1,f_{1}=f_{2}=1)的第 (n)

    其中(1leq n leq 2e^{9})

    取模,所以不用考虑高精

    模仿先前两个样例

    先定义一个 (1 imes 3) 的矩阵

    [ egin{bmatrix} fib_{n-2}&fib_{n-1 }&1 end{bmatrix} ]

    显然,通过递推式,我们要得到一个 (1 imes 3) 的矩阵

    [ egin{bmatrix} f_{n-1}&f_{n}&1 end{bmatrix} ]

    然后,因为 (f_{n}=f_{n-1}+f_{n-2}+1),所以转换为

    [ egin{bmatrix} f_{n-1}&f_{n-1}+f_{n-2}+1&1 end{bmatrix} ]

    于是就很容易构造出这个矩阵 (A)

    [ A= egin{bmatrix} 0&1&0\1&1&0\0&1&1 end{bmatrix} ]

    所以

    [ egin{bmatrix} fib_{1}&fib_{2}&1 end{bmatrix} imes A^{n-1}= egin{bmatrix} fib_{n}&fib_{n+1}&1 end{bmatrix} ]

    的第一个元素即为所求。

    例题4:

    也是一道口胡的题

    例题1的基础上,再加

    [ s_{n}=sum_{i=1}^nfib_{i} ]

    (s_{n}),其中 (1leq nleq 2e^{9})

    取模,所以不用考虑高精

    自己去推吧qwq

    最后答案是

    [ egin{bmatrix} fib_{1}&fib_{2}&s_{1} end{bmatrix} imes A^{n-1}= egin{bmatrix} fib_{n}&fib_{n+1}&s_{n} end{bmatrix} ]

    然后

    [ A= egin{bmatrix} 0 &1& 0\ 1 &1& 1\ 0 &0 &1 end{bmatrix} ]

    最后,给出个结论,如果有 (f_n=p imes f_{n-1}+q imes f_{n-2}+r imes n+s),那么

    [A= egin{bmatrix} 0& q &0& 0 &0\ 1 & p &1 & 0 &0\ 0 &0 &1 &0 &0\ 0 &r & 0& 1 & 0\ 0 &s& 0 &1& 1\ end{bmatrix} ]

    补充:然后就能水道题了

  • 相关阅读:
    团队展示
    第二次结对编程作业
    第12组 团队展示
    第一次结对编程作业
    第一次个人编程作业
    软工第一次作业
    第十章 创建计算字段
    第九章 用正则表达式进行搜索
    第八章 用通配符进行过滤
    第七章 数据过滤
  • 原文地址:https://www.cnblogs.com/F-T-Y/p/Study-Matrix.html
Copyright © 2011-2022 走看看