繁体   English   中英

在Matlab中'qr'和'SVD'之间有什么区别来获得矩阵的单个向量?

[英]What is the difference between 'qr' and 'SVD' in Matlab to get the single vectors of a matrix?

特别地,以下两种代码可以获得相同的S和V。 但是,第二个的速度通常比Matlab中的第一个速度快。 有人可以告诉我原因吗? 而且,哪种方法在数值上更稳定? 谢谢。

[~,S,V] = svd(B,'econ');


[Qc,Rc] = qr(B',0);
[U,S,~] = svd(Rc,'econ');
V = Qc*U;

第二种方法不必更快。 对于几乎平方的矩阵,它可能会更慢。 以Golub-Reinsch SVD算法为例:

它的工作取决于您想要计算的输出(仅SSVSVU )。

如果要在不执行任何预处理的情况下计算SV ,则所需的工作量为4mn ^ 2 + 8n ^ 3

如果在此之前执行QR分解,则所需的工作量为: 2 / 3n ^ 3 + n ^ 2 + 1 / 3n-2,用于Housholder转换。 现在,如果你的矩阵几乎是平方的,即m = n,那么你的增益并不大,因为R仍然是mx n。 但是, 如果m大于n,则可以将R减少为nxn矩阵(称为精简QR分解) 现在你要计算US ,它将为你的SVD算法增加12n ^ 3

所以只有SVD: 4mn ^ 2 + 8n ^ 3

具有QR的SVD: (12 + 2/3)n ^ 3 + n ^ 2 + 1 / 3n-2

然而,大多数SVD算法应该包含一些(R-)双对角化,这将使工作减少到: 2mn ^ 2 + 11n ^ 3

您还可以应用QR,R-bifactorization然后使用SVD使其更快,但这一切都取决于您的矩阵尺寸。

Matlab用于SVD的Lapack库。 您可以在此处查找确切的运行时间。 它们与上述算法大致相同。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM