前情提示:本蒟蒻第一次写博客类文章,\(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]
\]
其它算法先咕了~下一篇继续
矩阵の基本概念
原文:https://www.cnblogs.com/BFcnblogs/p/15008700.html