MATLAB中最高效的矩阵求逆方法

7
在 MATLAB 中计算某个方阵 A 的逆矩阵时,使用以下命令:
Ai = inv(A)
% should be the same as:
Ai = A^-1

MATLAB通常会提示我这不是最有效的求逆方式。 那么什么更有效呢?如果我有一个方程组,使用/、\运算符可能是更好的选择。 但有时我需要用到逆矩阵进行其他计算。

什么是最有效的求逆方法?


你需要进行什么需要倒数的计算?你对矩阵有多少了解? - David Heffernan
在我的情况下,我需要将一个3x3投影变换矩阵的逆应用于一组点。这是一个非常小的矩阵,因此可以使用inv(A)。然而,我可以想象计算某些更大的矩阵的逆,然后将其应用于一组(高维)点。 - ptikobj
4个回答

11

我建议使用 svd(除非您确实非常确定矩阵没有奇异性)。然后,根据奇异值,您可以决定采取进一步的操作。这可能听起来有点复杂,但从长远来看,它会产生回报。

现在,如果您的矩阵 A 确实是可逆的,则其 伪逆矩阵inv(A) 相同,但如果接近奇异性,则您很容易做出适当的决策,以实际制作 伪逆矩阵。当然,这些决策将取决于您的应用程序。

补充说明:一个简单的例子:

> 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

就运行时间而言,哪种方法最快? - ptikobj
@ptikobj:最快是在什么情况下?如果不知道要满足的需求,很难回答。也许您可以提出一个新问题,在其中更详细地解释您的上下文。谢谢。 - eat

4
我认为LU分解比求逆更有效(如果使用枢轴选取,则可能更稳定)。特别是当您需要解决多个右手边向量时,它的效果非常好,因为一旦您有了LU分解,您可以根据需要为每个向量执行前向和后向替换。
我建议使用LU分解而不是完全求逆。如果MATLAB也是这样说的话,我同意这种做法。
更新:3x3矩阵?如果需要,您可以手动以闭合形式求逆。只需先检查行列式是否奇异或接近奇异即可。

3

如果只需要求逆矩阵,那么只需执行以下操作,这比求inv(A)在数值上更加稳定:

inv_A = 1\A;

0

如果没有一种聪明的方法可以在不显式形成逆矩阵的情况下进行所有计算,那么您必须使用“inv”函数。当然,您可以使用您的矩阵和单位矩阵解线性系统,但这样做并没有任何好处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接