在MATLAB中计算某些方阵A的逆矩阵时,使用
Ai = inv(A)
% should be the same as:
Ai = A^-1MATLAB通常会通知我,这不是最有效的倒置方法。那么哪个更有效率呢?如果我有一个方程系统,使用/,\运算符可能是。但有时我需要在其他计算中使用逆运算。
反转的最有效方法是什么?
发布于 2011-02-15 23:36:25
我建议使用svd (除非你非常确定你的矩阵不是病态的)。然后,根据奇异值决定要采取的进一步操作。这可能听起来像是一种“过度杀伤力”的方法,但从长远来看,它会得到回报的。
现在,如果你的矩阵A实际上是可逆的,那么A的pseudo inverse与inv(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发布于 2011-02-15 21:34:38
我认为LU分解比反转更有效(如果你使用旋转,也可能更稳定)。如果您需要求解多个右侧向量,它尤其有效,因为一旦您有了LU分解,您就可以在需要时对每个向量进行前向后向替换。
我会推荐LU分解而不是全逆。如果这就是MATLAB所说的,我同意。
更新: 3x3矩阵?如果需要,您可以手动以封闭形式对其进行反转。只需先检查行列式,确保它不是奇数或近乎奇数。
发布于 2015-09-24 04:47:49
如果你只需要倒数,那么就这么做,它在数值上会比inv(A)更稳定:
inv_A = 1\A;https://stackoverflow.com/questions/5004148
复制相似问题