# rref
简化的行阶梯形矩阵(Gauss-Jordan 消元法)
函数库: TyMath
# 语法
R,p = rref(A)
R,p = rref(A,tol)
# 说明
R, p = rref(A) 使用 Gauss-Jordan 消元法和部分主元消元法返回 A 的简化行阶梯形 R 以及非零主元列 p。示例
# 示例
简化行阶梯形矩阵
创建一个矩阵并计算简化行阶梯形矩阵。在这种形式中,矩阵在每列的主元位置具有前导 1。
using TyMath
A = magic(3)
A = 3×3 Matrix{Int64}:
8 1 6
3 5 7
4 9 2
RA, = rref(A)
RA = 3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
3×3 幻方矩阵为满秩,因此简化行阶梯形矩阵是单位矩阵。
现在,计算 4×4 幻方矩阵的简化行阶梯形矩阵。指定两个输出以返回非零主元列。由于该矩阵秩亏,因此结果不是单位矩阵。
B = magic(4)
B = 4×4 Matrix{Int64}:
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
RB,p = rref(B)
RB = 4×4 Matrix{Float64}:
1.0 0.0 0.0 1.0
0.0 1.0 0.0 3.0
0.0 0.0 1.0 -3.0
0.0 0.0 0.0 0.0
p = 3-element Vector{Int64}:
1
2
3
增广矩阵的行缩减
对增广矩阵使用 Gauss-Jordan 消元法来求解线性方程组并计算逆矩阵。这些方法主要用于学术研究,因为有更高效和数值稳定的方法来计算这些值。
创建一个 3×3 幻方矩阵。在矩阵的末尾添加一个额外的列。此增广矩阵表示线性方程组 Ax=b,其中额外的列对应于 b。
using TyMath
using TyBase
A = magic(3)
A = hcat(A,[1, 1, 1])
A = 3×4 Matrix{Int64}:
8 1 6 1
3 5 7 1
4 9 2 1
计算 A 的简化行阶梯形矩阵。对 R 进行索引以提取该额外(增广)列中的项,该列包含线性方程组的解。
R, = rref(A)
R = 3×4 Matrix{Float64}:
1.0 0.0 0.0 0.0666667
0.0 1.0 0.0 0.0666667
0.0 0.0 1.0 0.0666667
x = R[:,end]
x = 3-element Vector{Float64}:
0.06666666666666665
0.06666666666666667
0.06666666666666668
求解此线性方程组的更高效方法是使用反斜杠运算符,即 x = A\b。
创建一个类似的幻方矩阵,但这次在末尾列追加一个相同大小的单位矩阵。
A = [magic(3) eye(3)]
A = 3×6 Matrix{Int64}:
8 1 6 1 0 0
3 5 7 0 1 0
4 9 2 0 0 1
计算 A 的简化行阶梯形矩阵。在此形式中,额外的列包含该 3×3 幻方矩阵的逆矩阵。
R, = rref(A)
R = 3×6 Matrix{Float64}:
1.0 0.0 0.0 0.147222 -0.144444 0.0638889
0.0 1.0 0.0 -0.0611111 0.0222222 0.105556
0.0 0.0 1.0 -0.0194444 0.188889 -0.102778
inv_A = R[:,4:end]
inv_A = 3×3 Matrix{Float64}:
0.147222 -0.144444 0.0638889
-0.0611111 0.0222222 0.105556
-0.0194444 0.188889 -0.102778
计算逆矩阵的更高效方法是使用 inv(A)。
求解方程组
以一个包含四个方程和三个未知数的线性方程组为例。
创建一个表示该方程组的增广矩阵。
using TyMath
A = [1 1 5;
2 1 8;
1 2 7;
-1 1 -1]
b = [6,8,10,2]
M = [A b]
使用 rref 以简化行阶梯形矩阵表示该方程组。
R, = rref(M)
R = 4×4 Matrix{Float64}:
1.0 0.0 3.0 2.0
0.0 1.0 2.0 4.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
R 的前两行包含表示
例如,如果
从数值的角度来看,求解该方程组的更高效方法是使用
# 输入参数
A - 输入矩阵矩阵
输入矩阵。
数据类型: Int | Float
复数支持: 是
tol - 主元容差max(size(A)...)*eps()*opnorm(A,Inf) (默认) | 标量
主元容差,指定为标量。如果主元列中的最大元素(按绝对值)低于容差,则该列将归零。这可以防止使用小于容差的非零主元元素进行除法和乘法。
数据类型: Int | Float
# 输出参数
R - A 的简化行阶梯形矩阵矩阵
A 的简化行阶梯形矩阵形式,以矩阵形式返回。
数据类型: Int | Float
p - 非零主元列向量
非零主元列,以向量形式返回。p 中的每个元素均为 A 的列索引。您可以使用 p 估算下面几个量:
- length(p) 是 A 的秩的估计值;
- x[p] 包含线性方程组 Ax = b 中的主元变量;
- A[:,p] 是 A 范围的依据;
- R[1:r,p] 是 r×r 单位矩阵,其中 r = length(p)。
数据类型: Int
# 局限性
- 对于计算矩阵的秩和基向量,rank、orth、null 通常更快、更准确;
- 建议使用 mldivide 求解线性方程组问题。
# 详细信息
部分主元消元法
部分主元消元法的做法是在主元列中选择具有最大绝对值的列元素,然后交换矩阵的行以使该元素处于主元位置(行中最左边的非零元素)。
例如,在以下矩阵中,算法首先确定第一列中的最大值([2,1] 位置中的值,等于 1.1),然后交换完整的第一行和第二行,使该值出现在 [1,1] 位置。
在高斯消去法中使用部分主元消元法可减少(但会不消除)计算中的舍入误差。
简化行阶梯形矩阵形式
满足以下条件时,矩阵为行阶梯形式:
- 所有非零行都在全部为零的行之上;
- 每一行的首项系数严格位于其上一行的首项系数的右侧;
行阶梯形式的矩阵的示例如:
简化行阶梯形式的另一项要求是:
- 每个首项系数必须为 1,并且必须是其列中唯一的非零值。
虽然单位矩阵最常与简化行阶梯形式相关联,但也可与其他形式相关联。另一个简化行阶梯形式的矩阵的示例如:

# 算法
rref 通过部分主元消元法实现 Gauss-Jordan 消元法。max(size(A)...)*eps()*opnorm(A,Inf) 的默认容差检验可忽略不计的列元素,这些列元素会归零以减少舍入误差。