矩阵对角化的方法有很多种,最广泛使用的可能是 Householder 变换和 QR 算法的结合。
对角化(大的,非稀疏的)实对称矩阵有什么更好的方法吗?优势可能有点模糊,所以我将其定义为快速、数值稳定、不需要大量额外内存并且适合并行化和矢量化。
Meta:我有点担心问这个问题的正确位置,另一个候选人应该是数学交流,他们也有一个数值线性代数标签。
矩阵对角化的方法有很多种,最广泛使用的可能是 Householder 变换和 QR 算法的结合。
对角化(大的,非稀疏的)实对称矩阵有什么更好的方法吗?优势可能有点模糊,所以我将其定义为快速、数值稳定、不需要大量额外内存并且适合并行化和矢量化。
Meta:我有点担心问这个问题的正确位置,另一个候选人应该是数学交流,他们也有一个数值线性代数标签。
QR/Francis 算法是密集特征问题的首选,但也有一些竞争对手:
Jacobi 算法(如QR,另一种算法,名字很不幸,可能与求解线性系统的方法相混淆......)。主要思想:选择的非对角元素;应用合适的 2x2 Givens 旋转将其归零;然后重复。在每次新的迭代中,您在前面的步骤中清零的条目再次变为非零,因此矩阵始终是满的;尽管如此,人们可以证明在不同步骤中如何选择它们的一些假设下,非对角线条目收敛到零。研究稳定性的文献指针:Demmel,Veselic 1992,Jacobi 的方法比 QR 更准确. 从本质上讲,他们表明,当特征值跨越几个数量级时,这种方法对于较小的特征值具有更好的准确性。请注意,从 1992 年到现在,QR 算法有了另一项重大改进(Parlett 和 Dhillon 的 MRRR 方法);我在该领域不够专业,无法判断这是否弥合了差距。
基于加倍迭代的光谱分治算法(不是评论中提到的经典分治算法)。这些算法仅依赖于 BLAS 3 级操作,因此(考虑到产品、反演、投影等的实现,它对通信和缓存问题给予了适当的关注)它们应该更好地扩展到大于几千维的矩阵。 主要思想:对矩阵符号 ,应用牛顿等迭代,在该迭代下,特征向量被保留并且每个特征值收敛到或 ; 然后计算内核确定两个互补不变子空间;将投影到这两个子空间上,然后重复两个较小的问题。研究稳定性的文献指针:Nakatsukasa 和 Higham,2012,Stable and Efficient Spectral Divide and Conquer Algorithms for the Symmetric Eigenvalue Decomposition and the SVD。他们构造了一种不需要矩阵求逆且收敛速度极快的迭代变体,并证明了所得方法的稳定性。
在某些条件下,这两种方法都可以比 QR 更快/更准确;对数值线性代数社区有研究兴趣,但它们不如 QR 成熟,QR 几十年来一直是竞赛的主力,几乎每个人都在数值计算中使用。我不会向只想完成工作的不同领域的从业者推荐使用它们而不是 QR;但是,如果您正在研究特征值方法,或者您遇到 QR 遇到问题的问题,您可能需要尝试它们。
至于实现,LAPACK 包括一个 Jacobi 例程来计算 SVD,*GESVJ
并且 QDWH 的 Matlab 实现(Nakatsukasa 和 Higham 的论文中描述的算法)在Matlab 文件交换上。