【问题标题】:Singularity for inverse matrix逆矩阵的奇异性
【发布时间】:2013-06-23 18:23:16
【问题描述】:

作为数据,我得到一个矩阵 A,但在我的算法中,我需要处理它的逆矩阵。我要做的是:

C = inv(A) + B;

然后在另一行中我更新 A。在接下来的循环中,我还需要(更新)A 逆,再次用于该算法。等等。在后来的周期中,我得到了这个:

Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.425117e-019

或者这个:

Warning: Matrix is singular to working precision.

或者这个:

Warning: Matrix is singular, close to singular or badly scaled. Results may be inaccurate. RCOND = NaN.

你能帮我如何避免这种奇点吗?矩阵总是平方的。

【问题讨论】:

  • -1 用于使用 inv @RodyOldenhuis - 你能从这里拿走吗?
  • @Shai 你可能想链接到这个问题:Matlab inverse operation and warning(而不是 Rody 的个人资料),对吧?
  • @EitanT 抱歉。我的意思是this评论
  • 你可以找到here 相当长的讨论,为什么永远不要使用matlab 的inv() 函数。请向我们展示更多算法,以便我们就如何消除 inv 的使用向您提供建议,并用更高效、更健壮的函数代替它。
  • @SamRoberts:逆向有很多理论价值,但没有多少实际价值。 MATLAB 对inv() 的实现并不差,使用它 只是程序设计不佳的标志(在任何非教育环境中)。此声明不限于 MATLAB;它是一系列经过验证的数值数学定理的结果。在有限精度数字系统的上下文中,这就像试图证明aether 优于general relativity

标签: matlab matrix linear-algebra matrix-inverse


【解决方案1】:

您可以向 A 添加一些分钟单位矩阵:

A = A + small_coeff * eye(size(A));

这样得到的矩阵就足够非奇异了

【讨论】:

  • -1:是的,这将使警告消失,但会完全破坏您的结果。试试这个:A = diag([eps(0) eps(0)]); B = A + eps*eye(2); A*inv(B) 结果应该eye(2),但事实并非如此。
  • @Rody Oldenhuis,这只是一个近似值,它自然不适用于小值矩阵。
  • ...这就是他收到警告的原因;奇异的inv(A) 是尝试除以零的矩阵等价物。无论如何,您的解决方案是非通用的,并且可能会破坏他的算法。在调试它之前,我们需要更多地了解算法:)
  • @Rody Oldenhuis,您是否也尝试过“合理”矩阵?
  • 我想说的是,对于 OPs 算法,你不能盲目地假设“合理”的矩阵会总是出现。
猜你喜欢
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
相关资源
最近更新 更多