在 MATLAB 中计算某个方阵 A 的逆矩阵时,使用以下命令:
Ai = inv(A)
% should be the same as:
Ai = A^-1
MATLAB通常会提示我这不是最有效的求逆方式。 那么什么更有效呢?如果我有一个方程组,使用/、\运算符可能是更好的选择。 但有时我需要用到逆矩阵进行其他计算。
什么是最有效的求逆方法?
Ai = inv(A)
% should be the same as:
Ai = A^-1
MATLAB通常会提示我这不是最有效的求逆方式。 那么什么更有效呢?如果我有一个方程组,使用/、\运算符可能是更好的选择。 但有时我需要用到逆矩阵进行其他计算。
什么是最有效的求逆方法?
我建议使用 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
如果只需要求逆矩阵,那么只需执行以下操作,这比求inv(A)在数值上更加稳定:
inv_A = 1\A;
如果没有一种聪明的方法可以在不显式形成逆矩阵的情况下进行所有计算,那么您必须使用“inv”函数。当然,您可以使用您的矩阵和单位矩阵解线性系统,但这样做并没有任何好处。