**高斯消去法**（英語：）是线性代数中的一个算法，可以把矩阵转化为行阶梯形矩阵。高斯消去法可用來為線性方程組求解，求出矩陣的秩，以及求出可逆方陣的逆矩陣。

历史
--

该方法以数学家卡尔·高斯命名，但最早出现于中国古籍《九章算术》，成书于约公元前150年。

例子
--

高斯消去法可用來找出下列方程組的解或其解的限制：
{\displaystyle \left\{{\begin{matrix}2x+y-z=8\quad (L\_{1})\\-3x-y+2z=-11\quad (L\_{2})\\-2x+y+2z=-3\quad (L\_{3})\\\end{matrix}}\right.}

這個算法的原理是：

首先，要將L\_{1}以下的等式中的x消除，然後再將L\_2以下的等式中的y消除。這樣可使整个方程組變成一個三角形似的格式。之後再將已得出的答案一個個地代入已被簡化的等式中的未知數中，就可求出其餘的答案了。

在剛才的例子中，我們將{\displaystyle {\frac {3}{2}}L\_{1}}和L\_2相加，就可以將L\_2中的x消除了。然後再將L\_{1}和L\_3相加，就可以將L\_3中的x消除。

我們可以這樣寫：

L\_2 + \frac{3}{2}L\_1 \rightarrow L\_2
L\_3 + L\_1 \rightarrow L\_3
結果就是：

2x + y - z = 8 \, 
\frac{1}{2}y + \frac{1}{2}z = 1 \, 
2y + z = 5 \, 
現在將-4L\_2和L\_3相加，就可將L\_3中的y消除：

L\_3 + -4L\_2 \rightarrow L\_3
其結果是：

2x + y - z = 8 \, 
\frac{1}{2}y + \frac{1}{2}z = 1 \, 
-z = 1 \, 
這樣就完成了整個算法的初步，一個三角形的格式（指：變數的格式而言，上例中的變數各為3,2,1個）出現了。

第二步，就是由尾至頭地將已知的答案代入其他等式中的未知數。第一個答案就是：

z = -1 \quad (L\_3)
然後就可以將z代入L\_2中，立即就可得出第二個答案：

y = 3 \quad (L\_2)
之後，將z和y代入L\_{1}之中，最後一個答案就出來了：

x = 2 \quad (L\_1)
就是這樣，這個方程組就被高斯消去法解決了。

這種算法可以用來解決所有線性方程組。即使一個方程組不能被化為一個三角形的格式，高斯消去法仍可找出它的解。例如，如果在第一步化簡後，L\_2及L\_3中沒有出現任何y，沒有三角形的格式，照著高斯消去法而產生的格式仍是一個阶梯形矩阵。這情況之下，這個方程組會有超過一個解，當中會有至少一個變數作為答案。每當變數被鎖定，就會出現一個解。

通常人或電腦在應用高斯消去法的時候，不會直接寫出方程組的等式來消去未知數，反而會使用矩陣來計算。以下就是使用矩陣來計算的例子： 

{\displaystyle \left[{\begin{array}{ccc|c}2&1&-1&8\\-3&-1&2&-11\\-2&1&2&-3\end{array}}\right]}
跟著以上的方法來運算，這個矩陣可以轉變為以下的樣子：

{\displaystyle \left[{\begin{array}{ccc|c}2&1&-1&8\\0&{\frac {1}{2}}&{\frac {1}{2}}&1\\0&0&-1&1\end{array}}\right]}
這矩陣叫做「阶梯形矩阵」。

最後，可以利用同樣的算法產生以下的矩陣，便可把所得出的解或其限制簡明地表示出來：

{\displaystyle \left[{\begin{array}{ccc|c}1&0&0&2\\0&1&0&3\\0&0&1&-1\end{array}}\right]}
最後這矩陣叫做「簡化阶梯形矩阵」，亦是高斯-若爾當消元法指定的步驟。

其他應用
----

### 找出逆矩陣

高斯消去法可以用來找出一個可逆矩陣的逆矩陣。設A為一個n\times n的矩陣，其逆矩陣可被兩個分塊矩陣表示出來。將一個n\times n 單位矩陣放在A的右手邊，形成一個n \times 2n的分塊矩陣B = [A, I]。經過高斯消去法的計算程序後，矩陣B的左手邊會變成一個單位矩陣I，而逆矩陣A^{-1}會出現在B的右手邊。

假如高斯消去法不能將A化為三角形的格式，那就代表A是一個不可逆的矩陣。

應用上，高斯消去法極少被用來求出逆矩陣。高斯消去法通常只為線性方程組求解。

### 計出秩和基底的基本算法

高斯消去法可應用在任何m\times n的矩陣A。在不可減去某數的情況下，我們都只有跳到下一行。以一個6 \times 9的矩陣作例，它可能可以變化為一個阶梯形矩阵：

{\displaystyle {\begin{bmatrix}1&\*&0&0&\*&\*&0&\*&0\\0&0&1&0&\*&\*&0&\*&0\\0&0&0&1&\*&\*&0&\*&0\\0&0&0&0&0&0&1&\*&0\\0&0&0&0&0&0&0&0&1\\0&0&0&0&0&0&0&0&0\end{bmatrix}}}
而矩陣中的\*是一些數字。這個阶梯形矩阵T會有一些關於A的資訊：

* A的秩是5，因為T有5行非0的行；
* A的列空間Col(A)，將以A的第1、3、4、7和9列為基底，就是那些在矩陣T之中擁有主元的行；
* 矩陣中的\*表示了A的該行如何寫為上述基底的線性組合。

分析
--

高斯消去法的算法复杂度是O(*n*3)；这就是说，如果系數矩阵的是*n* × *n*，那么高斯消去法所需要的计算量大约与*n*3成比例。

高斯消去法可以用在電腦中來解決數千條等式及未知數。不過，如果有過百萬條等式時，這個算法會十分費時。一些極大的方程組通常會用迭代法來解決。亦有一些方法特地用來解決一些有特別排列的係數的方程組。

高斯消去法可用在任何域中。

高斯消去法對於一些矩陣來說是穩定的。對於普遍的矩陣來說，高斯消去法在應用上通常也是穩定的，不過亦有例外。

伪代码
---

高斯消去法的其中一种伪代码：

```
 i = 1
 j = 1
 while (i ≤ m and j ≤ n) do
 Find pivot in column j, starting in row i // 从第i行(row)开始，找出第j列(column )中的最大值（i、j值应保持不变） #台湾与大陆的列、行定义相反。台湾列为row行为column，大陆列为column行为row。
 maxi = i
 for k = i+1 to m do
 if abs(A[k,j]) > abs(A[maxi,j]) then
 maxi = k // 使用交换法找出最大值（绝对值最大）
 end if
 end for
 if A[maxi,j] ≠ 0 then // 判定找到的绝对值最大值是否为零：若不为零就进行以下操作；若为零则说明该列第(i+1)列以下（包括第(i+1)列）均为零，不需要再处理，直接跳转至第(j+1)行第(i+1)列
 swap rows i and maxi, but do not change the value of i // 将第i行与找到的最大值所在行做交换，保持i值不变（i值记录了本次操作的起始行）
 Now A[i,j] will contain the old value of A[maxi,j].
 divide each entry in row i by A[i,j] // 将交换后的第i列归一化（第i列所有元素分别除以A[i,j]）
 Now A[i,j] will have the value 1.
 for u = i+1 to m do // 第j行中，第(i+1)列以下（包括第(i+1)列）所有元素都减去A[i,j]，直到第j行的i+1列以後元素均為零
 subtract A[u,j] \* row i from row u
 Now A[u,j] will be 0, since A[u,j] - A[i,j] \* A[u,j] = A[u,j] - 1 \* A[u,j] = 0.
 end for
 i = i + 1 
 end if
 j = j + 1 // 第j行中，第(i+1)列以下（包括第(i+1)列）所有元素均为零。移至第(j+1)行，从第(i+1)列开始重复上述步骤。
 end while

```

这个算法和之前谈到的有点不同，它由绝对值最大的部分开始做起，这样可以改善算法的稳定性。本算法由左至右地计算，每作出以下三个步骤，才跳到下一行和下一列：

1. 定出每行的绝对值最大的一个非0的数，将第一列的值与该列交换，使得第一列拥有这一行的最大值；
2. 将第一行的数字除以该数，使得该列的第一个数成为1；
3. 對每一列減去第一列乘以每一列的第一個數，使得每一列的第一個數變為0。

所有步骤完成后，这个矩阵会变成一个阶梯形矩阵，再用代入法就可以求解该方程组。

  

随着多核处理器的日益普及，现在的程序员可以利用线程级并行高斯消元算法来提高计算的速度。内存共享模式（而不是消息交换模式）的伪代码如下所示：

```
void parallel(int num\_threads,int matrix\_dimension)
{
 int i;
 for(i=0; i<num\_threads; i++)
 create\_thread(&threads[i],i);
 pthread\_attr\_destroy(&attr); // Free attribute and wait for the other threads
 for(i=0; i<p; i++)
 pthread\_join(threads[i],NULL);
}
void \*gauss(int thread\_id)
{
 int i,k,j;
 for(k=0; k<matrix\_dimension-1; k++)
 {
 if(thread\_id==(k%num\_thread)) //interleaved-row work distribution
 {
 for(j=k+1; j<matrix\_dimension; j++)
 M[k][j]=M[k][j]/M[k][k];
 M[k][k]=1;
 }
 barrier(num\_thread,&mybarrier); //wait for other thread finishing this round
 for(i=k+1; i<matrix\_dimension; i=i+1)
 if(i%p==thread\_id)
 {
 for(j=k+1; j<matrix\_dimension; j++)
 M[i][j]=M[i][j]-M[i][j]\*M[k][j];
 M[i][k]=0;
 }
 barrier(num\_thread,&mybarrier);
 }
 return NULL;
}
void barrier(int num\_thread, barrier\_t \* mybarrier)
{
 pthread\_mutex\_lock(&(mybarrier->barrier\_mutex));
 mybarrier->cur\_count++;
 if(mybarrier->cur\_count!=num\_thread)
 pthread\_cond\_wait(&(mybarrier->barrier\_cond),&(mybarrier->barrier\_mutex));
 else
 {
 mybarrier->cur\_count=0;
 pthread\_cond\_broadcast(&(mybarrier->barrier\_cond));
 }
 pthread\_mutex\_unlock(&(mybarrier->barrier\_mutex));
}

```

參考文獻
----

1. ↑  Steven J. Leon.. 培生教育. 2014: 第13頁. ISBN 9781292025148.
2. ↑ . . 150bc  [2007年12月25日]. （原始内容存档于2009年4月19日）.  请检查`|date=`中的日期值 (帮助)
3. ↑  Steven J. Leon.. 培生教育. 2014: 第17頁. ISBN 9781292025148.
4. ↑  Atkinson, 1989年，第514頁
5. ↑  Golub and Van Loan, §3.4.6

* Atkinson, Kendall A. *An Introduction to Numerical Analysis*, 第二版, John Wiley & Sons, New York, 1989年 ISBN 978-0-471-50023-0
* Golub, Gene H. and Van Loan, Charles F. *Matrix computations*, 第三版, Johns Hopkins, Baltimore, 1996年 ISBN 978-0-8018-5414-9
* Lipschutz, Seymour, and Lipson, Mark. *Schaum's Outlines: Linear Algebra*, Tata McGraw-hill edition.Delhi 2001年, 第69-80頁

參見
--

* 高斯－約當消去法
* 阶梯形矩阵
* 線性方程組求解
* 四元玉鑒

外部链接
----

* 高斯消去法 （页面存档备份，存于）
* java applet高斯消去法，只能取自然数。
* matlab octave的高斯约当消去法
* python语言的高斯消去法 （页面存档备份，存于）
* 中國大百科智慧藏-消元法

|  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
线性代数的相关概念 |
| --- |
|  |
| 重要概念 | 
* 标量
* 向量
* 向量空间
* 向量子空间

* 线性生成空间
* 线性映射
* 投影
* 線性無關
* 线性组合

* 基
* 標記
* 列空间
* 行空间
* 零空间
* 对偶空间
* 正交
* 特征值
* 特征向量

* 数量积
* 内积空间
* 点乘
* 轉置
* 格拉姆-施密特正交化
* 线性方程组
* 克萊姆法則

 |
|  |
| 矩阵 | 
* 矩阵
* 矩陣乘法
* 矩阵分解
* 行列式
* 子式和余子式
* 矩阵的秩
* 克萊姆法則
* 逆矩阵
* 高斯消去法
* 线性变换
* 分块矩阵

 |
|  |
| 数值线性代数 | 
* 浮点数
* 数值稳定性
* 基础线性代数程序集
* 稀疏矩阵

 |

 |