Matlab 使用SVD解决Ax=b有什么好处

Matlab 使用SVD解决Ax=b有什么好处,matlab,image-processing,linear-algebra,svd,Matlab,Image Processing,Linear Algebra,Svd,我有一个线性方程,比如 Ax=b 其中A是满秩矩阵,其大小为512x512b是512x1的向量x是未知向量。我想找到x,因此,我有一些选项可以选择 1.使用正常方式 inv(A)*b 2.使用SVD(奇异值分解) 两种方法得出的结果相同。那么,使用奇异值分解来求解Ax=b,特别是在A是二维矩阵的情况下,有什么好处呢?inv(A)*b有几个负面影响。主要的一点是,它显式计算A的倒数,这既需要时间,而且如果值变化了许多数量级,可能会导致不准确 虽然它可能比inv(A)*b更好,但在这里使用svd

我有一个线性方程,比如

Ax=b
其中
A
是满秩矩阵,其大小为
512x512
b
512x1
的向量<代码>x是未知向量。我想找到
x
,因此,我有一些选项可以选择

1.使用正常方式

inv(A)*b
2.使用SVD(奇异值分解)

两种方法得出的结果相同。那么,使用奇异值分解来求解
Ax=b
,特别是在
A
是二维矩阵的情况下,有什么好处呢?

inv(A)*b
有几个负面影响。主要的一点是,它显式计算
A
的倒数,这既需要时间,而且如果值变化了许多数量级,可能会导致不准确


虽然它可能比
inv(A)*b更好,但在这里使用
svd
并不是“正确”的方法。MATLAB实现这一点的方法是使用,
\
。利用这一点,MATLAB根据线性系统的性质(Hermation、upper Hessenberg、实对角和正对角、对称、对角、稀疏等)选择最佳算法来求解线性系统。通常,解决方案是局部置换的LU三角剖分,但它是不同的。您将很难击败MATLABs的mldivide实现,但是如果您实际调查
U,S,V
,使用
svd
可能会让您更深入地了解系统的属性。如果你不想这样做,就用mldivide吧。

欢迎来到数值方法的世界,让我来做你的向导

作为这个世界上的一个新人,你会想,“为什么我要用这个奇异值分解(SVD)的东西来做这么困难的事情,而不是用这么广为人知的逆运算?!我要在Matlab中试试!”

没有找到答案。也就是说,因为你不是在看问题本身!当你有一个病态矩阵时,问题就会出现。那么,在数值上不可能计算逆矩阵

例如:

A=[1    1  -1;
   1   -2   3;
   2   -1   2];
尝试使用
inv(A)
反转此矩阵。你会得到无限。 也就是说,因为矩阵的精度非常高(
cond(A)

但是,如果您尝试使用SVD方法(
b=[1;-2;3]
)求解它,您将得到一个结果。这仍然是一个热门的研究课题。求解具有病态数的Ax=b系统

正如@Stewie Griffin所建议的,最好的方法是
mldivide
,就像它背后所做的那样


(是的,我的例子不是很好,因为X的唯一解决方案是INF,但有一个更好的例子)

SVD让您更好地了解解决方案的准确性,并很好地处理奇异和近似奇异的情况。一个很好的替代方法是完全或部分旋转的高斯消去法。谢谢Stewie Griffin。作为我的实验结果,我发现SVD与inv(A)*b方法相比往往给出最佳解。我无法解释原因。你能给我一些关于SVD与inv(A)*b比较的好处的参考吗?让我来做你的向导。洛芒+1.
A=[1    1  -1;
   1   -2   3;
   2   -1   2];