在MATLAB中找到矩阵的逆矩阵,是inv(A)还是A \ eye(size(A))更精确?

时间:2016-01-27 10:02:08

标签: matlab matrix linear-algebra

标题已经解释了。如果我需要找到矩阵的逆矩阵,我有什么理由使用<form method="GET"> <input type="submit" name="price" value="ASC">Price Low to High</input> <input type="submit" name="price" value="DESC" >Price High to Low</input> <input type="submit" name="price" value="" >Default</input> </form> 而不是A\eye(size(A))? 在你问之前:是的,我真的需要逆,不仅仅是计算。

PS:

inv(A)

哪一个更准确?

更新:此问题已被关闭,因为它似乎与问题“why is inv in MATLAB so slow and inaccurate”重复。这里的问题显着不同,因为没有解决函数isequal(inv(A), A\eye(size(A))) ans = 0 的速度和准确性,而是invinv之间的差异来计算矩阵的真逆。

3 个答案:

答案 0 :(得分:7)

让我们忽略性能(速度)和最佳实践。

eps(n)是一个命令,它返回到MATLAB中n的下一个更大的双精度数的距离。因此,eps(1) = 2.2204e-16表示1之后的第一个数字是1 + 2.2204e-16。同样,eps(3000) = 4.5475e-13。现在,让我们看一下计算的精确度:

n = 100;
A = rand(n);
inv_A_1 = inv(A);
inv_A_2 = A \ eye(n);

max(max(abs(inv_A_1-inv_A_2)))
ans =
   1.6431e-14

eps(127) = 1.4211e-14
eps(128) = 2.8422e-14

对于整数,您可以使用的最大数字精度高于两个矩阵之间的最大差值为127.

现在,让我们检查一下当我们尝试从两个逆矩阵重建单位矩阵时的准确性。

error_1 = max(max(abs((A\eye(size(A))*A) - eye(size(A)))))
error_1 =
   3.1114e-14
error_2 = max(max(abs((inv(A)*A) - eye(size(A)))))
error_2 =
   2.3176e-14

精度高于两种方法之间最大差异的最高整数为255.

总之,inv(A)更准确,但是一旦开始使用逆矩阵,它们就可以用于所有预期目的。

现在,让我们来看看这两种方法的表现:

n = fix(logspace(1,3,40));
for i = 1:numel(n)
A = rand(round(n(i)));
t1(i) = timeit(@()inv(A));
t2(i) = timeit(@()A\eye(n(i)));
end
loglog(n,[t1;t2])

enter image description here

似乎两种方法中哪一种最快取决于矩阵大小。例如,inv使用n = 255的速度较慢,n = 256速度较慢。

总之,根据对您重要的内容选择方法。对于大多数预期目的,这两种方法是相同的。

请注意,如果您使用的是严重缩放的矩阵,svdpinv可能会很有用。如果真的非常重要,您应该考虑Symbolic toolbox

我知道你说你“实际上需要反向”,但我不能让这一点没有说明:使用inv(A)*b绝不是解决线性方程的最佳方法!我不会进一步解释,因为我认为你已经知道了。

答案 1 :(得分:4)

如果您需要反向,则应使用inv

反向是通过LU分解计算的,而反斜杠运算符mldivide使用不同的方法计算线性系统的解,具体取决于矩阵A的属性(参见https://scicomp.stackexchange.com/a/1004) ,这可能会产生较不准确的反转结果。

应该注意的是,如果你想解决一个线性系统,使用mldivide\)计算可能会更快,更多准确。 inv的MATLAB文档基本上是一个警告,不要使用inv来解决线性系统。

答案 2 :(得分:2)

只是尝试检查这一点,但不确定它是否完全有用:将逆矩阵结果与其原始版本相乘并检查与单位矩阵的偏差:

inv

{{1}}似乎比我预期的更准确。也许有人可以重新评估一下。 ;)