矩阵の基本概念
BF_AlphaShoot
·
·
个人记录
前情提示:本蒟蒻第一次写博客类文章,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可交换
矩阵的幂:
其实和普通的幂运算差不多 并不是
~~$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]
其它算法先咕了~下一篇继续