在本节中,我们将简要讨论计算稠密矩阵的奇异值和奇异向量的方法。 这些方法有时被称为变换方法。 其中一些或全部方法已在LAPACK、ScaLAPACK以及MATLAB的svd命令中实现。[1]
虽然可以将第4.2节中的变换方法应用于其中一个厄米矩阵A^* A、AA^*或H(A),但实际使用的方法是专门为SVD设计的,因此更高效和准确。
最常见的变换方法分三个阶段计算瘦SVD,如下所示。 (它们可以很容易地修改以计算完整的SVD,或者仅计算选定的奇异值和/或奇异向量,但为了简单起见,我们只介绍瘦SVD。)
第一阶段,即双对角化阶段,通过LAPACK例程xGEBRD和ScaLAPACK例程PxGEBRD使用一系列\min (m-1,n)个左酉Householder反射和n-2个右酉Householder反射实现,成本为4n^2(m-\frac{1}{3}n)次浮点运算。 如果只需要奇异值,第二阶段的成本仅为O(n^2),远低于第一阶段的成本,第三阶段则省略。 如果需要所有左和右奇异向量,成本则强烈依赖于所选算法,如下所述。
第二阶段的算法类似于第4.2节中讨论的对称三对角特征问题的算法,下面概述了一些差异。
目前,最快的串行或共享内存并行稠密SVD例程是LAPACK的xGESDD,但更快的正在开发中。 最快的分布式内存并行稠密SVD例程是ScaLAPACK的PxGESVD,同样,更好的也在开发中。
分治法由LAPACK计算例程xBDSDC实现,该例程被LAPACK驱动例程xGESDD用于计算稠密矩阵的SVD。 xGESDD是目前LAPACK中稠密矩阵SVD的首选算法。
最近在[168,128,358,356]中的进展承诺了一种算法,该算法每个奇异三元组的工作时间为O(n),同时保证正交性,但尚未完成。完成后,LAPACK和ScaLAPACK都将提供这种算法,它应该是所有情况下的最快算法。
如果A是带状的,第一阶段可以通过LAPACK计算例程xGBBRD更便宜地执行,但没有可用的LAPACK驱动例程。
最后,我们提到用于SVD的雅可比方法[114,198]。 这种变换方法反复将A右乘以基本正交矩阵(雅可比旋转),直到A收敛到U \Sigma;雅可比旋转的乘积是V。雅可比比上述任何变换方法都慢(它可以做到运行时间大约是QR的两倍[136]),但有一个有用的特性,即对于某些A,它可以比上述任何方法更准确地提供极小的奇异值及其奇异向量,前提是它得到了适当的实现[118,115]。