我将实现一个函数来对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,但他们只适用于正定矩阵。是否有任何我找不到的库,甚至是已编写的单个函数?
答案 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就像要求不使用正弦,余弦和对数的标准库一样愚蠢。