在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵。这一概念由 19 世纪英国数学家凯利首先提出。
由 mn 个数 aij 排成的 m 行 n 列的数表称为 m 行 n 列的矩阵。
A=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a11a21a31⋮am1a12a22a32⋮am2a13a23a33⋮am3⋯⋯⋯⋱⋯a1na2na3n⋮amn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
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}
前置知识
aij 位于 A 的 i 行 j 列,称为 A 的 (i,j) 元,这个矩阵可记为 (ai,j),(a_i,j)_mn,矩阵 A,矩阵 Amn。行列数都是 n 的矩阵称为 n 阶矩阵。
矩阵的大小由行数和列数确定。m 和 n 是矩阵的维度。只有一行的矩阵成为行向量,只有一列的矩阵称为列向量,行和列相同的矩阵称为方阵。
矩阵运算
矩阵的加减法
两个行列数均相同的矩阵 A,B 可通过加减产生矩阵 C。
C=A+bcij=aij+bij
C=A−bcij=aij−bij
矩阵的数乘
数字 λ 和矩阵 A 相乘得到矩阵 B。
B=λAbij=λaij
对于任意的实数 λ,μ 和矩阵 A,B(A,B 行列数均相同),有:
λ(μA)λ(μA)(λ+μ)Aλ(A+B)=μ(λA)=(λμ)A=λA+μA=λA+λB
矩阵的加减法和数乘运算称为矩阵的线性运算。
矩阵乘法
矩阵 Anm 和 Bmp 可进行矩阵乘法。得到的矩阵 Cnp=AnmBmp,其中:
cij=k=1∑maikbkj
举个例子:
==⎣⎢⎡1−10321⎦⎥⎤×⎣⎢⎢⎢⎢⎢⎡321110⎦⎥⎥⎥⎥⎥⎤⎣⎢⎡(1×3+0×2+2×1)(−1×3+3×2+1×1)(1×1+0×1+2×0)(−1×1+3×1+1×0)⎦⎥⎤⎣⎢⎡5412⎦⎥⎤
矩阵乘法满足以下运算律:
- 结合律:(AB)C=A(BC);
- 左分配律:(A+B)C=AC+BC;
- 右分配律:C(A+B)=CA+CB。
显然,矩阵乘法不满足交换律。
转置
A 的转置 AT 通过反转 A 的行和列得到。
AAT=⎣⎢⎡142536⎦⎥⎤=⎣⎢⎢⎢⎢⎢⎡123456⎦⎥⎥⎥⎥⎥⎤
单位矩阵
单位矩阵 E 的对角线都是 1,其他等于 0。
EA=A
E=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡100⋮0010⋮0001⋮0⋯⋯⋯⋱⋯000⋮1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
矩阵快速幂
P3390 【模板】矩阵快速幂。
运用了矩阵乘法的结合律。
模板
typedef long long ll;
const ll N=5,mod=1000000007;
struct Matrix
{
ll M[N][N],n;
Matrix(ll type,ll s)
{
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[])
{
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++)
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/
版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。
最后更新:2023-08-21, 23:18:20