0

有2个矩阵:

:(6×78)max=22.2953324329113, min=0
:(6×6) max=2187.9013214004 , min=-377.886378385521

B是对称的,因此,C = A' * B * A必须是对称矩阵(理论上),但是当我在 Matlab 中计算它们时,情况并非如此。实际上:

max(max(abs(C - C'))) = 2.3283064365386963e-010

如何将它们相乘并获得准确的结果?
或者
什么是舍入 C 元素的安全方法?

我读了这个问题:efficient-multiplication-of-very-large-matrices-in-matlab,但我的问题不是速度或内存。我需要一个准确的结果

谢谢。

4

2 回答 2

2

您可以考虑 cholesky 分解,B因为它是对称的

  B = R'R
  R = chol(A)   % // in matlab

那么C = A'R'R A =D'D,在哪里D = RA

尽管由于C=D'D分解的准确性而引入了可能的错误,但您应该具有机器 epsilon 精度。

于 2012-12-05T18:24:46.513 回答
1

你需要阅读“每个计算机科学家应该知道的关于浮点运算的知识”:

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

意识到计算机永远无法给出完美的浮点结果,这给您留下了几个选择:

  • 做尽可能少的操作,即选择操作的顺序以使舍入误差最小
  • 固定小数点算术 - 或整数算术 - 这并不总是适用于所有应用程序,但在某些应用程序中,您可以摆脱它。金融应用是最常被引用的例子(乘以 100 就可以赚到钱!完成后除以 100!)。
  • 这么晚了我还想不到其他的技巧。

我将不得不让你的操作在我的机器上进行一次旋转,eps给我2.2204e-16,这比你得到的要低六个数量级。看看eps你的机器上有什么 - 它应该是相似的 - 如果它是类似的东西1e-12,我会说你的结果正是你对这些操作的期望。

当我使用随机数执行此操作时,我得到

a = rand(6, 78);
b = rand(6, 6);
b = b + b';   % To make b symmetric
c = a' * b * a;
max(max(abs(c - c')))

ans =

   7.1054e-15

经过这么多操作后,这与我对舍入错误的预期更接近,但我不确定你的输入,你的机器,我不知道还有什么可能会影响事情。

干杯, -

于 2012-12-06T08:05:00.903 回答