我有一个问题,我需要对大量小的 Hermitian 矩阵进行对角化。通常,矩阵的大小在 4 到 64 之间(偏向低端),矩阵的数量约为数百万。然后重复很多次,所以我一直在试图找出解决这个问题的最佳方法。我能够收集到的大多数性能信息似乎都集中在明显更大的矩阵的情况上。
所以问题是:是否有一种算法(或其实现)特别适合对角化小(Hermitian)矩阵?
我有一个问题,我需要对大量小的 Hermitian 矩阵进行对角化。通常,矩阵的大小在 4 到 64 之间(偏向低端),矩阵的数量约为数百万。然后重复很多次,所以我一直在试图找出解决这个问题的最佳方法。我能够收集到的大多数性能信息似乎都集中在明显更大的矩阵的情况上。
所以问题是:是否有一种算法(或其实现)特别适合对角化小(Hermitian)矩阵?
让我添加一些注释来解释为什么在所描述的范围内(4 到 64 阶)没有比通常方法更好的“小”矩阵方法:用酉相似变换(直接步骤)对 Hermitian 矩阵进行三对角化,然后迭代应用类似 QR 的操作来接近对角线限制。
如果仅需要特征值(对角化矩阵),则可以使用 Householder 变换将其简化为三对角形式(复数)乘法,或如果还需要特征向量(酉相似变换),则进行乘法运算。此归约步骤的复杂性优于迭代步骤的复杂性,即“即使在高精度的情况下”(Reif,1999)如果只需要特征值(增加一个因子如果也需要特征向量)。所以在任何情况下,通常的组合复杂性是具有适度的领先系数。
寻找特征值在理论上当然等同于获得特征多项式的根,并且在上一个答案的早期部分概述了它们的有效等价性(带有参考链接) 。该答案的其余部分解释了为什么与经过验证的迭代方法相比,6 级及以上的直接方法是不切实际的。
对于 2x2 矩阵,使用二次公式的稳定形式直接获得(实)特征值当然是有意义的。或许可以使用Cardano 的三次方根公式来求解 3x3 矩阵的特征值,或者如果我们要避免复杂的算术,也许可以使用 Viète 的公式。
但是,直接方法的“花园小径”突然变窄了!虽然一般四次可以用根式(法拉利方法)求解,一般五次多项式可以用带根式求解,但这些方法需要求解较低次数的“辅助多项式”。复杂的算术和监视浮点实现中的重要性损失使这种麻烦更加复杂。
6 阶及以上的情况更加不吉利,因为需要至少两个参数的奇异函数来代替单个参数。此外,可以为可变程度编码的已知方法涉及一个反复试验的元素来定位所有的根。
相比之下,通常的方法适用于可变订单没有明显的困难,并有效地利用了小在时间和空间上。
适合平台的密集线性代数(包括特征求解器)最有效的包是 LAPACK 库。http://en.wikipedia.org/wiki/LAPACK 最先进的每一项改进都很快反映在这个库中,并且花费了大量精力来调整内核以在所有平台上达到最佳性能。