矩阵の基本概念

前情提示:本蒟蒻第一次写博客类文章,\(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\),则称\(A\)\(B\)可交换

矩阵的幂

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

\(A\)\(k\)次幂就是\(k\)\(A\)相乘

\(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] \]

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

矩阵の基本概念

上一篇:Phrase - 4


下一篇:[题解] ABC172E NEQ