2026a

# rref


简化的行阶梯形矩阵(Gauss-Jordan 消元法)

函数库: TyMath

# 语法

R,p = rref(A)
R,p = rref(A,tol)

# 说明

R, p = rref(A) 使用 Gauss-Jordan 消元法和部分主元消元法返回 A 的简化行阶梯形 R 以及非零主元列 p。示例


R, p = rref(A, tol) 指定算法容差。

# 示例

简化行阶梯形矩阵

创建一个矩阵并计算简化行阶梯形矩阵。在这种形式中,矩阵在每列的主元位置具有前导 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 的前两行包含表示 关于 的方程。接下来的两行表示存在至少一个适合右侧向量的解(否则其中一个方程将显示为 1=0)。第三列不包含主元,因此 是自变量。因此, 的解有无多个,可以自由选择

例如,如果 ,则

从数值的角度来看,求解该方程组的更高效方法是使用 ,此方法(对于矩形矩阵 A)计算最小二乘解。在这种情况下,您可以使用 检查解的精确度,通过检查 rank(A) 是否等于未知数的数目来确定解的唯一性。如果存在多个解,则它们都具有 形式,其中 n 是零空间 null(A) 且 t 可以自由选择。

# 输入参数

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) 的默认容差检验可忽略不计的列元素,这些列元素会归零以减少舍入误差。

# 另请参阅

cond | det | norm | rank