【问题标题】:Cholesky factorization of semi-definite matrices in C++C++中半定矩阵的Cholesky分解
【发布时间】:2011-10-30 01:23:36
【问题描述】:

我要实现一个函数来对 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,但它们仅适用于正定矩阵。有没有我没有找到的库,甚至已经写过的单个函数?

【问题讨论】:

    标签: c++ matrix linear-algebra


    【解决方案1】:

    半定矩阵 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 I 是定正的。

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

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

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

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

    【讨论】:

    • 感谢您的帮助,我想我可能会在星期一试一下要求编译器,但我并没有屏住呼吸。我将尝试使用 Crout 算法的 Eigen 或 MTL 实现来执行此操作,看看它是如何工作的。
    • 请注意,对于某些用途,非唯一性并不重要,例如,一种应用是模拟多向矢量,那么任何解决方案都可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 2015-06-18
    • 2017-10-24
    • 2017-11-04
    • 1970-01-01
    相关资源
    最近更新 更多