2026a

# inv


矩阵求逆

函数库: TyMath

# 语法

Y = inv(X)

# 说明

Y = inv(X) 计算方阵 X 的 逆矩阵。示例

  • X^(-1) 等效于 inv(X);
  • x = A\b 的计算方式与 x = inv(A)*b 不同,建议用于求解线性方程组。

# 示例

逆矩阵

计算一个 3×3 矩阵的逆矩阵。

using TyMath
X = [1 0 2; -1 5 0; 0 3 -9]
X = 3×3 Matrix{Int64}:
1  0   2
-1  5   0
0  3  -9
Y = inv(X)
Y = 3×3 Matrix{Float64}:
0.882353   -0.117647    0.196078
0.176471    0.176471    0.0392157
0.0588235   0.0588235  -0.0980392

检查结果。理想情况下,Y*X 将生成单位矩阵。由于 inv 使用浮点计算执行矩阵求逆,因此,实际上 Y*X 接近但不完全等于单位矩阵 eye(size(X))。

Y*X
ans = 3×3 Matrix{Float64}
1.0  0.0  -2.22045e-16
0.0  1.0  -5.55112e-17
0.0  0.0   1.0
线性方程组求解

了解为何通过使用 inv(A)*b 求逆矩阵对线性方程组求解不如使用反斜杠运算符(即 x = A\b)直接求解。

创建一个 500 阶的随机矩阵 A,其条件数 cond(A) 为 1e10,并且其范数 opnorm(A) 为 1。精确解 x 是一个长度为 500 的随机向量,并且右侧为 b = A*x。因此,线性方程组未正确设置条件但一致。

using TyMath
using TyBase
n = 500
Q = orth(randn(n,n))
d = logspace(0,-10,n)
A = Q*diagm(d)*Q'
x = randn(n,1)
b = A*x

通过反转系数矩阵 A 对线性方程组 A*x = b 求解。使用@time获取时间等信息。

@time y = inv(A)*b;
0.151880 seconds (443.98 k allocations: 27.503 MiB, 16.89% gc time, 92.08% compilation time)

求计算的绝对误差和残差。

err_inv = norm(y-x)
err_inv = 2.7399366581830265e-6
res_inv = norm(A*y-b)
res_inv = 2.2689752332406378e-7

现在,使用反斜杠运算符 \ 对同一个线性系统求解。

@time z = A\b;
0.040317 seconds (4 allocations: 1.915 MiB)
err_bs = norm(z-x)
err_bs = 2.319273592366519e-6
res_bs  = norm(A*z-b)
res_bs  = 1.8711612283282207e-15

反斜杠计算方法速度更快,而且残差减少了几个数量级。err_inv 和 err_bs 均为 1e-6 的阶数这个事实直接反映了矩阵的条件数。

此示例的行为非常常见。使用 A\b(而非 inv(A)*b)的速度要快两至三倍,并且会基于计算机准确度生成残差(相对于数据量值而言)。

# 输入参数

X - 输入矩阵
方阵

指定为方阵。如果 X 未正确缩放或接近奇异矩阵,inv 计算的数值将不准确。使用 rcond 或 cond 检查矩阵的条件数。

数据类型: Float16 | Float32 | Float64 | Int8 | Int16 | Int32 | Int64 | Int128 | Complex

复数支持:

# 详细信息

矩阵求逆

对于矩阵 X,如果存在一个具有相同大小的矩阵 Y 以便 (其中 是 n×n 单位矩阵),则该矩阵为可逆矩阵。矩阵 Y 称为 X 的逆矩阵。

没有逆矩阵的矩阵是奇异矩阵。对于方阵,仅当其行列式恰好为零时,它才是奇异矩阵。

# 提示

很少需要为某个矩阵构造显式逆矩阵。当解算线性方程组 Ax = b 时,往往会错误使用 inv。对该方程求解的方法之一是使用 x = inv(A)*b。从执行时间和数值准确性方面而言,一种更好的方法是使用矩阵反斜杠运算符,即 x = A\b。这会使用高斯消去法求解,而不必显式构造逆矩阵。

# 算法

inv 执行输入矩阵的 LU 分解(如果输入矩阵是 Hermitian 矩阵,则执行 LDL 分解)。然后它使用结果来形成线性方程组,其解为矩阵求逆 inv(X)。对于稀疏输入,inv(X) 将创建稀疏单位矩阵并使用反斜杠,即 X\speye(size(X))。

# 另请参阅

pinv | lscov