我通过Cholesky分解使用不同的库来计算方阵的逆。但是我的结果并不像我期望的那样。我不是数学方面的专家,但我期待得到更接近的结果。
我正在使用MLK,magma和CULA库来计算CPU和GPU中矩阵的逆矩阵。
在计算完这些库后,我注意到结果总是在一个元素中有所不同。假设我想计算A= [0.237306,0.000458;0.000458,0.238497]
的倒数:
A[0] = 0.237306
A[1] = 0.000458
A[2] = 0.000458
A[3] = 0.238497
我获得的结果是:
inv(A)[0] = 4.213983
inv(A)[1] = -0.008092
inv(A)[2] = 0.000458
inv(A)[3] = 4.192946
但是,正确的结果应该是
4.2139841 -0.0080924
-0.0080924 4.1929404
正如您所看到的,inv(A)[3]
是不同的,尽管其余的都很好。 Cholesky Inversion应该如何运作?这是正确/近似的结果还是我在这里做错了什么?
答案 0 :(得分:3)
我明白发生了什么。这个库计算矩阵的倒数,正如Alexandre C所指出的那样。因此,根据您传递给库(上部或下部)的参数,它会计算矩阵的上侧或下侧的倒数。 我以为你可以计算出完整的逆矩阵,但显然这种方式是不可能的。
答案 1 :(得分:1)
这可能是由于IEEE规范中的浮点数以及与它们一起构建的不精确性。
您没有说明是否指定了32位或64位浮点数。尝试提高你的精确度。
另一个要点是,人们通常不会计算矩阵的逆矩阵,因为它很容易受到舍入误差的影响。一个更好的选择是LU分解和前向后替换。
你从哪里得到“正确”答案?你如何判断结果的正确性?
我知道它不是数值方法的最佳工具,但是如果我采用你的矩阵:
0.237306 0.000458 0.000458 0.238497并通过MINVERSE运行,我得到了这个答案:
4.213984 -0.00809 -0.00899 4.19294我可以通过乘以原始和逆来检查其有效性,看看我是否得到了一个识别矩阵。这是我从MMULT中得到的东西:
1 2.1684e-19 -2.168e-19 1这就是数值方法人称之为单位矩阵的原因。
所以我说我得到的答案是正确的。您应该以同样的方式检查自己,并阅读What Every Computer Scientist Should Know About Floating Point Arithmetic。