先不考虑性能(速度)和最佳实践。
eps(n)
是 MATLAB 中的一个命令,用于返回 n
下一个更大的双精度数与 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时,您可以使用的具有更高精度的最大数字为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](https://istack.dev59.com/5j9F5.webp)
看起来,哪种方法更快取决于矩阵的大小。例如,对于n=255
,使用inv
会更慢,但对于n=256
,则更快。
总之,选择方法要基于你觉得重要的因素。对于大多数目的,这两种方法是相同的。
请注意,如果你正在处理比例不良的矩阵,则svd
和pinv
可能会很有用。如果它真的非常重要,你应该考虑Symbolic工具箱。
我知道你说你“实际上需要倒数”,但我不能不说出:使用inv(A)*b
永远不是解线性方程组的最佳方法!我不会再详细解释了,因为我认为你已经知道这一点。
\
<- 这会进行非常高级的数学运算,以便得到更好的解决方案。 - Ander Biguri