MATLAB中最有效的矩阵求逆

MATLAB中最有效的矩阵求逆,matlab,matrix,linear-algebra,matrix-inverse,Matlab,Matrix,Linear Algebra,Matrix Inverse,在MATLAB中计算某个方阵A的逆矩阵时,使用 Ai = inv(A) % should be the same as: Ai = A^-1 MATLAB通常会通知我,这不是最有效的反转方法。 那么什么更有效率呢?如果我有一个方程组,使用/,\运算符可能是。 但有时我需要其他计算的相反结果 什么是反转最有效的方法?我认为LU分解比反转更有效(如果使用旋转,可能更稳定)。如果需要求解多个右手边向量,它尤其有效,因为一旦有了LU分解,就可以根据需要对每个向量进行前后替换 我建议LU分解优于全逆。我

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

Ai = inv(A)
% should be the same as:
Ai = A^-1
MATLAB通常会通知我,这不是最有效的反转方法。 那么什么更有效率呢?如果我有一个方程组,使用/,\运算符可能是。 但有时我需要其他计算的相反结果


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

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

我建议LU分解优于全逆。我同意MATLAB的说法


更新:3x3矩阵?如果需要的话,你可以用手把它转换成封闭的形式。只需先检查行列式,确保它不是单数或近似单数。

如果没有一种聪明的方法来完成所有计算,而不显式形成逆,那么您必须使用“inv”函数。当然,你可以用你的矩阵和单位矩阵来解一个线性系统,但是这样做没有什么好处

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

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

如果只需要求逆,则只需求逆,它在数值上比inv(A)更稳定:


你在做什么需要反向的计算?你知道你的矩阵吗?在我的例子中,我需要对一组点应用3x3投影变换矩阵的逆。这是一个非常小的矩阵,因此inv(a)可以很好地使用。然而,我可以想象计算一些更大矩阵的逆矩阵,然后我也将其应用于一组(高维)点。在运行时方面,哪种方法最快?@ptikobj:在什么上下文中最快?如果不知道完全满足的要求,很难说。也许你可以问一个新问题,在那里你可以更详细地解释你的背景。谢谢
inv_A = 1\A;