【问题标题】:Accurate matrix multiplication in MatlabMatlab中的精确矩阵乘法
【发布时间】:2012-11-23 15:43:54
【问题描述】:

有2个矩阵:

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,但我的问题不是速度或内存。我需要一个准确的结果

谢谢。

【问题讨论】:

  • 好吧,C_s = .5* (C +C') 你可以确定..
  • @Acorbe,这准确吗?还是有更准确的方法?

标签: matlab matrix-multiplication


【解决方案1】:

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

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

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

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

【讨论】:

  • +1,但不是答案,要使用 Choleskey 分解,B 必须是正定的。
  • 但它是特征值的计算,你有很大的矩阵,因此你失去了准确性。通过执行 C = .5 * (C + C') 来强制对称,B 1e-16 是否对称?
【解决方案2】:

您需要阅读“每个计算机科学家都应该了解的浮点运算知识”:

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

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

  • 尽可能少地执行操作,即选择操作顺序以使舍入误差最小​​li>
  • 固定小数点算术 - 或整数算术 - 这并不总是适用于所有应用程序,但在某些应用程序中,您可以摆脱它。金融应用是最常被引用的例子(乘以 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

经过这么多操作后,舍入误差与我所期望的有点接近,但我不确定您的输入、您的机器,而且我不知道还有什么可能会影响事情。

干杯,--

【讨论】:

  • 谢谢;我也得到 7.105427357601e-015;在此示例中,我的矩阵的元素大于 ab
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 2012-01-09
相关资源
最近更新 更多