有两个矩阵:
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,但我的问题不是速度或记忆。我需要准确的结果
感谢。
答案 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
意识到计算机永远无法提供完美的浮点结果,这会给您留下一些选择:
我将不得不在我的机器上进行操作 - 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
在那么多操作之后,这与我对圆角错误的期望更接近,但我不确定你的输入,你的机器,我不知道还有什么可能影响事情。
干杯, -