矩阵

矩阵

矩阵的概念

矩阵运算是数学、线性代数、机器学习等领域中的一个重要概念。

1.1.1. 基本概念

矩阵是一种数学结构,用二维表格(数组)表示多个数字的集合。

2.2.2. 单位矩阵

5×55 \times 55×5 的矩阵为例

[1000001000001000001000001]\begin{bmatrix} 1 & 0 & 0 & 0 & 0\\ 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 1 & 0 & 0\\ 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 0 & 1 \end{bmatrix}1000001000001000001000001

主对角线上是 111,其他都是 000,在矩阵乘法的作用就是相当于普通乘法中的 111

3.3.3. 矩阵的加法和乘法

矩阵的加法和乘法是矩阵运算的两个基本操作,与标量的加法和乘法类似。

4.4.4. 矩阵的转置

矩阵的转置是值将矩阵的行与列互换的过程。

5.5.5. 矩阵的逆

如果一个矩阵 AAA 和另一个矩阵 BBB 满足 AB=BA=IAB=BA=IAB=BA=I,其中 III 是单位矩阵(见上),那么矩阵 BBB 就是矩阵 AAA 的逆。

6.6.6. 线性方程组

线性方程组是一组形如 Ax=BAx=BAx=B 的线性方程,其中 AAA 是矩阵,
xxx 是未知数向量,BBB 是常数向量。

矩阵的表示

矩阵可以用二维数组表示,每个元素都是一个数。

一个 M×NM \times NM×NMMMNNN 列)的矩阵 AAA 可以表示为:

[a1,1⋯a1,N⋮⋱⋮aM,1⋯aM,N]\begin{bmatrix} a_{1, 1} & \cdots & a_{1, N} \\ \vdots & \ddots & \vdots \\ a_{M, 1} & \cdots & a_{M, N} \end{bmatrix}a1,1aM,1a1,NaM,N
这种表示法中,矩阵 AAA 共有 MMM 行,每行都有 NNN 个元素。

下面是一个 2×22 \times 22×2 的矩阵样例:

A=[3521]A = \begin{bmatrix} 3 & 5\\ 2 & 1 \end{bmatrix}A=[3251]

矩阵运算

1.1.1. 矩阵的加法

矩阵的加法是将两个矩阵的对应元素相加所得到的一个新的矩阵。它要求两个矩阵的行数和列数相同。

例子(两个矩阵 AAABBB):

A=[357210]A = \begin{bmatrix} 3 & 5 & 7\\ 2 & 1 & 0 \end{bmatrix}A=[325170]

B=[134751]B = \begin{bmatrix} 1 & 3 & 4\\ 7 & 5 & 1 \end{bmatrix}B=[173541]

C=A+B=[4(3+1)8(5+3)11(7+4)9(2+7)6(1+5)1(0+1)]C = A + B = \begin{bmatrix} 4(3+1) & 8(5+3) & 11(7+4)\\ 9(2+7) & 6(1+5) & 1(0+1) \end{bmatrix}C=A+B=[4(3+1)9(2+7)8(5+3)6(1+5)11(7+4)1(0+1)]

矩阵加法满足的定律

交换律:A+B=B+AA+B=B+AA+B=B+A

结合律:(A+B)+C=A+(B+C)(A+B)+C=A+(B+C)(A+B)+C=A+(B+C)

矩阵加法代码
typedef long long LL;

class JvZhen {
public:
	LL Arr[105][105];
	LL Line, Col;

	JvZhen operator+(JvZhen X) const {
		JvZhen New { };
		for (int i = 0; i < Line; i++) {
			for (int j = 0; j < Col; j++) {
				New.Arr[i][j] = Arr[i][j] + X.Arr[i][j];
			}
		}
		New.Line = Line;
		New.Col = Col;
		return New;
	}
};

2.2.2. 数乘矩阵

数乘矩阵是指将矩阵中的每个元素都乘以一个数,也就是将矩阵的每个元素都进行一次标量乘法运算。具体来说,对于矩阵 AAA 和数 XXX,得到的新矩阵 BBB 的每个元素都是 AAA 的每个元素与 XXX 的乘积,即:Bi,j=X×Ai,jB_{i, j} = X \times A_{i, j}Bi,j=X×Ai,j

代码
typedef long long LL;

class JvZhen {
public:
	LL Arr[105][105];
	LL Line, Col;

	JvZhen operator*(int X) const {
		JvZhen New { };
		for (int i = 0; i < Line; i++) {
			for (int j = 0; j < Col; j++) {
				New.Arr[i][j] = Arr[i][j] * X;
			}
		}
		New.Line = Line;
		New.Col = Col;
		return New;
	}
};

3.3.3. 矩阵乘法

矩阵的乘法是一种二元运算,它将两个矩阵相乘并生成一个新的矩阵。它要求第一个矩阵的列数和第二个矩阵的行数相同。

矩阵乘法的计算主要分为以下三步

1.1.1. 确定矩阵 AAA 和矩阵 BBB 的大小,以确保它们能够相乘。矩阵 AAA 必须具有与矩阵 BBB 的行数相同的列数,才能进行乘法运算。

2.2.2. 计算结果矩阵 CCC 的每个元素。对于 CCC 矩阵中的每个元素,需要将 AAA 矩阵的每一行和 BBB 矩阵的每一列相乘,并将所有结果相加。

3.3.3. 构建结果矩阵 CCC。把每个元素的结果形成一个新的矩阵 CCC

公式

A=[a1,1a1,2a1,3a2,1a2,2a2,3]A = \begin{bmatrix} a_{1, 1} & a_{1, 2} & a_{1, 3}\\ a_{2, 1} & a_{2, 2} & a_{2, 3} \end{bmatrix}A=[a1,1a2,1a1,2a2,2a1,3a2,3]

B=[b1,1b1,2b2,1b2,2b3,1b3,2]B = \begin{bmatrix} b_{1, 1} & b_{1, 2}\\ b_{2, 1} & b_{2, 2}\\ b_{3, 1} & b_{3, 2} \end{bmatrix}B=b1,1b2,1b3,1b1,2b2,2b3,2

C=[a1,1b1,1+a1,2b2,1+a1,3b3,1a1,1b1,2+a1,2b2,2+a1,3b3,1a2,1b1,1+a2,2b2,1+a2,3b3,1a2,1b1,2+a2,2b2,2+a2,3b3,2]C = \begin{bmatrix} a_{1, 1}b_{1, 1} + a_{1, 2}b_{2, 1} + a_{1, 3}b_{3, 1} & a_{1, 1}b_{1, 2} + a_{1, 2}b_{2, 2} + a_{1, 3}b_{3,1}\\ a_{2, 1}b_{1, 1} + a_{2, 2}b_{2, 1} + a_{2, 3}b_{3, 1} & a_{2, 1}b_{1, 2} + a_{2, 2}b_{2, 2} + a_{2, 3}b_{3, 2} \end{bmatrix}C=[a1,1b1,1+a1,2b2,1+a1,3b3,1a2,1b1,1+a2,2b2,1+a2,3b3,1a1,1b1,2+a1,2b2,2+a1,3b3,1a2,1b1,2+a2,2b2,2+a2,3b3,2]

例子

A=[351210]A = \begin{bmatrix} 3 & 5 & 1\\ 2 & 1 & 0 \end{bmatrix}A=[325110]

B=[21−3347]B = \begin{bmatrix} 2 & 1\\ -3 & 3\\ 4 & 7 \end{bmatrix}B=234137

C=[−5(3∗2+5∗−3+1∗4)25(3∗1+5∗3+1∗7)1(2∗2+1∗−3+0∗4)5(2∗1+1∗3+0∗7)]C = \begin{bmatrix} -5(3*2+5*-3+1*4) & 25(3*1+5*3+1*7)\\ 1(2*2+1*-3+0*4) & 5(2*1+1*3+0*7) \end{bmatrix}C=[5(32+53+14)1(22+13+04)25(31+53+17)5(21+13+07)]

矩阵乘法满足的定律

结合律:(A+B)×C=A×(B+C)(A+B)\times C=A \times (B+C)(A+B)×C=A×(B+C)
分配律:A×(B+C)=A×B+A×CA \times (B+C) = A \times B + A \times CA×(B+C)=A×B+A×C

代码
typedef long long LL;
class JvZhen {
public:
	LL Arr[105][105];
	LL Line, Col;

	JvZhen operator+(JvZhen X) const {
		LL NewLine = Line, NewCol = Col;
		JvZhen New { };
		for (LL i = 0; i < Line; i++) {
			for (LL j = 0; j < X.Col; j++) {
				LL Current = 0;
				for (LL k = 0; k < X.Line; k++) {
					Current += Arr[i][k] * X.Arr[k][j];
					Current %= 1000000007;
				}
				New.Arr[i][j] = Current;
			}
		}
		New.Line = NewLine;
		New.Col = NewCol;
		return New;
	}
};

4.4.4. 矩阵的幂

矩阵的幂是指对矩阵进行多次相乘,得到一个新的矩阵的运算。在数学中,矩阵幂可以用来描述一个系统或者过程的时间演变。对于一个 NNN 阶方阵 AAA,其幂 AkA^kAk 就是对 AAA 进行 kkk 次相乘得到的矩阵,其中 kkk是一个整数。在编程中,可以使用快速幂思想来实现矩阵的幂的快速计算。

代码

typedef long long LL;

class JvZhen {
public:
	LL Arr[105][105];
	LL Line, Col;

	JvZhen operator*(JvZhen X) const {
		LL NewLine = Line, NewCol = X.Col;
		JvZhen New { };
		for (LL i = 0; i < Line; i++) {
			for (LL j = 0; j < X.Col; j++) {
				LL Current = 0;
				for (LL k = 0; k < X.Line; k++) {
					Current += Arr[i][k] * X.Arr[k][j];
					Current %= 1000000007;
				}
				New.Arr[i][j] = Current;
			}
		}
		New.Line = NewLine;
		New.Col = NewCol;
		return New;
	}

	JvZhen KSM(LL M) {
		if (M == 0) return JvZhen { };
		if (M == 1) return *this;
		JvZhen Half = KSM(M / 2);
		if (M % 2 == 0) {
			return Half * Half;
		} else {
			return Half * Half * N;
		}
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值