Matlab中精确的矩阵乘法

时间:2012-12-05 18:07:04

标签: matlab matrix-multiplication

有两个矩阵:

A :( 6 x 78)max=22.2953324329113, min=0
B :( 6 x 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,但我的问题不是速度或记忆。我需要准确的结果

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

然后C = A'R'R A =D'D,其中D = RA

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

答案 1 :(得分:1)

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

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

意识到计算机永远无法提供完美的浮点结果,这会给您留下一些选择:

  • 尽可能少的操作,即选择操作顺序以获得最少的舍入错误
  • 固定小数点算术 - 或整数算术 - 这并不总是适用于所有应用程序,但在某些应用程序中,您可以侥幸逃脱。金融应用程序是常被引用的例子(乘以100可以使便士消失!当你完成时除以100!)。
  • 还有其他一些我想不起的伎俩。

我将不得不在我的机器上进行操作 - eps给我2.2204e-16,这比你得到的要低6个数量级。看看你机器上的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

在那么多操作之后,这与我对圆角错误的期望更接近,但我不确定你的输入,你的机器,我不知道还有什么可能影响事情。

干杯, -