2011-02-15 133 views
6

当计算在MATLAB一些方阵A的逆,采用最有效的逆矩阵在MATLAB

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

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

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

+0

什么计算是你这需要一个逆向吗?你对矩阵有什么了解吗? – 2011-02-15 13:23:18

+0

在我的情况下,我需要将3x3投影变换矩阵的逆应用于一组点。这是一个非常小的矩阵,因此inv(A)应该很好用。然而,我可以想象计算一些更大的矩阵的逆矩阵,然后我也适用于一组(更高维)的点。 – ptikobj 2011-02-15 13:27:49

回答

10

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

现在,如果你的矩阵A实际上是可逆的,则A巧合与inv(A)pseudo inverse,但是如果你是接近“奇点”,你会很容易做出适当的决定如何进行实际上使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 
3

我认为LU分解比倒置效率更高(如果使用pivoting可能会更稳定)。如果你需要解决多个右手边向量,它的工作特别好,因为一旦你有LU分解,你可以根据需要为每个向前做替换。

我建议LU分解完全相反。我同意这是否是MATLAB所说的。

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

0

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

3

如果你只需要逆然后就做什么,这将是数值上比INV(A)更稳定:

inv_A = 1\A;