首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB中最有效的矩阵求逆

MATLAB中最有效的矩阵求逆
EN

Stack Overflow用户
提问于 2011-02-15 21:20:52
回答 4查看 30.6K关注 0票数 7

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

代码语言:javascript
复制
Ai = inv(A)
% should be the same as:
Ai = A^-1

MATLAB通常会通知我,这不是最有效的倒置方法。那么哪个更有效率呢?如果我有一个方程系统,使用/,\运算符可能是。但有时我需要在其他计算中使用逆运算。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-15 23:36:25

我建议使用svd (除非你非常确定你的矩阵不是病态的)。然后,根据奇异值决定要采取的进一步操作。这可能听起来像是一种“过度杀伤力”的方法,但从长远来看,它会得到回报的。

现在,如果你的矩阵A实际上是可逆的,那么Apseudo inverseinv(A)重合,然而,如果你接近“奇点”,你将很容易做出适当的决定,如何进行实际的pseudo inverse。当然,这些决定将取决于您的应用程序。

添加了一个简单的例子:

代码语言:javascript
复制
> 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
票数 11
EN

Stack Overflow用户

发布于 2011-02-15 21:34:38

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

我会推荐LU分解而不是全逆。如果这就是MATLAB所说的,我同意。

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

票数 4
EN

Stack Overflow用户

发布于 2015-09-24 04:47:49

如果你只需要倒数,那么就这么做,它在数值上会比inv(A)更稳定:

代码语言:javascript
复制
inv_A = 1\A;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5004148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档