标题已经解释了。如果我需要找到矩阵的逆矩阵,我有什么理由使用<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
的速度和准确性,而是inv
和inv
之间的差异来计算矩阵的真逆。
答案 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])
似乎两种方法中哪一种最快取决于矩阵大小。例如,inv
使用n = 255
的速度较慢,n = 256
速度较慢。
总之,根据对您重要的内容选择方法。对于大多数预期目的,这两种方法是相同的。
请注意,如果您使用的是严重缩放的矩阵,svd
和pinv
可能会很有用。如果真的非常重要,您应该考虑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}}似乎比我预期的更准确。也许有人可以重新评估一下。 ;)