Jam*_*ame 8 matlab image-processing linear-algebra svd
我有一个线性方程,如
Ax=b
Run Code Online (Sandbox Code Playgroud)
其中A是满级矩阵,其大小是512x512.b是一个矢量512x1.x是未知的矢量.我想找到x,因此,我有一些选择这样做
1.使用正常的方式
inv(A)*b
Run Code Online (Sandbox Code Playgroud)
2.使用SVD(奇异值分解)
[U S V]=svd(A);
x = V*(diag(diag(S).^-1)*(U.'*b))
Run Code Online (Sandbox Code Playgroud)
两种方法都给出了相同的结果.那么,使用SVD解决的好处是什么Ax=b,特别是在A2D矩阵的情况下呢?
And*_*uri 13
欢迎来到数值方法的世界,让我成为您的向导.
作为这个世界上的新人,你想知道,"为什么我会用这个SVD的东西做一些困难而不是那么常见的逆转?我会在Matlab中尝试一下!"
并没有找到答案.也就是说,因为你不是在看问题本身!当你有一个病态的矩阵时会出现问题.然后在数值上不可能计算逆.
例:
A=[1 1 -1;
1 -2 3;
2 -1 2];
Run Code Online (Sandbox Code Playgroud)
尝试使用反转此矩阵inv(A).你会变得无限.也就是说,因为矩阵的条件数非常高(cond(A)).
但是,如果您尝试使用SVD方法(b=[1;-2;3])解决它,您将得到一个结果.这仍然是一个热门的研究课题.解决具有病态数字的Ax = b系统.
正如@Stewie Griffin所说,最好的方法是mldivide,它背后有几件事情.
(是的,我的例子不是很好,因为X的唯一解决方案是INF,但在这个YouTube视频中有更好的例子)
inv(A)*b有几个负面的.主要的一点是它明确地计算了倒数A,这对时间要求很高,如果值变化很多个数量级,可能会导致不准确.
虽然它可能比inv(A)*b使用更好,svd但这里不是"正确的"方法.MATLAB方法是使用mldivide,\.使用这个,MATLAB选择最佳算法来根据其性质(Hermation,上Hessenberg,实对角和正对角线,对称,对角线,稀疏等)求解线性系统.通常,解决方案将是具有部分置换的LU三角剖分,但它会有所不同.您将很难击败mldivide的MATLAB实现,但svd如果您实际调查,使用可能会让您更深入地了解系统的属性U, S, V.如果您不想这样做,请使用mldivide.