Matrix 矩阵
在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 [1] ,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。
定义
由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵。记作:
A=∣∣a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn∣∣
这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称为矩阵A的(i,j)元,以数 aij为(i,j)元的矩阵可记为(aij)或(aij)m × n,m×n矩阵A也记作Amn。
元素是实数的矩阵称为实矩阵,元素是复数的矩阵称为复矩阵。而行数与列数都等于n的矩阵称为n阶矩阵或n阶方阵.
行矩阵(行向量)
只有一行的矩阵
A=[a1a2⋯an]
列矩阵(列向量)
只有一列的矩阵
B=⎣⎡b1b2⋮bm⎦⎤
同型矩阵
若有矩阵A和 B,矩阵A的行数和列数与矩阵B相同,则矩阵A、B是同型矩阵
单位矩阵
在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,这种矩阵被称为单位矩阵.它是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。除此以外全都为0。如下图所示是一个3阶的单位矩阵。
⎣⎡100010001⎦⎤
基本运算
矩阵运算在科学计算中非常重要 [8] ,而矩阵的基本运算包括矩阵的加法,减法,数乘,转置,共轭和共轭转置。
加法
注意: 只有同型矩阵之间才可以进行加法
[124020]+[070550]=[1+02+74+00+52+50+0]=[194570]通项公式:∣∣a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn∣∣+∣∣b11b21⋮bm1b12b22⋮bm2⋯⋯⋱⋯b1nb2n⋮bmn∣∣=∣∣a11+b11a21+b21⋮am1+bm1a12+b12a22+b22⋮am2+bm2⋯⋯⋱⋯a1na2n+b2n⋮amn+bmn∣∣
矩阵的加法满足下列运算律(A,B,C都是同型矩阵):
A+B=B+A(A+B)+C=A+(B+C)
减法
同加法
数乘
举例子:
2∗[148−2−35]=[2∗12∗42∗82∗(−2)2∗(−3)2∗5]=[2816−4−610]通项公式:n∗∣∣a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn∣∣=∣∣n∗a11n∗a21⋮n∗am1n∗a12n∗a22⋮n∗am2⋯⋯⋱⋯n∗a1nn∗a2n⋮n∗amn∣∣
矩阵的数乘满足一下运算律:
λ(υA)=υ(λA)λ(υA)=(υλ)A(λ+υ)A=υA+λAλ(A+B)=λA+λB
矩阵的加减法和矩阵的数乘合成矩阵的线性运算
转置
把矩阵A的行和列互相交换所产生的矩阵称为A的转置矩阵(AT) ,这一过程称为矩阵的转置
eg:
[204−238]=⎣⎡2430−28⎦⎤矩阵的转置满足一下运算律:(AT)T=A(λA)T=λAT(AB)T=ATBT
共轭
共轭在数学、物理、化学、地理等学科中都有出现。 本意:两头牛背上的架子称为轭,轭使两头牛同步行走。共轭即为按一定的规律相配的一对。通俗点说就是孪生。
共轭复数
两个实部相等,虚部互为相反数的复数互为共轭复数(conjugate complex number)。(当虚部不等于0时也叫共轭虚数)复数z的共轭复数记作Z,有时也可表示为Z∗。根据定义,若Z=a+ib(a,b∈R),则Z =a-ib(a,b∈R)。在复平面上,共轭复数所对应的点关于实轴对称。
矩阵的共轭定义为(A)i,j=Ai,j.
一个2×2复数矩阵的共轭(实部不变,虚部取负)如下所示:
A=[3+i2−2i5i]A的共轭为A=[3−i2+2i5i]
共轭转置
把矩阵转置后,再把每一个数换成它的共轭复数。
矩阵的共轭转置定义为:
(A∗)i,j=Aj,i亦可以写为A∗=(A)T=AT=AH
一个2×2复数矩阵的共轭转置如下所示:
A=[3+i2−2i5i]A的共轭为A=[3−i52+2i−i]
乘法
两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵,C=(cij)它的一个元素:
ci,j=ai,1b1,j+ai,2b2,j+...+ai,nbn,j=r=1∑nai,rbr,j
此乘积可记为:C=AB
例如:
[1−10321]∗⎣⎡321110⎦⎤=[1∗3+0∗2+2∗1−1∗3+3∗2+1∗11∗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∗B=B∗A)
如何在代码中实现矩阵的乘法呢?
我们可以把矩阵当成二维数组来处理。那么我们得到矩阵相乘的代码为
type TwoDArr = Array<Array<number>>;
function multi(a: TwoDArr, b: TwoDArr) {
const res: TwoDArr = [];
console.log('b===>',b);
const row1 = a.length,
row2 = b.length,
col1 = a[0].length,
col2 = b[0].length;
if (col1 !== row2) {
return new Error('not a right matrix to multiply');
}
for (let i = 0; i < row1; i++) {
res[i] = new Array(col2).fill(0);
}
for (let i = 0; i < row1; i++) {
for (let j = 0; j < col2; j++) {
for (let k = 0; k < col1; k++) {
res[i][j] += a[i][k] * b[k][j];
console.log(res[i][j], i, j, k);
}
}
}
return res;
}
矩阵快速幂
根据整数快速幂的原理,我们直接带入到矩阵的计算。
需要注意的是单位矩阵的构建。
function mat_pow(a: TwoDArr, n: number) {
const len = a.length;
let res: TwoDArr = [];
for (let i = 0; i < len; i++) {
res[i] = new Array(len).fill(0);
res[i][i] = 1;
}
console.log('res ===>', res);
while (n) {
if (n & 1) res = multi(res, a) as TwoDArr;
a = multi(a, a) as TwoDArr;
n >>= 1;
}
return res;
}
索引
基本数学公式语法(of MathJax)
LaTeX百度百科
LaTeX
MathJax