# 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 中小于容差的奇异值视为零。
# 示例
使用伪逆求解线性方程组
比较通过反斜杠 (\) 和 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 的伪逆等于: