0

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

4

2 回答 2

3

我明白发生了什么。正如 Alexandre C 所指出的,这个库计算矩阵的逆矩阵,上或下。因此,根据您传递给库的参数(上或下),它计算矩阵的上边或下边的倒数。我以为你可以计算出完整的逆矩阵,但显然这是不可能的。

于 2012-07-20T14:34:23.317 回答
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

这就是数值方法的人所说的单位矩阵。

所以我说我得到的答案是正确的。你应该以同样的方式检查你的,并阅读每个计算机科学家应该知道的关于浮点运算的知识。

于 2012-07-20T13:27:19.953 回答