C ++中半定矩阵的Cholesky分解

时间:2011-08-18 18:41:14

标签: c++ matrix linear-algebra

我将实现一个函数来对C ++中的半定矩阵进行Cholesky分解,并且想知道是否存在已经优化的库/任何东西。它与本文所描述的相似或类似:

http://www.sciencedirect.com/science/article/pii/S0096300310012713

这是正定的一个例子,但它对正半正定不起作用:http://en.wikipedia.org/wiki/Cholesky_decomposition#The_Cholesky.E2.80.93Banachiewicz_and_Cholesky.E2.80.93Crout_algorithms

程序必须是C ++,没有C / FORTRAN库(想想尖头老板给出指示),这意味着ATLAS,LAPACK等。出局。我查看了MTL + Boost,但他们只适用于正定矩阵。是否有任何我找不到的库,甚至是已编写的单个函数?

1 个答案:

答案 0 :(得分:3)

Cholesky分解半定矩阵的问题是1)它不是唯一的2)Crout的算法失败。

分解的存在通常通过限制参数非建设性地证明(如果M_n - > M,并且M_n = U ^ t_n U_n,那么|| U_n || = || M_n || ^ 1/2其中||。|| = Hilbert-Schmidt范数,U_n是有界序列。提取子序列以找到满足U ^ t U = M和U三角形的极限U.)

我发现在我感兴趣的情况下,将对角线元素乘以1 + epsilon,将epsilon小(乘以机器epsilon几千倍)得到完全可接受的分解是令人满意的。

实际上,如果M是正半正定的,那么对于每个epsilon> 0,M + epsilon我肯定是肯定的。

当epsilon变为零时,方案会收敛,您可以考虑计算多个epsilons的分解并执行Richardson外推。

至于肯定的情况,你可以自己实现Crout的算法(在Numerical Recipes中有一个示例代码),但我强烈建议不要自己编写,并建议使用LAPACK。

这可能涉及让老板为英特尔MKL付费,如果他担心LAPACK的可能性较差。大部分时间我都听过这样的演讲,理由是“但是我们无法控制代码,我们确实想自己编写,以便我们可以在出现问题时对其进行调试”。愚蠢的论点。 LAPACK已有40年历史,经过全面测试。

要求不使用LAPACK就像要求不使用正弦,余弦和对数的标准库一样愚蠢。