我使用matlab来计算以下问题:
A
,B
是两个m
个n
正交矩阵,A'*A = I
和B'*B = I
其中I
是身份矩阵。 m
比n
大得多。我正在计算C = (2B*B'-I)*A
,它也是一个正交矩阵。
但是在matlab中,数字的精确度会导致以下问题:
max(max(abs(A'*A-I))) = e0 > 0
max(max(abs(B'*B-I))) = e0 > 0
计算出的C
有max(max(abs(C'*C-I))) = e1 > e0
。
如果我通过计算D = (2C*C'-I)*B
重复上述过程,这个错误限制会升级D
,随着越来越多的此类迭代,此错误会爆炸。
有没有办法在不增加此错误限制的情况下进行计算?
谢谢!
答案 0 :(得分:0)
作为一般规则,您执行的计算和转换越多,您就越需要开始担心浮点错误。
为了减轻这种影响,有几种可能性:
1)使用支持精确算术的Maple或Mathematica等软件,这将以更大的计算负担为代价消除问题。我的理解是Matlab不支持精确算术(但我可能错了......)
2)使用比Double更高的精度来缓解浮点错误。例如,FEX提交Multiple Precision Toolbox for MATLAB声称支持任意大的精度格式。我自己从未使用它,所以我无法评论它的工作情况。
3)根据矩阵中数字的相对大小,可能会有一些数字技巧或变换可用于减少浮点误差。这是一个很大的主题,但一般来说,我们的想法是尝试扩展您的问题,以使数字尽可能接近彼此。
可能还有其他一些我不知道的可能性。我当然不是这方面的专家。我很想知道其他受访者的建议。
哦,另外一件事,我只是偶然发现了related SO question。