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 算法为例:
它的工作取决于你想要计算的输出(只有S
、S
和V
或S
、V
和U
).
如果要计算 S
和 V
而不执行任何预处理,则所需的工作是 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 分解)。现在您想计算 U
和 S
,这将为您的 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。它们与上述算法大致相同。
希望这对您有所帮助。
具体来说,下面两种代码可以理想地得到相同的S和V。但是,在 Matlab 中,第二个的速度通常比第一个快。有人可以告诉我原因吗? 此外,哪种方法在数值上更稳定? 谢谢
[~,S,V] = svd(B,'econ');
[Qc,Rc] = qr(B',0);
[U,S,~] = svd(Rc,'econ');
V = Qc*U;
第二种方法不一定要更快。对于几乎平方的矩阵,它可能会更慢。以 Golub-Reinsch SVD 算法为例:
它的工作取决于你想要计算的输出(只有S
、S
和V
或S
、V
和U
).
如果要计算 S
和 V
而不执行任何预处理,则所需的工作是 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 分解)。现在您想计算 U
和 S
,这将为您的 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。它们与上述算法大致相同。
希望这对您有所帮助。