矩阵の基本概念

· · 个人记录

前情提示:本蒟蒻第一次写博客类文章,dalao勿喷……

首先,矩阵是个二位数表

形如

\left[ \begin{matrix} a_{1,1}&a_{1,2}&\cdots &a_{1,n}\\ a_{2,1}&a_{2,2}&\cdots &a_{2,n}\\ \\ \vdots &\vdots &\ddots & \vdots\\ a_{m,1}&a_{m,2}&\cdots &a_{m,n}\\ \end{matrix} \right]

m=n时,我们称它为n阶矩阵

左上到右下的对角线,为主对角线

同理,右上到左下的对角线,为副对角线

(以上两个概念只应用于n阶矩阵)

代码实现

struct matrix{
    int m,n;//行数列数
    int a[N][N];//本体
    inline void init(int d=0,int b=0){//初始化
        m=d;
        n=b;
        memset(a,0,sizeof(a));
    }
};

矩阵加减法:对应元素相减(两矩阵行数列数当然要保持一致)

A= \left[ \begin{matrix} a_{1,1}&a_{1,2}&\cdots &a_{1,n}\\ a_{2,1}&a_{2,2}&\cdots &a_{2,n}\\ \\ \vdots &\vdots &\ddots & \vdots\\ a_{m,1}&a_{m,2}&\cdots &a_{m,n}\\ \end{matrix} \right] B= \left[ \begin{matrix} b_{1,1}&b_{1,2}&\cdots &b_{1,n}\\ b_{2,1}&b_{2,2}&\cdots &b_{2,n}\\ \\ \vdots &\vdots &\ddots & \vdots\\ b_{m,1}&b_{m,2}&\cdots &b_{m,n}\\ \end{matrix} \right] A\pm B= \left[ \begin{matrix} a_{1,1}\pm b_{1,1}&a_{1,2}\pm b_{1,2}&\cdots &a_{1,n}\pm b_{1,n}\\ a_{2,1}\pm b_{2,1}&a_{2,2}\pm b_{2,2}&\cdots &a_{2,n}\pm b_{2,n}\\ \\ \vdots &\vdots &\ddots & \vdots\\ a_{m,1}\pm b_{m,1}&a_{m,1}\pm b_{m,2}&\cdots &a_{m,n}\pm b_{m,n}\\ \end{matrix} \right]

代码实现

inline matrix operator + (matrix B){
    matrix res;
    res.init(m,n);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            res.a[i][j]=a[i][j]+B.a[i][j];
    return res;
}

inline matrix operator - (matrix B){
    matrix res;
    res.init(m,n);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            res.a[i][j]=a[i][j]-B.a[i][j];
    return res;
}

矩阵数乘:所有元素乘以常数c

c*A= \left[ \begin{matrix} c*a_{1,1}&c*a_{1,2}&\cdots &c*a_{1,n}\\ c*a_{2,1}&c*a_{2,2}&\cdots &c*a_{2,n}\\ \\ \vdots &\vdots &\ddots & \vdots\\ c*a_{m,1}&c*a_{m,2}&\cdots &c*a_{m,n}\\ \end{matrix} \right]

代码实现:

inline matrix operator * (matrix B){
    matrix res;
    res.init(m,n);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            res.a[i][j]=c*a[i][j];
    return res;

矩阵乘法

前提:A的行数等于B的列数

(本蒟语文不好,直接看图和公式吧)

AB= \left[ \begin{matrix} a_{1,1}&\cdots &a_{1,s}\\ \vdots & & \vdots\\ a_{i,1}&\cdots &a_{i,s}\\ \vdots & & \vdots\\ a_{m,1}&\cdots &a_{m,s}\\ \end{matrix} \right] \left[ \begin{matrix} b_{1,1}&\cdots &b_{1,j}&\cdots &b_{1,n}\\ \vdots & &\vdots && \vdots\\ b_{s,1}&\cdots &b_{s,j}&\cdots &b_{s,n}\\ \end{matrix} \right] = \left[ \begin{matrix} \ddots &&\ddots\\ &c_{i,j}\\ \ddots &&\ddots\\ \end{matrix} \right] =C A(m\times s)*B(s\times n)=C(m\times n)

易得

C_{i,j}=\sum_{k=1}^sA[i][k]*B[k][j]

例如:

\left[ \begin{matrix} 1&2&3\\ 2&3&4\\ 1&3&5\\ \end{matrix} \right] \times \left[ \begin{matrix} 1&3&3\\ 2&4&5\\ 1&5&2\\ \end{matrix} \right] = \left[ \begin{matrix} 8&26&19\\ 12&38&29\\ 12&40&28\\ \end{matrix} \right]

代码实现

inline matrix operator * (matrix B){
    matrix res;
    res.init(m,n);
    for(int i=1;i<=m;i++)
        for(int j=1;j<=B.m;j++)
                for(int k=1;k<=n;k++)
                  res.a[i][j]+=a[i][k]*B.a[k][j];
    return res;

同时,一行 \times 一列 = 一个数,一列 \times 一行 = 一个表

例如:

\left[ \begin{matrix} 1&2&3\\ \end{matrix} \right] \left[ \begin{matrix} 1\\ 2\\ 3\\ \end{matrix} \right] =14 \left[ \begin{matrix} 1\\ 2\\ 3\\ \end{matrix} \right] \left[ \begin{matrix} 1&2&3\\ \end{matrix} \right] = \left[ \begin{matrix} 1&2&3\\ 2&4&6\\ 3&6&9\\ \end{matrix} \right]

那么我们可以看出:矩阵乘法没有交换律

但是,矩阵乘法有结合律

A\times B\times C=(A\times B)\times C=A\times( B\times C)

不过若AB=BA,则称AB可交换

矩阵的幂

其实和普通的幂运算差不多 并不是

~~$I A^k IOI$~~ ( $doge

A^0=I

(AB)^k\neq A^kB^k

知识补充: 单位阵I_n , n阶矩。主对角线为1,其余为0.

I_n= \left[ \begin{matrix} 1&0&0&\dots&0\\ 0&1&0&\dots&0\\ 0&0&1&\dots&0\\ \vdots &\vdots &\vdots&\ddots & 0\\ 0&0&0&0&1\\ \end{matrix} \right]

其它算法先咕了~下一篇继续