Python 将矩阵转换为行最简形式 (Row Echelon Form, REF)和列最简形式 (Column Echelon Form, CEF)
flyfish
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初等行变换 100010−120
这是一个行最简形式矩阵,且每一行的主元都为 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:
-
交换第一列和第二列,使得主元出现在第一列的第一行中:
A = [ 2 1 4 3 6 5 ] A = \begin{bmatrix} 2 & 1 \\ 4 & 3 \\ 6 & 5 \end{bmatrix} A= 246135 -
将第一列的第一个元素
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 -
使用主元消去第一列其他行的元素:
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=R2−4×R1= 01−1102
最终的列最简形式为:
[
1
0
0
1
−
1
2
]
\begin{bmatrix} 1 & 0 \\ 0 & 1 \\ -1 & 2 \end{bmatrix}
10−1012
特点:
第一列的主元是 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]])
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)