例如,MATLAB 如何计算给定矩阵的 SVD?我假设答案可能涉及计算 的特征向量和特征值A*A'
。如果是这样的话,我也想知道它是如何计算的?
在实践中如何计算矩阵的 SVD
计算科学
线性代数
矩阵
2021-11-26 03:15:27
2个回答
除了(现在是经典的)Golub-Reinsch 论文Brian 在他的回答中指出(我已经链接到该论文的手册版本),以及Golub-Kahan 的(现在也是经典的)前身论文,还有一些从那时起计算 SVD 的重要进展。首先,我必须总结一下通常的方法是如何工作的。
计算矩阵的 SVD 的想法在性质上类似于用于计算对称矩阵的特征分解的方法(并且,如 OP 中所述,它们之间存在密切关系)。具体来说,分为两个阶段:转换为双对角矩阵,然后找到双对角矩阵的 SVD。这完全类似于首先将对称矩阵简化为三对角形式,然后计算所得三对角的特征分解的过程。
对于计算双对角矩阵的 SVD,一个特别有趣的突破是Jim Demmel 和 Velvel Kahan 的论文,该论文表明,通过适当修改最初在戈卢布-赖因施。随后(重新?)发现了dqd算法,它是 Rutishauser 的旧商差算法的后代。(Beresford Parlett在这里给出了一个很好的讨论.) 如果没有记错的话,现在这是 LAPACK 内部使用的首选方法。除此之外,一直有可能推导出对称特征问题解决方案的 SVD 版本;例如,有一个分治法的 SVD 版本,以及旧 Jacobi 算法的一个 SVD 版本(在某些情况下可能更准确)。
至于双对角化, Barlow 的论文中概述了一种改进的方法,它比 Golub 和 Reincsh 的原始过程需要更多的工作,但会产生更准确的双对角矩阵。
这通常使用 Golub-Reinsch 算法完成,不,它不涉及计算特征值和特征向量.
看
GH Golub 和 C. Reinsch。奇异值分解和最小二乘解。数值数学 14:403-420, 1970。
许多关于数值线性代数的教科书都讨论了这种材料。