我正在将 Fortran 程序转换为 C#。这必须一点一点地完成,并在此过程中进行概念证明。
这些初始步骤之一是复制它使用的 IMSL 功能。幸运的是,它只使用了少数几个:一些微不足道的随机数生成,一些微不足道的正态分布反转,还有一个不那么微不足道的:MCHOL。
从文档中:
计算实对称矩阵 A 加上对角矩阵 D 的上三角分解,其中 D 在 Cholesky 分解期间按顺序确定,以使 A + D 非负定。
例程 MCHOL 计算 A + D 的 Cholesky 分解 RTR,其中 A 是对称的,D 是具有足够大对角元素的对角矩阵,使得 A + D 是非负定的。该例程类似于 Gill、Murray 和 Wright(1981 年,第 108-111 页)所描述的例程。但是,在这里,我们允许 A + D 是单数的。
(链接中有更多详细信息和示例)。
对于我的概念证明,我需要能够复制 MCHOL 文档示例中提供的结果:从示例中传递此矩阵:
DATA (A(1,J),J=1,N)/36.0, 12.0, 30.0, 6.0, 18.0/
DATA (A(2,J),J=1,N)/12.0, 20.0, 2.0, 10.0, 22.0/
DATA (A(3,J),J=1,N)/30.0, 2.0, 29.0, 1.0, 7.0/
DATA (A(4,J),J=1,N)/6.0, 10.0, 1.0, 14.0, 20.0/
DATA (A(5,J),J=1,N)/8.0, 22.0, 7.0, 20.0, 40.0/
并获得以下回报:
6.000 2.000 5.000 1.000 3.000
0.000 4.000 -2.000 2.000 4.000
0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 3.000 3.000
0.000 0.000 0.000 0.000 2.449
到目前为止,我已经尝试使用Math.NET,但它不会在这个示例矩阵上运行,因为它不是正定的。
我还尝试了 ALGLIB 的部分内容,特别是spdmatrixcholesky。它似乎有效,但仅适用于部分矩阵:
6 2 5 1 3
12 4 -2 2 4
30 2 0 1 7
6 10 1 14 20
8 22 7 20 40
有谁知道我在这里做错了什么?我需要在这里调用不同的函数吗?
由于似乎没有快速的答案,如果我了解基础数学可能是最好的,这样我至少可以尝试弄清楚这里发生了什么。任何理论基础或指针也值得赞赏。