我尝试在Aasen 1971 年关于分解对称不定矩阵的论文中实现该算法。我已经将 Algol 中的代码逐字翻译成 Python,并使用了论文中给出的测试示例。他们从测试示例中打印出来的结果与我的相符。我尝试将输出提取为可用的形式:三对角矩阵T
、下单位三角矩阵L
和排列P
。问题是,当我执行时,pprint(L * T * L.T)
我什么也得不到输入矩阵M
。如何将输出提取为可用的形式?
无论如何,输入是:
⎡ -1 -0.2 0.5 0.2 -0.7⎤
⎢ ⎥
⎢-0.2 1 -0.8 0 0.8 ⎥
⎢ ⎥
⎢0.5 -0.8 0.4 -0.9 0.9 ⎥
⎢ ⎥
⎢0.2 0 -0.9 1 0.5 ⎥
⎢ ⎥
⎣-0.7 0.8 0.9 0.5 0.8 ⎦
的最终状态与M
论文中的相同:
⎡ -1 -0.2 0.5 0.2
⎢
⎢ -0.7 0.8 -0.8 0
⎢
⎢-0.714285714285714 1.47142857142857 2.09387755102041 -0.9
⎢
⎢0.285714285714286 0.388349514563107 -1.4621359223301 1.42801395041946
⎢
⎣-0.285714285714286 0.495145631067961 0.792828685258964 -0.340239043824701
-0.7 ⎤
⎥
0.8 ⎥
⎥
0.9 ⎥
⎥
0.5 ⎥
⎥
1.62752019809209⎦
最后,我尝试将 的最终状态M
转换为可用的形式:L
变为
⎡ 1 0 0 0 0⎤
⎢ ⎥
⎢ 0 1 0 0 0⎥
⎢ ⎥
⎢-0.714285714285714 0 1 0 0⎥
⎢ ⎥
⎢0.285714285714286 0.388349514563107 0 1 0⎥
⎢ ⎥
⎣-0.285714285714286 0.495145631067961 0.792828685258964 0 1⎦
并T
成为
⎡ -1 -0.7 0 0 0
⎢
⎢-0.7 0.8 1.47142857142857 0 0
⎢
⎢ 0 1.47142857142857 2.09387755102041 -1.4621359223301 0
⎢
⎢ 0 0 -1.4621359223301 1.42801395041946 -0.340239043824
⎢
⎣ 0 0 0 -0.340239043824701 1.627520198092
⎤
⎥
⎥
⎥
⎥
⎥
701⎥
⎥
09 ⎦
[我删除了代码,因为我认为它会混淆事物。]