矩阵求逆Cholesky分解 - >结果不准确

时间:2012-07-20 12:00:46

标签: math matrix linear-algebra matrix-inverse matrix-factorization

我通过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应该如何运作?这是正确/近似的结果还是我在这里做错了什么?

2 个答案:

答案 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