我被赋予了使用 Lanczos 方法实现 SVD 的任务。
据我了解,它仅有助于使用一系列三对角矩阵找到特征值,但我不知道如何将其应用于实际计算 SVD。
我是否需要用三对角线逼近给定的矩阵,然后用不同的算法或不同的东西计算 SVD?
我被赋予了使用 Lanczos 方法实现 SVD 的任务。
据我了解,它仅有助于使用一系列三对角矩阵找到特征值,但我不知道如何将其应用于实际计算 SVD。
我是否需要用三对角线逼近给定的矩阵,然后用不同的算法或不同的东西计算 SVD?
理论上,你可以“摆正”正如 Jan 在他的回答中所说明的那样,但在实际计算 SVD 时你真的不想这样做,因为它会付出巨大的准确性代价。利用标准 Lanczos 三对角化的更好方法是执行矩阵的三对角化. 这避免了平方的精度损失,并且您可以从这个较大矩阵的特征分解中提取奇异值及其伴随的左右向量。
理想情况下,您正在寻找的是Lanczos bidiagonalization。Lanczos 双对角化与循环矩阵的三对角化密切相关,但也可以单独推导出来。
PROPACK是现有软件包的一个很好的例子,它为 SVD 实现了 Lanczos 双对角化。听起来您需要自己实现它,但我在这里链接到的页面提供了许多介绍算法方法的论文。您可能会忽略作为 PROPACK 包的关键部分的“部分重新正交化”并专注于双对角化。
当然,如果这不是家庭作业或教育练习,那么我建议考虑使用PROPACK 或相关软件包,而不是自己实施!没有必要重新发明轮子。SLEPc还包括一个 Lanczos SVD 实现。SLEPc 文档也很好地介绍了 Lanczos 双对角化。