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 仍然是 m x n。但是 如果 m 大于 n,您可以将 R 简化为 n x n 矩阵(称为薄 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 双因子分解和 SVD 以使其更快,但这完全取决于您的矩阵维度。

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

希望这对您有所帮助。