【问题标题】:Most efficient matrix inversion in MATLABMATLAB 中最有效的矩阵求逆
【发布时间】:2011-02-15 13:20:52
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你在做什么需要逆运算?你知道你的矩阵吗?
  • 就我而言,我需要将 3x3 投影变换矩阵的逆矩阵应用于一组点。这是一个非常小的矩阵,因此 inv(A) 应该可以很好地使用。但是,我可以想象计算一些更大矩阵的逆矩阵,然后我也将其应用于一组(更高维)点。

标签: matlab matrix linear-algebra matrix-inverse


【解决方案1】:

我建议使用svd(除非你真的绝对确定你的矩阵不是病态的)。然后,根据奇异值,您决定要采取的进一步行动。这听起来像是一种“矫枉过正”的方法,但从长远来看,它会有所回报。

现在,如果您的矩阵 A 实际上是可逆的,那么 Apseudo inverseinv(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

【讨论】:

  • 就运行时间而言,哪种方法最快?
  • @ptikobj:在什么情况下最快?如果不知道完全填写的要求,这是不可能说的。也许您可以提出一个新问题,在其中更详细地解释您的上下文。谢谢
【解决方案2】:

我认为 LU 分解比反转更有效(如果使用旋转,可能更稳定)。如果您需要求解多个右手边向量,它尤其适用,因为一旦您进行了 LU 分解,您就可以根据需要对每个向量进行前向反向替换。

我建议使用完全逆分解的 LU 分解。如果这就是 MATLAB 所说的,我同意。

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

【讨论】:

    【解决方案3】:

    如果你只需要逆然后就做,它会比 inv(A) 在数值上更稳定:

    inv_A = 1\A;
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        • 2015-09-23
        • 2013-02-28
        • 2016-10-10
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        相关资源
        最近更新 更多