MATLAB中最有效的矩阵求逆

时间:2011-02-15 13:20:52

标签: matlab matrix linear-algebra matrix-inverse

在MATLAB中计算某些方阵A的逆时,使用

Ai = inv(A)
% should be the same as:
Ai = A^-1

MATLAB通常会通知我这不是最有效的反转方式。 那么什么更有效?如果我有一个方程式系统,可能使用/,\运算符。 但有时我需要其他计算的逆。

最有效的反转方式是什么?

4 个答案:

答案 0 :(得分:11)

我建议使用svd(除非你非常确定你的矩阵没有病态)。然后,基于奇异值,您可以决定采取进一步的行动。这听起来像是一种“矫枉过正”的做法,但从长远来看,它会收回成本。

现在,如果您的矩阵A实际上是可逆的,那么pseudo inverse Ainv(A)重合,但如果您接近'奇点',您将很容易做出适当的决定如何继续实际制作pseudo inverse。当然,这些决定取决于您的申请。

添加了一个简单的例子:

> A= randn(3, 2); A= [A A(:, 1)+ A(:, 2)]
A =
  -1.520342  -0.239380  -1.759722
   0.022604   0.381374   0.403978
   0.852420   1.521925   2.374346

> inv(A)
warning: inverse: matrix singular to machine precision, rcond = 0
ans =
   Inf   Inf   Inf
   Inf   Inf   Inf
   Inf   Inf   Inf

> [U, S, V]= svd(A)
U =
  -0.59828  -0.79038   0.13178
   0.13271  -0.25993  -0.95646
   0.79022  -0.55474   0.26040

S =
Diagonal Matrix
  3.6555e+000            0            0
            0  1.0452e+000            0
            0            0  1.4645e-016

V =
   0.433921   0.691650   0.577350
   0.382026  -0.721611   0.577350
   0.815947  -0.029962  -0.577350

> s= diag(S); k= sum(s> 1e-9) % simple thresholding based decision
k =  2

> Ainv= (U(:, 1: k)* diag(1./ s(1: k))* V(:, 1: k)')'
Ainv =
  -0.594055  -0.156258  -0.273302
   0.483170   0.193333   0.465592
  -0.110885   0.037074   0.192290

> A* Ainv
ans =
   0.982633   0.126045  -0.034317
   0.126045   0.085177   0.249068
  -0.034317   0.249068   0.932189

> A* pinv(A)
ans =
   0.982633   0.126045  -0.034317
   0.126045   0.085177   0.249068
  -0.034317   0.249068   0.932189

答案 1 :(得分:4)

我认为LU分解比反转更有效(如果使用旋转,则可能更稳定)。如果您需要解决多个右侧矢量,它的效果特别好,因为一旦您进行了LU分解,您可以根据需要对每个矢量进行前向替换。

我建议在完全反向上进行LU分解。我同意这就是MATLAB所说的。

更新:3x3矩阵?如果需要,您可以以封闭的形式手动反转。首先检查行列式,确保它不是单数或近似单数。

答案 2 :(得分:3)

如果你只需要反转,那么它将在数值上比inv(A)更稳定:

inv_A = 1\A;

答案 3 :(得分:0)

如果没有明确的方法来完成所有计算而没有明确地形成逆,那么你必须使用“inv”函数。你当然可以用你的矩阵和单位矩阵来解决一个线性系统,但是这样做并没有什么可以获得的。