【问题标题】:Matrix Inversion Cholesky Factorization -> results not exact [closed]矩阵求逆 Cholesky 分解-> 结果不准确 [关闭]
【发布时间】:2012-07-19 16:57:28
【问题描述】:

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

【问题讨论】:

  • 要么提供所用库的信息,要么尝试math.stackexchange.com
  • 您确定这些值都应该可用吗?通常对称矩阵库仅使用矩阵的一侧作为输出,依靠您通过对称另一侧来完成。请发布导致结果的代码大纲。

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


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 2016-08-07
      • 2021-02-23
      • 1970-01-01
      • 2014-03-17
      • 2013-06-19
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多