计算互补投影时的数值问题

时间:2013-01-15 23:16:37

标签: matlab

我使用matlab来计算以下问题:

AB是两个mn正交矩阵,A'*A = IB'*B = I其中I是身份矩阵。 mn大得多。我正在计算C = (2B*B'-I)*A,它也是一个正交矩阵。

但是在matlab中,数字的精确度会导致以下问题:

max(max(abs(A'*A-I))) = e0 > 0
max(max(abs(B'*B-I))) = e0 > 0

计算出的Cmax(max(abs(C'*C-I))) = e1 > e0

如果我通过计算D = (2C*C'-I)*B重复上述过程,这个错误限制会升级D,随着越来越多的此类迭代,此错误会爆炸。

有没有办法在不增加此错误限制的情况下进行计算?

谢谢!

1 个答案:

答案 0 :(得分:0)

作为一般规则,您执行的计算和转换越多,您就越需要开始担心浮点错误。

为了减轻这种影响,有几种可能性:

1)使用支持精确算术的Maple或Mathematica等软件,这将以更大的计算负担为代价消除问题。我的理解是Matlab不支持精确算术(但我可能错了......)

2)使用比Double更高的精度来缓解浮点错误。例如,FEX提交Multiple Precision Toolbox for MATLAB声称支持任意大的精度格式。我自己从未使用它,所以我无法评论它的工作情况。

3)根据矩阵中数字的相对大小,可能会有一些数字技巧或变换可用于减少浮点误差。这是一个很大的主题,但一般来说,我们的想法是尝试扩展您的问题,以使数字尽可能接近彼此。

可能还有其他一些我不知道的可能性。我当然不是这方面的专家。我很想知道其他受访者的建议。

哦,另外一件事,我只是偶然发现了related SO question