【问题标题】:Code Analyzer: INV is slow and inaccurate代码分析器:INV 速度慢且不准确
【发布时间】:2013-05-08 20:43:40
【问题描述】:

当我尝试使用 Matlab 的 inv() 操作计算矩阵逆时:

A = rand(10,10);
b = rand(10,1);

C = inv(A);
D = C*b;

我在最后一行收到以下警告:INV 速度慢且不准确。将 A\b 用于 INV(A)*b ,将 b/A 用于 b*INV(A)。

我可以把上面的代码改成:

A = rand(10,10);
b = rand(10,1);

C = inv(A);
D = A\b;

现在我没有收到警告,但我不认为这个解决方案更好。

注意:我需要存储矩阵 A 的逆矩阵以及 inv(A)*c。此外,在我的真实文件中,矩阵 A 的大小可以是 5000 x 5000 甚至更大。

在效率和准确性方面是否有更好的解决方案或者第一种方法可以吗?

【问题讨论】:

标签: matlab linear-algebra numerical-methods matrix-inverse


【解决方案1】:

如果你以后绝对需要逆,那么你必须计算它。如果您以后可以再次使用反斜杠运算符(\)而不是反斜杠,我会远离反斜杠并听取 MATLAB 的建议。出于数字原因,尽可能使用斜杠运算符总是更好,因此第二种方法更好,即使它更慢。

【讨论】:

  • 我同意。此外,tic-toc 表明第二种方法更慢:0.08510.1284
  • @rascob 第二个选项较慢,因为它做更多的工作(inv 和 \ ),但 \ 给出了更准确的答案。
  • @shoelzer 当然,对结果并不感到惊讶 :) 只是想表明,由于无论如何都需要 inv(A),所以第一种方法确实更快。
  • @rascob 对。但即使在某些时候需要inv(A),这里也不需要它。我认为如果可能的话,最好使用A\b
【解决方案2】:

您应该听 Matlab 并使用第二个选项。 inv(A)*bA\b 在底层使用不同的算法计算,\ 确实更准确。

documentation for inv 声明:

在实践中,很少需要形成矩阵的显式逆矩阵。在求解线性方程组 Ax = b 时,经常会出现对 inv 的误用。解决此问题的一种方法是使用 x = inv(A)*b。从执行时间和数值精度的角度来看,更好的方法是使用矩阵除法运算符 x = A\b。这产生了使用高斯消元的解,而不形成逆。更多信息请参见 mldivide()。

【讨论】:

  • 我也有同样的问题,我同时使用了 /` but couldn't resolve my case, not getting accurate value. Also I only want first index only, i.e ans(1)` 。我的代码:inv(-[40 200;1 -1])*(0.9*(2-200))
【解决方案3】:

一些附加信息:

如果你要计算

Ax = b

对于许多不同的b,但使用常量A,您可能需要预先分解A。那就是:

[L U P] = lu(A);
x = (U \ (L \ ( P * b)));

不知道其他领域,但至少在电力系统工程中经常发生这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多