Python 将矩阵转换为行最简形式 (Row Echelon Form, REF)和列最简形式 (Column Echelon Form, CEF)

flyfish

通俗理解矩阵的秩
通俗理解低秩分解
一个矩阵的行数和列数可能不同,为什么它的行秩和列秩始终相同

主元 (Pivot Element)
主元 (pivot) 是行最简形式或列最简形式中的每一行(或列)的第一个非零元素。在行最简形式中,主元是每一行从左到右遇到的第一个非零数;在列最简形式中,主元是每一列从上到下遇到的第一个非零数。

主元的作用:
在行最简形式 (REF) 中,主元用来确定矩阵的阶梯形排列,并且主元所在的列是用来消去其他行的关键元素。
在列最简形式 (CEF) 中,主元同样用来确定列的阶梯形排列。

主元归一化为 1 之后,后续的行变换(例如消去主元所在列的其他元素)会变得更简单。
归一化后的矩阵会显得更加整洁,并且在数学计算(如求解线性方程组)时,得到的结果更直观。RREF 是唯一的形式(与 REF 不同,REF 不是唯一的),这意味着一个矩阵的 RREF 形式是唯一的,可以用来判断线性系统的唯一性和解的形式。

当要求主元为 1 时,矩阵的行最简形式 (Row Echelon Form, REF) 和列最简形式 (Column Echelon Form, CEF) 会遵循更加严格的规范。主元为 1 的情况实际上是简化的行阶梯形矩阵 (Reduced Row Echelon Form, RREF)和简化的列阶梯形矩阵 (Reduced Column Echelon Form, RCEF)。

行最简形式 (Row Echelon Form, REF) 且主元为 1

行最简形式是通过初等行变换将矩阵转换为一种阶梯形。要求主元为 1 使得它接近于简化行阶梯形矩阵 (RREF),但在 REF 中,我们不要求主元所在列的其他元素都为 0。具体要求如下:

每一行的第一个非零元素是 1(即主元为 1)。
每一行的主元比上一行的主元在更靠右的位置。
如果矩阵中有零行(全为 0 的行),这些零行必须在矩阵的最下方。

举例:

考虑矩阵 A = [ 2 4 6 1 3 5 0 1 2 ] A = \begin{bmatrix} 2 & 4 & 6 \\ 1 & 3 & 5 \\ 0 & 1 & 2 \end{bmatrix} A= 210431652 ,通过初等行变换,我们可以将其转化为行最简形式,且主元为 1: A → 初等行变换 [ 1 0 − 1 0 1 2 0 0 0 ] A \xrightarrow{\text{初等行变换}} \begin{bmatrix} 1 & 0 & -1 \\ 0 & 1 & 2 \\ 0 & 0 & 0 \end{bmatrix} A初等行变换 100010120

这是一个行最简形式矩阵,且每一行的主元都为 1。

特点:

第一行的主元是 1,位于第一列。
第二行的主元是 1,位于第二列。
第三行是零行。

列最简形式 (Column Echelon Form, CEF) 且主元为 1

列最简形式是通过初等列变换将矩阵转换为一种阶梯形,要求主元为 1。列最简形式的特点类似于行最简形式,只是它针对列进行操作。具体要求如下:
每一列的第一个非零元素是 1(即主元为 1)。
每一列的主元比上一列的主元在更靠下的位置。
如果矩阵中有零列(全为 0 的列),这些零列必须在矩阵的最右侧。

举例:

考虑矩阵 A = [ 1 2 3 4 5 6 ] A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} A= 135246 ,我们可以通过初等列变换将其转化为列最简形式,且主元为 1:

  1. 交换第一列和第二列,使得主元出现在第一列的第一行中:
    A = [ 2 1 4 3 6 5 ] A = \begin{bmatrix} 2 & 1 \\ 4 & 3 \\ 6 & 5 \end{bmatrix} A= 246135

  2. 将第一列的第一个元素 2 变为 1,即: R 1 = 1 2 R 1 = [ 1 0.5 4 3 6 5 ] R_1 = \frac{1}{2} R_1 = \begin{bmatrix} 1 & 0.5 \\ 4 & 3 \\ 6 & 5 \end{bmatrix} R1=21R1= 1460.535

  3. 使用主元消去第一列其他行的元素:
    R 2 = R 2 − 4 × R 1 = [ 0 1 1 0 − 1 2 ] R_2 = R_2 - 4 \times R_1 = \begin{bmatrix} 0 & 1 \\ 1 & 0 \\ -1 & 2 \end{bmatrix} R2=R24×R1= 011102

最终的列最简形式为:
[ 1 0 0 1 − 1 2 ] \begin{bmatrix} 1 & 0 \\ 0 & 1 \\ -1 & 2 \end{bmatrix} 101012

特点:

第一列的主元是 1,位于第一行。
第二列的主元是 1,位于第二行。
第三行的元素依然存在,但不影响列最简形式。

import sympy as sp

# 定义矩阵
A = sp.Matrix([[1, 2], [3,4], [5,6]])

# 计算行最简形式
rref_matrix, pivot_columns = A.rref()

print("行最简形式:")
print(rref_matrix)
print("主元列:")
print(pivot_columns)

# 转置矩阵,计算行最简形式,再转置回来
cef_matrix, pivot_columns = A.T.rref()
cef_matrix = cef_matrix.T

print("列最简形式:")
print(cef_matrix)

输出

行最简形式:
Matrix([[1, 0], [0, 1], [0, 0]])
主元列:
(0, 1)
列最简形式:
Matrix([[1, 0], [0, 1], [-1, 2]]

如果换下矩阵

A = sp.Matrix([[2, 4,6], [1,3,5], [0,1,2]])

结果是

行最简形式:
Matrix([[1, 0, -1], [0, 1, 2], [0, 0, 0]])
主元列:
(0, 1)
列最简形式:
Matrix([[1, 0, 0], [0, 1, 0], [-1/2, 1, 0]])
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐