rst*_*rst 5 matlab matrix linear-algebra
标题已经解释了.如果我需要找到矩阵的逆矩阵,有什么理由我应该使用A\eye(size(A))而不是inv(A)?在你问之前:是的,我真的需要逆,不仅仅是计算.
PS:
isequal(inv(A), A\eye(size(A)))
ans =
0
Run Code Online (Sandbox Code Playgroud)
那么哪一个更准确?
更新:这个问题已被关闭,因为它似乎是" 为什么在MATLAB中调用如此缓慢和不准确 " 这一问题的重复.这个问题在这里通过没有解决的速度,也没有功能的accuarcy显著不同,inv但差别inv并.\eye计算矩阵的逆真实.
让我们忽略性能(速度)和最佳实践.
eps(n)是一个命令,它返回到nMATLAB中下一个更大的双精度数的距离.所以,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
Run Code Online (Sandbox Code Playgroud)
对于整数,您可以使用的最大数字精度高于两个矩阵之间的最大差异,为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
Run Code Online (Sandbox Code Playgroud)
精度高于两种方法之间最大差异的最高整数为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])
Run Code Online (Sandbox Code Playgroud)
似乎两种方法中哪一种最快取决于矩阵大小.例如,使用inv速度较慢n = 255,但速度较快n = 256.
总之,根据对您来说重要的事情选择方法.对于大多数预期目的,这两种方法是相同的.
请注意,如果您正在处理严重缩放的矩阵svd,pinv可能会感兴趣.如果它真的非常重要,你应该考虑使用符号工具箱.
我知道你说你"实际上需要反向",但我不能让这一点没有说明:使用inv(A)*b永远不是解决线性方程的最佳方法!我不会进一步解释,因为我认为你已经知道了.
如果需要逆,则应该使用inv.
逆数是通过 LU 分解计算的,而反斜杠运算mldivide符根据矩阵的属性使用不同的方法计算线性系统的解A(请参阅https://scicomp.stackexchange.com/a/1004),这可以产生更少的结果准确的逆结果。
应该注意的是,如果您想求解线性系统,使用( )计算可能会更快、更准确。MATLAB 文档基本上是一个重大警告,不要使用它来求解线性系统。mldivide\invinv