2026a

# pinv


Moore-Penrose 伪逆

函数库: TyMath

# 语法

B = pinv(A)
B = pinv(A,atol)
B = pinv(A,rtol)

# 说明

B = pinv(A) 返回矩阵 A 的 Moore-Penrose 伪逆。示例


B = pinv(A,atol) 指定绝对误差的值。pinv 将 A 中小于容差的奇异值视为零。


B = pinv(A,rtol) 指定相对误差的值。

# 示例

使用伪逆求解线性方程组

比较通过反斜杠 (\) 和 pinv 求得的线性方程组的解。

如果矩形系数矩阵 A 低秩,则使 norm(A*x-b) 最小化的最小二乘问题将有无限多个解。x1 = A\b 和 x2 = pinv(A)*b 返回两个解。这两个解具有以下特征:x1 只有 rank(A) 个非零分量,norm(x2) 是小于任何其他解的范数。

创建一个 rank(A) = 3 的 8×6 矩阵。

using TyMath
A = magic(8)
A = A[:,1:6]
8×6 Matrix{Int64}:
64   2   3  61  60   6
9   55  54  12  13  51
17  47  46  20  21  43
40  26  27  37  36  30
32  34  35  29  28  38
41  23  22  44  45  19
49  15  14  52  53  11
8   58  59   5   4  62

为方程组的右侧创建一个向量。

b = 260*ones(8,1)
8×1 Matrix{Float64}:
260.0
260.0
260.0
260.0
260.0
260.0
260.0
260.0

为右侧选择的数字 260 是 A 的 8×8 幻数和。如果 A 仍然是 8×8 矩阵,则 x 有一个解是由 1 组成的向量。如果只有六列,方程仍然是一致的,因此仍然存在解,但解并非全部由 1 组成。由于矩阵低秩,因此有无限多个解。

使用反斜杠和 pinv 求两个解。

x1 = A\b
6×1 Matrix{Float64}:
1.153846153846153
1.4615384615384617
1.3846153846153846
1.384615384615385
1.4615384615384626
1.1538461538461524
x2 = pinv(A)*b
6×1 Matrix{Float64}:
1.1538461538461524
1.461538461538463
1.384615384615385
1.3846153846153841
1.4615384615384635
1.1538461538461497

从 norm(A*x1-b) 和 norm(A*x2-b) 仅存在舍入误差的意义上来说,这两个解都是精确的。解 x1 的特殊之处在于它只有三个非零元素。解 x2 的特殊之处在于 norm(x2) 小于其他任何解的对应值,包括 norm(x1)。

norm(x1)
ans = 3.281650616569468
norm(x2)
ans = 3.2816506165694674

使用 lsqminnorm 计算此问题的最小二乘解会产生与使用 pinv 相同的解。lsqminnorm(A,b) 通常比 pinv(A)*b 更高效。

x3 = lsqminnorm(A,b)
6×1 Matrix{Float64}:
1.153846153846153
1.4615384615384612
1.384615384615385
1.3846153846153837
1.4615384615384612
1.1538461538461529
norm(x3)
ans =  3.281650616569467

# 输入参数

A - 输入矩阵
矩阵

输入矩阵。

数据类型: Int | Float64 | Float32 | Float16

复数支持:

atol - 绝对误差
标量

奇异值绝对容差,指定为标量。在计算伪逆时,pinv 会将小于 atol 的奇异值视为零。

rtol - 相对误差
标量

奇异值相对容差,指定为标量。在计算伪逆时,pinv 会将小于 rtol 的奇异值视为零。

# 详细信息

Moore-Penrose伪逆

Moore-Penrose 伪逆是一种矩阵,可在不存在逆矩阵的情况下作为逆矩阵的部分替代。此矩阵常被用于求解没有唯一解或有许多解的线性方程组。

对于任何矩阵 A 来说,伪逆 B 都存在,是唯一的,并且具有与 A' 相同的维度。如果 A 是方阵且非奇异,则 pinv(A) 只是一种成本比较高的计算 inv(A) 的方式。但是,如果 A 不是方阵,或者是方阵且奇异,则 inv(A) 不存在。在这些情况下,pinv(A) 拥有 inv(A) 的部分(但非全部)属性:

此处,AB 和 BA 是埃尔米特矩阵。伪逆计算基于 svd(A)。该计算将小于 atol 或 rtol 的奇异值视为零。

# 算法

pinv 通过奇异值分解来形成 A 的伪逆。S 对角线上小于 tol 的奇异值被视为零,而 A 的表示变成:

因此 A 的伪逆等于:

# 另请参阅

inv