Yurchiu's Blog

Matrix

Yurchiu 2022-02-15, 23:24:29 1.4k 隐藏左右两栏 展示左右两栏

在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵。这一概念由 19 世纪英国数学家凯利首先提出。

mnmn 个数 aija_{ij} 排成的 mmnn 列的数表称为 mmnn 列的矩阵。

A=[a11a12a13a1na21a22a23a2na31a32a33a3nam1am2am3amn]A= \begin{bmatrix} a_{11} & a_{12} & a_{13} & \cdots & a_{1n}\\\\ a_{21} & a_{22} & a_{23} & \cdots & a_{2n}\\\\ a_{31} & a_{32} & a_{33} & \cdots & a_{3n}\\\\ \vdots & \vdots & \vdots & \ddots & \vdots\\\\ a_{m1} & a_{m2} & a_{m3} & \cdots & a_{mn} \end{bmatrix}

LaTeX\LaTeX

A=
\begin{bmatrix}
a_{11} & a_{12} & a_{13} & \cdots & a_{1n}\\\\
a_{21} & a_{22} & a_{23} & \cdots & a_{2n}\\\\
a_{31} & a_{32} & a_{33} & \cdots & a_{3n}\\\\
\vdots & \vdots & \vdots & \ddots & \vdots\\\\
a_{m1} & a_{m2} & a_{m3} & \cdots & a_{mn}
\end{bmatrix}

前置知识

aija_{ij} 位于 AAiijj 列,称为 AA(i,j)(i,j) 元,这个矩阵可记为 (ai,j)(a_{i,j})(a_i,j)_mn(a\_{i,j})\_{mn},矩阵 AA,矩阵 AmnA_{mn}。行列数都是 nn 的矩阵称为 nn 阶矩阵。

矩阵的大小由行数和列数确定。mmnn 是矩阵的维度。只有一行的矩阵成为行向量,只有一列的矩阵称为列向量,行和列相同的矩阵称为方阵。

矩阵运算

矩阵的加减法

两个行列数均相同的矩阵 A,BA,B 可通过加减产生矩阵 CC

C=A+bcij=aij+bijC=A+b \quad\quad\quad\quad c_{ij}=a_{ij}+b_{ij}

C=Abcij=aijbijC=A-b \quad\quad\quad\quad c_{ij}=a_{ij}-b_{ij}

矩阵的数乘

数字 λ\lambda 和矩阵 AA 相乘得到矩阵 BB

B=λAbij=λaijB=\lambda A \quad\quad\quad\quad b_{ij}=\lambda a_{ij}

对于任意的实数 λ,μ\lambda,\mu 和矩阵 A,BA,BA,BA,B 行列数均相同),有:

λ(μA)=μ(λA)λ(μA)=(λμ)A(λ+μ)A=λA+μAλ(A+B)=λA+λB\begin{aligned} \lambda(\mu A)&=\mu(\lambda A)\\\\ \lambda(\mu A)&=(\lambda\mu)A \\\\ (\lambda+\mu)A&=\lambda A+\mu A\\\\ \lambda(A+B)&=\lambda A+\lambda B\\\\ \end{aligned}

矩阵的加减法和数乘运算称为矩阵的线性运算。

矩阵乘法

矩阵 AnmA_{nm}BmpB_{mp} 可进行矩阵乘法。得到的矩阵 Cnp=AnmBmpC_{np}=A_{nm}B_{mp},其中:

cij=k=1maikbkjc_{ij}=\sum_{k=1}^ma_{ik}b_{kj}

举个例子:

[102131]×[312110]=[(1×3+0×2+2×1)(1×1+0×1+2×0)(1×3+3×2+1×1)(1×1+3×1+1×0)]=[5142]\begin{aligned} &\begin{bmatrix} 1 & 0 & 2\\\\ -1 & 3 & 1 \end{bmatrix} \times \begin{bmatrix} 3 & 1\\\\ 2 & 1\\\\ 1 & 0 \end{bmatrix}\\\\\\\\ =& \begin{bmatrix} (1\times3+0\times2+2\times1) & (1\times1+0\times1+2\times0)\\\\ (-1\times3+3\times2+1\times1) & (-1\times1+3\times1+1\times0) \end{bmatrix}\\\\\\\\ =& \begin{bmatrix} 5 & 1\\\\ 4 & 2 \end{bmatrix} \end{aligned}

矩阵乘法满足以下运算律:

  • 结合律:(AB)C=A(BC)(AB)C=A(BC)
  • 左分配律:(A+B)C=AC+BC(A+B)C=AC+BC
  • 右分配律:C(A+B)=CA+CBC(A+B)=CA+CB

显然,矩阵乘法不满足交换律

转置

AA 的转置 ATA^T 通过反转 AA 的行和列得到。

A=[123456]AT=[142536]\begin{aligned} A&=\begin{bmatrix} 1 & 2 & 3\\\\ 4 & 5 & 6 \end{bmatrix}\\\\\\\\ A^T&= \begin{bmatrix} 1 & 4\\\\ 2 & 5\\\\ 3 & 6 \end{bmatrix} \end{aligned}

单位矩阵

单位矩阵 EE 的对角线都是 11,其他等于 00

EA=AEA=A

E=[1000010000100001]E= \begin{bmatrix} 1 & 0 & 0 & \cdots & 0\\\\ 0 & 1 & 0 & \cdots & 0\\\\ 0 & 0 & 1 & \cdots & 0\\\\ \vdots & \vdots & \vdots & \ddots & \vdots\\\\ 0 & 0 & 0 & \cdots & 1 \end{bmatrix}

矩阵快速幂

P3390 【模板】矩阵快速幂

运用了矩阵乘法的结合律。

模板

typedef long long ll;
const ll N=5,mod=1000000007;
struct Matrix //方阵 
{
	ll M[N][N],n;
	Matrix(ll type,ll s)//若 type 不为 0,构造一个单位矩阵
	{
		memset(M,0,sizeof(M)); n=s;
		if(type) for(ll i=1;i<=N-1;i++) M[i][i]=1;
	}
	Matrix(ll s,const ll N[])//根据数组 N 进行初始化
	{
		memset(M,0,sizeof(M)); n=s;
		for(ll i=1;i<=n;i++)
			for(ll j=1;j<=n;j++)
				M[i][j]=N[i*n-n+j-1];
	}
	void print()
	{
		for(ll i=1;i<=n;i++)
		{
			for(ll j=1;j<=n;j++)
				printf("%lld ",M[i][j]);
			printf("\n");
		}
		printf("\n");
		return;
	}
	Matrix operator*(const Matrix &N)//矩阵乘法
	{
		Matrix ret(0,n);
		for(ll i=1;i<=n;i++)
			for(ll k=1;k<=n;k++)
				for(ll j=1;j<=n;j++)//j,k 互换可能会更快
					ret.M[i][j]=(ret.M[i][j]+M[i][k]*N.M[k][j]%mod)%mod;
		return ret;
	}
	Matrix operator^(ll k)//矩阵快速幂
	{
		Matrix ret(1,n),tmp=*this;
		while(k)
		{
			if(k%2) ret=ret*tmp;
			tmp=tmp*tmp; k/=2;
		}
		return ret;
	}
	void operator^=(ll k) {*this=*this^k;}
};




本文作者:Yurchiu

本文链接:https://yz-hs.github.io/2bd2b1fd788c/

版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。


By Yurchiu.
其他物件杂物收纳
Hitokoto

Yurchiu 说,除了她以外的人都很强!嘤嘤嘤~~
博客信息
文章数目
158
最近更新
08-21
本站字数
350.6k
文章目录