矩阵

矩阵

矩阵的概念

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

1. 1. 1. 基本概念

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

2. 2. 2. 单位矩阵

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

[ 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 ] \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

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

3. 3. 3. 矩阵的加法和乘法

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

4. 4. 4. 矩阵的转置

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

5. 5. 5. 矩阵的逆

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

6. 6. 6. 线性方程组

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

矩阵的表示

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

一个 M × N M \times N M×N M M M N N N 列)的矩阵 A A A 可以表示为:

[ a 1 , 1 ⋯ a 1 , N ⋮ ⋱ ⋮ a M , 1 ⋯ a M , 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
这种表示法中,矩阵 A A A 共有 M M M 行,每行都有 N N N 个元素。

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

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

矩阵运算

1. 1. 1. 矩阵的加法

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

例子(两个矩阵 A A A B B B):

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

B = [ 1 3 4 7 5 1 ] 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 + A A+B=B+A A+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. 数乘矩阵

数乘矩阵是指将矩阵中的每个元素都乘以一个数,也就是将矩阵的每个元素都进行一次标量乘法运算。具体来说,对于矩阵 A A A 和数 X X X,得到的新矩阵 B B B 的每个元素都是 A A A 的每个元素与 X X X 的乘积,即: B i , j = X × A i , j B_{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. 确定矩阵 A A A 和矩阵 B B B 的大小,以确保它们能够相乘。矩阵 A A A 必须具有与矩阵 B B B 的行数相同的列数,才能进行乘法运算。

2. 2. 2. 计算结果矩阵 C C C 的每个元素。对于 C C C 矩阵中的每个元素,需要将 A A A 矩阵的每一行和 B B B 矩阵的每一列相乘,并将所有结果相加。

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

公式

A = [ a 1 , 1 a 1 , 2 a 1 , 3 a 2 , 1 a 2 , 2 a 2 , 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 = [ b 1 , 1 b 1 , 2 b 2 , 1 b 2 , 2 b 3 , 1 b 3 , 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 = [ 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 ] 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 = [ 3 5 1 2 1 0 ] A = \begin{bmatrix} 3 & 5 & 1\\ 2 & 1 & 0 \end{bmatrix} A=[325110]

B = [ 2 1 − 3 3 4 7 ] 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 × C A \times (B+C) = A \times B + A \times C A×(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. 矩阵的幂

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

代码

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、付费专栏及课程。

余额充值