矩阵与高斯消元:数学算法在计算机领域的应用

发布于:2025-08-06 ⋅ 阅读:(17) ⋅ 点赞:(0)

一、概述和基本概念

矩阵,类似于在 C++ 中我们看到的二维数组。它有两个维度,。下面是一个典型的矩阵:
M=[12342345445610111213] M= \begin{bmatrix} 1 & 2 & 3 & 4 \\ 2 & 3 & 4 & 5 \\ 4 & 4 & 5 & 6 \\ 10 & 11 & 12 & 13 \end{bmatrix} M= 12410234113451245613
我们可以对矩阵进行一些变换,前后矩阵不变,从而实现等量交换。

高斯消元,是解决 NNN 元一次方程组的高效方法。假设我们有如下的一个方程组:
{a1,1x1+a1,2x2+a1,3x3+⋯+a1,nxn=c1a2,1x1+a2,2x2+a2,3x3+⋯+a2,nxn=c2…am,1x1+am,2x2+am,3x3+⋯+am,nxn=cm \begin{cases} a_{1,1}x_1+a_{1,2}x_2+a_{1,3}x_3+\dots+a_{1,n}x_n=c_1 \\ a_{2,1}x_1+a_{2,2}x_2+a_{2,3}x_3+\dots+a_{2,n}x_n=c_2 \\ \dots\\ a_{m,1}x_1+a_{m,2}x_2+a_{m,3}x_3+\dots+a_{m,n}x_n=c_m \end{cases} a1,1x1+a1,2x2+a1,3x3++a1,nxn=c1a2,1x1+a2,2x2+a2,3x3++a2,nxn=c2am,1x1+am,2x2+am,3x3++am,nxn=cm
那么,使用 Gauss 消元可以在 O(n3)O(n^3)O(n3) 的时间复杂度内解决问题,相较于枚举每个 xxx 的朴素算法(时间复杂度为 O(kmn)O(kmn)O(kmn) ,其中 kkkxxx 的值域大小, mmm 为方程组个数) ,时间复杂度得到了优化(尤其是 ∣k∣≤109|k| \le 10^9k109 等值域较大的时候)。

二、矩阵的基本操作

在接下来的叙述里,我们将默认采用 NNN 个矩阵 A1,A2,…,ANA_1,A_2,\dots,A_{N}A1,A2,,AN

1. 矩阵运算

矩阵的加法:将矩阵的每个数分别相加。具体定义:设进行加法的两个矩阵分别为 A,BA,BA,B ,结果为矩阵 CCC ,则
∀1≤i,j≤n,Ci,j=Ai,j+Bi,j\forall 1 \le i,j \le n, C_{i,j}=A_{i,j}+B_{i,j}∀1i,jn,Ci,j=Ai,j+Bi,j
举例:
[345123256]+[135246357]=[3+1=44+3=75+5=101+2=32+4=63+6=92+3=55+5=106+7=13] \begin{bmatrix} 3 & 4 & 5 \\ 1 & 2 & 3 \\ 2 & 5 & 6 \\ \end{bmatrix} + \begin{bmatrix} 1 & 3 & 5 \\ 2 & 4 & 6 \\ 3 & 5 & 7 \\ \end{bmatrix}= \begin{bmatrix} 3+1=4 & 4+3=7 & 5+5=10 \\ 1+2=3 & 2+4=6 & 3+6=9 \\ 2+3=5 & 5+5=10 & 6+7=13 \\ \end{bmatrix} 312425536 + 123345567 = 3+1=41+2=32+3=54+3=72+4=65+5=105+5=103+6=96+7=13
求解的时间复杂度为 O(nm)O(nm)O(nm) ,其中 nnn 为矩阵列数, mmm 为矩阵行数。下同,不再赘述。

矩阵的乘法:这里非常有必要提一下。矩阵乘法的结果是目标值所在行的所有数分别乘以目标值所在列的所有数的和。设进行乘法的两个矩阵分别是 A(n×r),B(r×m)A(n \times r),B(r \times m)A(n×r),B(r×m) ,得到了矩阵 C(n×m)C(n \times m)C(n×m) ,则
∀1≤i,j≤n,Ci,j=∑k=1rAi,k⋅Bk,j\forall 1\le i,j\le n, C_{i,j}=\sum_{k=1}^r{A_{i,k} \cdot B_{k,j}}∀1i,jn,Ci,j=k=1rAi,kBk,j
较为简便的计算方法如下
Ci,j=∑k=1rAi,k×∑k=1rBk,jC_{i,j}=\sum_{k=1}^{r}A_{i,k}\times \sum_{k=1}^{r}B_{k,j}Ci,j=k=1rAi,k×k=1rBk,j
求解的时间复杂度为 O(n3)O(n^3)O(n3) 级别。
举例:
[345123256]×[135246357]=[72144212367210878156238] \begin{bmatrix} 3 & 4 & 5 \\ 1 & 2 & 3 \\ 2 & 5 & 6 \\ \end{bmatrix} \times \begin{bmatrix} 1 & 3 & 5 \\ 2 & 4 & 6 \\ 3 & 5 & 7 \\ \end{bmatrix}= \begin{bmatrix} 72 & 144 & 212 \\ 36 & 72 & 108 \\ 78 & 156 & 238 \end{bmatrix} 312425536 × 123345567 = 72367814472156212108238

矩阵的幂ANA^NAN 表示将同一个矩阵 AAA 连续乘以它自身 NNN 次。

根据以上定义,我们可以写出矩阵(matrix)结构体的基本内容,这里假设输入都合法:

struct Matrix
{
	int n, m;
	vector< vector<int> > matrix;
	
	Matrix(int n, int m) : n(n), m(m)
	{
		matrix.clear();
		for (int i = 0; i <= n; ++i)
		{
			vector<int> temp(m + 1);
			temp.clear();
			matrix.push_back(temp);
		}
	}
	
	Matrix(const Matrix& E) : n(E.n), m(E.m), matrix(E.matrix) { };
	
	Matrix operator+(Matrix b) const
	{
		int p = max(n, b.n);
		int q = max(m, b.m);
		Matrix c(p, q);
		for (int i = 1; i <= p; ++i)
		{
			for (int j = 1; j <= q; ++j)
			{
				c.matrix[i][j] = matrix[i][j] + b.matrix[i][j];
			}
		}
		return c;
	}
	
	Matrix operator*(Matrix b)
	{
		Matrix c(n, b.m);
		for (int i = 1; i <= n; ++i)
		{
			for (int j = 1; j <= b.m; ++j)
			{
				for (int k = 1; k <= n; ++k)
				{
				    c.matrix[i][j] += matrix[i][k] * b.matrix[k][j];
				}
			}
		}
		return c;
	}
	
	Matrix operator*(int b)
	{
		Matrix c(n, m);
		for (int i = 1; i <= n; ++i)
		{
			for (int j = 1; j <= m; ++j)
			{
                c.matrix[i][j] = matrix[i][j] * b;
			}
		}
		return c;
	}
};

2. 矩阵运算的性质

大写字母均代表矩阵,小写字母均代表数值。为方便推导,我们假设矩阵的大小均为 KaTeX parse error: Undefined control sequence: \time at position 3: n \̲t̲i̲m̲e̲

(1) 交换律:

i) A+B=B+AA+B=B+AA+B=B+A

证明:令 C=A+BC=A+BC=A+B
∀1≤i,j≤n,Ci,j=Ai,j+Bi,j\forall 1 \le i,j \le n, C_{i,j}=A_{i,j}+B_{i,j}∀1i,jn,Ci,j=Ai,j+Bi,j
⇒Ci,j=Bi,j+Ai,j\Rightarrow C_{i,j}=B_{i,j}+A_{i,j}Ci,j=Bi,j+Ai,j 。这就证明了 i

(2) 结合律:

ii) (A+B)+C=A+(B+C)(A+B)+C=A+(B+C)(A+B)+C=A+(B+C)
iii) (AB)⋅C=A⋅(BC)(AB) \cdot C=A \cdot (BC)(AB)C=A(BC)

证明:令 D=(A+B)+CD=(A+B)+CD=(A+B)+C
∀1≤i,j≤n,Di,j=(Ai,j+Bi,j)+Ci,j\forall 1 \le i,j \le n, D_{i,j}=(A_{i,j}+B_{i,j})+C_{i,j}∀1i,jn,Di,j=(Ai,j+Bi,j)+Ci,j
⇒Di,j=Ai,j+(Bi,j+Ci,j)\Rightarrow D_{i,j}=A_{i,j}+(B_{i,j}+C_{i,j})Di,j=Ai,j+(Bi,j+Ci,j) 。这就证明了 ii
D′=(AB)⋅CD'=(AB) \cdot CD=(AB)C
∀1≤i,j≤n,Di,j′=(∑k=1nAi,k⋅Bk,j)Ci,j=∑k=1n(∑d=1nAi,d⋅Bd,j)⋅Ck,j=∑k=1n(∑d=1nBi,d⋅Cd,j)⋅Ak,j=(∑k=1nBi,k⋅Ck,j)Ai,j\forall 1 \le i,j \le n, D'_{i,j}=(\displaystyle\sum_{k=1}^n{A_{i,k} \cdot B_{k,j}})C_{i,j}=\displaystyle\sum_{k=1}^n{(\displaystyle\sum_{d=1}^n{A_{i,d} \cdot B_{d,j}}) \cdot C_{k,j}}=\displaystyle\sum_{k=1}^n{(\displaystyle\sum_{d=1}^n{B_{i,d} \cdot C_{d,j}}) \cdot A_{k,j}}=(\displaystyle\sum_{k=1}^n{B_{i,k} \cdot C_{k,j}})A_{i,j}∀1i,jn,Di,j=(k=1nAi,kBk,j)Ci,j=k=1n(d=1nAi,dBd,j)Ck,j=k=1n(d=1nBi,dCd,j)Ak,j=(k=1nBi,kCk,j)Ai,j 。这就证明了 iii

重要推论:因为矩阵的乘法有结合律,所以
AN=∏i=1NA=∏i=1N2A⋅∏i=N2+1NAA^N=\prod^{N}_{i=1}A=\prod^\frac{N}{2}_{i=1}{A}\cdot \prod^N_{i=\frac{N}{2}+1}{A}AN=i=1NA=i=12NAi=2N+1NA
因此,我们可以使用快速幂进行简便计算,将矩阵幂的复杂度由 O(n4)O(n^4)O(n4) 降至 O(n3log⁡n)O(n^3\log n)O(n3logn)
所以,我们可以添加一个 Matrix 类的成员函数:

Matrix pow(int b)
{
	Matrix c(n, m);
	Matrix a(n, m);
	memcpy(a.matrix, matrix, sizeof(matrix));
	for (; b; b >>= 1)
	{
		if (b & 1)
		{
			c = c * a;
		}
		a = a * a;
	}
	return c;
}

(3) 分配率:

iv) (A+B)C=AC+BC(A+B)C=AC+BC(A+B)C=AC+BC

证明:令 D=(A+B)CD=(A+B)CD=(A+B)C
∀1≤i,j≤n,Di.j=∑i=1n[(Ai,k+Bi,k)Ck,j]=∑i=1n(Ai,k⋅Ck,j+Bi,k⋅Ck,j)=∑i=1nAi,k⋅Ck,j+∑i=1nBi,k⋅Ck,j\forall 1 \le i,j \le n, D_{i.j}=\displaystyle\sum_{i=1}^n[(A_{i,k}+B_{i,k})C_{k,j}]=\displaystyle\sum_{i=1}^n(A_{i,k}\cdot C_{k,j}+B_{i,k}\cdot C_{k,j})=\sum_{i=1}^{n}{A_{i,k}\cdot C_{k,j}}+\displaystyle\sum_{i=1}^{n}{B_{i,k} \cdot C_{k,j}}∀1i,jn,Di.j=i=1n[(Ai,k+Bi,k)Ck,j]=i=1n(Ai,kCk,j+Bi,kCk,j)=i=1nAi,kCk,j+i=1nBi,kCk,j 。这就证明了 iv

3. 特殊矩阵:单位矩阵

单位矩阵是一个正方形,记作 EEE ,其中从左上角开始到右下角结束的一条对角线上的值是 111 ,其余都是 000 。一个典型的单位矩阵如下:
E4=[1000010000100001] E_4= \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} E4= 1000010000100001
单位矩阵具有如下性质:
v) ∀ matrix A,  AE=EA=A\forall \text{ matrix }A,\space\space AE=EA=A matrix A,  AE=EA=A

证明:假设 P=AEP=AEP=AEEEE 的大小为 n×nn \times nn×n
显然,有 ∀1≤i,j≤n, Pi,j=∑k=1nAi,k⋅Ek,j\forall 1 \le i,j \le n, \space P_{i,j}=\displaystyle\sum_{k=1}^n A_{i,k} \cdot E_{k,j}∀1i,jn, Pi,j=k=1nAi,kEk,j
因为在第 jjj 行中有且仅有第 jjj 个元素非 000 ,即 Ej,j=1E_{j,j} = 1Ej,j=1 ,所以 Pi,j=(∑k=1, k≠jnAi,k⋅0)+Ai,j=Ai,jP_{i,j}=(\displaystyle\sum_{k=1,\space k\neq j}^n A_{i,k} \cdot 0)+A_{i,j}=A_{i,j}Pi,j=(k=1, k=jnAi,k0)+Ai,j=Ai,j ,所以 AE=AAE=AAE=A
由矩阵乘法的交换律,知 AE=EA=AAE=EA=AAE=EA=A 。这就证明了 v

4. 矩阵的行初等变换

(1)对换变换:交换矩阵的任意两行,矩阵不变。
(2)倍乘变换:将矩阵的某一行乘以一个常数,矩阵不变。
(3)倍加变换:在对矩阵的某一行进行倍乘变换后加到另一行的数上。
这三点将会被用在 Gauss 消元中。
实现对换变换、倍乘变换、倍加变换的例子如下:
对换变换
[345123256]  ⟹  [345256123] \begin{bmatrix} 3 & 4 & 5 \\ 1 & 2 & 3 \\ 2 & 5 & 6 \\ \end{bmatrix} \implies \begin{bmatrix} 3 & 4 & 5 \\ 2 & 5 & 6 \\ 1 & 2 & 3 \\ \end{bmatrix} 312425536 321452563
倍乘变换
[345123256]  ⟹  [34512341012] \begin{bmatrix} 3 & 4 & 5 \\ 1 & 2 & 3 \\ 2 & 5 & 6 \\ \end{bmatrix} \implies \begin{bmatrix} 3 & 4 & 5 \\ 1 & 2 & 3 \\ \bold{4} & \bold{10} & \bold{12} \\ \end{bmatrix} 312425536 31442105312
倍加变换
[345123256]  ⟹  [34512341012]  ⟹  [3455121541012] \begin{bmatrix} 3 & 4 & 5 \\ 1 & 2 & 3 \\ 2 & 5 & 6 \\ \end{bmatrix} \implies \begin{bmatrix} 3 & 4 & 5 \\ 1 & 2 & 3 \\ \bold{4} & \bold{10} & \bold{12} \\ \end{bmatrix} \implies \begin{bmatrix} 3 & 4 & 5 \\ \bold{5} & \bold{12} & \bold{15} \\ 4 & 10 & 12 \\ \end{bmatrix} 312425536 31442105312 3544121051512

三、 Gauss 消元的算法原理及过程

1. 基本定义

对于以下方程组:
{a1,1x1+a1,2x2+a1,3x3+⋯+a1,nxn=c1a2,1x1+a2,2x2+a2,3x3+⋯+a2,nxn=c2…am,1x1+am,2x2+am,3x3+⋯+am,nxn=cm \begin{cases} a_{1,1}x_1+a_{1,2}x_2+a_{1,3}x_3+\dots+a_{1,n}x_n=c_1 \\ a_{2,1}x_1+a_{2,2}x_2+a_{2,3}x_3+\dots+a_{2,n}x_n=c_2 \\ \dots\\ a_{m,1}x_1+a_{m,2}x_2+a_{m,3}x_3+\dots+a_{m,n}x_n=c_m \end{cases} a1,1x1+a1,2x2+a1,3x3++a1,nxn=c1a2,1x1+a2,2x2+a2,3x3++a2,nxn=c2am,1x1+am,2x2+am,3x3++am,nxn=cm
系数矩阵:由方程的系数 ai,1,⋯ ,ai,na_{i,1},\cdots,a_{i,n}ai,1,,ai,n 组成的矩阵,记为 MMM
增广矩阵:在系数矩阵的最右侧添加一列,为 cic_ici ,记为 M∣cM|cMc
Gauss 消元的算法过程在增广矩阵上进行。
例如,对于方程组:
{3x1+2x2=753x1+73x2=1007 \begin{cases} 3x_1 + 2x_2 = 7 \\ \frac{5}{3}x_1 + \frac{7}{3}x_2 = \frac{100}{7} \end{cases} {3x1+2x2=735x1+37x2=7100
它的系数矩阵、增广矩阵分别是:
[325373],[32753731007] \begin{bmatrix} 3 & 2 \\ \frac{5}{3} & \frac{7}{3} \\ \end{bmatrix}, \begin{bmatrix} 3 & 2 & 7 \\ \frac{5}{3} & \frac{7}{3} & \frac{100}{7} \\ \end{bmatrix} [335237],[33523777100]

2. 补充知识

主元:在一个矩阵中,对于该矩阵的某一行(指定的),从左到右第一个非 000 的数字就是主元。
行阶梯型矩阵:满足以下 333 个性质的矩阵就是行阶梯型矩阵:

  • ∀1≤i≤n,i∈Z\forall 1 \le i \le n, i \in \bold{Z}∀1in,iZ ,第 iii 行的主元永远在第 i+1i+1i+1 行主元的左上方。
  • ∀1≤i≤n,i∈Z\forall 1 \le i \le n, i \in \bold{Z}∀1in,iZ ,第 iii 行的主元下方均为 000这一性质其实可以由上面的那一条推出
  • 所有非零行都在所有零行之上。这一性质也可以由第一条推出

一个典型的行阶梯型矩阵如下,加粗的为主元,可以观察到以上三条性质:
[31023510073420004640000010000000] \begin{bmatrix} \bold{3} & 10 & 2 & 3 & 5 & 1 \\ 0 & 0 & \bold{7} & 3 & 4 & 2 \\ 0 & 0 & 0 & \bold{4} & 6 & 4 \\ 0 & 0 & 0 & 0 & 0 & \bold{10} \\ 0 & 0 & 0 & 0 & 0 & 0 \end{bmatrix} 30000100000270003340054600124100

简化行阶梯型矩阵:在行阶梯型矩阵的基础上满足以下性质:

  • 每一个非 000 行的主元一定是 111
  • 每一个主元 111 是该行唯一的非 000 元素。

Gauss 消元的目标就是把一个矩阵简化为行阶梯型矩阵。

3. Gauss 消元算法的主要过程及其对应在方程组中操作的实际意义

假设我们的增广矩阵 AAAn×mn \times mn×m 的。
先写出 Gauss 消元算法的主要流程:

  1. 枚举列号 ∀1≤c≤m∈Z\forall 1 \le c\le m \in \bold{Z}∀1cmZ
  2. 找到主元。假设当前是第 ccc 列,我们在 [1,c−1][1,c-1][1,c1] 列这一范围内已经找到了 w−1w-1w1 个主元,根据行阶梯型矩阵的定义以及性质,下一列的主元一定在上一列的主元的右下方,即一定在第 ccc 列,第 [w,n][w, n][w,n] 行范围内。故应该在 [w,n][w,n][w,n] 行范围内寻找主元。该主元应绝对值最大,找到的主元的绝对值 ∣W∣=max⁡w≤i≤n,w∈Z{∣Ai,c∣}|W|=\displaystyle\max_{w \le i \le n,w\in\bold{Z}}\{|A_{i,c}|\}W=win,wZmax{Ai,c}
  3. 如果我们找到的 Aa,b=0A_{a,b}=0Aa,b=0 ,说明继续操作没有意义,跳过当前列,下一列寻找。否则,将当前找到的主元所在行与第 www 行做对换变换。因此,该操作并没有改变矩阵,只是将矩阵化为另一种形式,方便统计。变换后,主元所在行变成了第 www 行。
  4. 对第 www 行做倍乘变换。∀1≤i≤m,Aw,i←Aw,i×1Aw,c\forall 1 \le i \le m, A_{w,i} \leftarrow A_{w,i} \times \displaystyle\frac{1}{A_{w,c}}∀1im,Aw,iAw,i×Aw,c1 ,相当于在方程组中将等式两边的值都除以 Aw,cA_{w,c}Aw,c ,即找到的主元。
  5. 消元。这是 Gauss 消元算法中最主要的步骤。主要目的是将第 ccc 列除主元所在位置 (w,c)(w,c)(w,c) 之外的所有元素变为 000 。为确保矩阵前后相同,我们对矩阵进行倍加变换。假设我们当前的位置是 (i,j)(i,j)(i,j) ,满足 i≠wi \neq wi=w 。根据简化行阶梯型矩阵的性质,可知 jjj 只需要在 w≤j≤m, j∈Zw \le j \le m,\space j \in\bold{Z}wjm, jZ 的范围内枚举即可,因为 ∀1≤j<w,Ai,j=0\forall 1 \le j < w, A_{i,j}=0∀1j<w,Ai,j=0 恒成立(简化行阶梯型矩阵性质 2)。倍加变换的主要过程如下:当前枚举到 (i,j)(i,j)(i,j) ,主元位置为 (c,w)(c,w)(c,w) ,对于第 www 行的所有元素,应该乘以 Ai,cAw,c\displaystyle\frac{A_{i,c}}{A_{w,c}}Aw,cAi,c 。推导过程类似于解方程组的思路,假设我们有一个如下的方程组:
    {4x+2y=64x+3y=7 \begin{cases} 4x+2y=6 \\ 4x+3y=7 \\ \end{cases} {4x+2y=64x+3y=7
    那么我们一定会尝试去消去 4x4x4x ,这就是加减消元法(使用了初中数学七年级下-二元一次方程组的知识)。解得: {x=1y=1\begin{cases}x=1\\y=1\end{cases}{x=1y=1 。如果将它化为增广矩阵,那么将会等于 [426437]\begin{bmatrix}\bold{4} & 2 & 6 \\ \bold{4} & 3 & 7\end{bmatrix}[442367] ,主元在前面用粗体表示,如果我们尝试让第 111 列的所有元素变成 000 ,那么我们会让第一行的所有元素乘以 44=1\frac{4}{4}=144=1 再减去第二行的所有元素。注意,分母的 444 代表的是 (1,1)(1,1)(1,1) 位置的元素,而分子的 444 则代表的是 (1,2)(1,2)(1,2) 位置的元素。增广矩阵会变成:[426011]\begin{bmatrix}4 & 2 & 6 \\ 0 & 1 & 1\end{bmatrix}[402161] ,此时消元的目的已经达到。
    将这个性质推广到 AAA ,则可以得出 ∀(i,j)∈A\forall (i,j) \in A(i,j)AAi,jA_{i,j}Ai,j 应该减去 Ai,cAw,c⋅Aw,cAw,j=Ai,c⋅Aw,j\frac{A_{i,c}}{A_{w,c}}\cdot \frac{A_{w,c}}{A_{w,j}}=A_{i,c}\cdot A_{w,j}Aw,cAi,cAw,jAw,c=Ai,cAw,j 。为方便记忆,可以观察公式,行和列已经用 w,cw,cw,c 给定,将变量 i,ji,ji,j 按照行和列的变化插入即可。
  6. 方程组的解即为矩阵的最后一列,x1,x2,…x_1,x_2,\dotsx1,x2,An,1,An,2,…A_{n,1},A_{n,2},\dotsAn,1,An,2, 一一对应。

用一些例子来更好理解 Gauss 消元算法:
{4x1+2x2+3x3=152x1+2x2+4x3=195x1+6x2+7x3=29[423152241956729]  ⟹  对换变换[567292241942315]  ⟹  倍乘变换[165752952241942315]  ⟹  倍加变换[165752950−25−137542315]… \begin{cases} 4x_1+2x_2+3x_3=15 \\ 2x_1+2x_2+4x_3=19 \\ 5x_1+6x_2+7x_3=29 \\ \end{cases} \\ \begin{bmatrix} 4 & 2 & 3 & 15 \\ 2 & 2 & 4 & 19 \\ \bold{5} & 6 & 7 & 29 \\ \end{bmatrix}\stackrel{对换变换}{\implies} \begin{bmatrix} \bold{5} & 6 & 7 & 29 \\ 2 & 2 & 4 & 19 \\ 4 & 2 & 3 & 15 \\ \end{bmatrix}\stackrel{倍乘变换}{\implies} \begin{bmatrix} \bold{1} & \frac{6}{5} & \frac{7}{5} & \frac{29}{5} \\ 2 & 2 & 4 & 19 \\ 4 & 2 & 3 & 15 \\ \end{bmatrix}\stackrel{倍加变换}{\implies} \\ \begin{bmatrix} \bold{1} & \frac{6}{5} & \frac{7}{5} & \frac{29}{5} \\ \bold{0} & \bold{-\frac{2}{5}} & \bold{-1} & \bold{\frac{37}{5}} \\ 4 & 2 & 3 & 15 \\ \end{bmatrix} \dots 4x1+2x2+3x3=152x1+2x2+4x3=195x1+6x2+7x3=29 425226347151929 对换变换 524622743291915 倍乘变换 124562257435291915 倍加变换 10456522571352953715

主要代码(在 Matrix 结构体中):

void Gauss()
{
	int w = 1;
	for (int c = 1; c <= m; ++c)
	{
		int temp = w;
		for (int i = w + 1; i <= n; ++i)
			if (abs(a[temp][c]) < abs(a[i][c]))
				temp = i;
		if (abs(a[temp][c]) < eps) continue;
		for (int i = c; i <= m; ++i) swap(a[temp][i], a[w][i]);
		for (int i = m; i >= c; --i) a[w][i] /= a[w][c];
		for (int i = 1; i <= n; ++i)
		{
			if (i == w) continue;
			for (int j = m; j >= c; --j)
				a[i][j] -= a[i][c] * a[w][j];
		}
	}
}

注:本文章所有代码未经调试及编译,如有 Bug ,欢迎在评论区指出,必互关


网站公告

今日签到

点亮在社区的每一天
去签到