matlab中相同算法的结果不同

时间:2012-08-24 02:21:03

标签: matlab matrix linear-algebra

我正在进行线性代数的分配,以比较QR分解算法Gram-Schmidt和Householder的性能和稳定性。

在计算下表时我怀疑:

enter image description here

当矩阵Q和R是通过将Gram-Schmidt和住户应用于Hilbert矩阵A而得到的QR分解的矩阵时,I是维N的单位矩阵;和|| * ||是弗罗贝尼乌斯的常态。

当我在不同的计算机上进行计算时,在某些情况下我会得到不同的结果,可能是由于这个原因?上表对应于在32位计算机中执行的计算以及在64位中执行的下一个表:

enter image description here

matlab中的这些结果涉及进行计算的计算机体系结构?

2 个答案:

答案 0 :(得分:2)

如果你找到答案,我真的很感兴趣! 不幸的是,有很多东西可以改变数值结果......

为了有效,一些LAPACK算法迭代子矩阵块。为了获得最佳效率,块的大小必须符合CPU L1 / L2 / L3缓存的大小......

块的大小由LAPACK例程ILAENV控制,请参阅http://www.netlib.org/lapack/lug/node120.html

当然,如果块大小不同,结果将在数字上有所不同...... Matlab提供的lapack / BLAS DLL可能在两台机器上使用不同调整版本的ILAENV编译,或者ILAENV已被替换通过考虑缓存大小的自定义优化版本,您可以自己检查一个小的C程序,它调用ILAENV并将其链接到Matlab提供的DLL ...

对于底层BLAS,更糟糕的是:如果使用优化版本,可以使用一些融合的mul-add FPU指令,例如可用,并且它们不一定在所有FPU上都可用。 AFAIK,Matlab使用ATLAS http://math-atlas.sourceforge.net/,你将不得不询问如何制作文章......你必须跟踪基本代数运算结果的差异(如矩阵*向量或矩阵*矩阵)。 ..)。

UPDATE:即使ILAENV相同,QR也使用基本旋转,因此它显然取决于sin / cos实现。遗憾的是,没有标准确切地说明sin和cos应该如何按位运行,它们可以从精确的舍入结果中删除几个ulp,并且从一个库到另一个库不同,并且将在不同的体系结构/编译器(在x87 FPU中硬连线)上给出不同的结果。因此,除非您提供这些函数的自己版本(或在ADA中工作)并使用特制的编译器选项进行编译,并且可能精确控制FPU模式,否则几乎没有机会在不同的体系结构上找到完全相同的结果...您将还必须要求Matlab在编译这些库时是否特别注意确保浮点确定性结果。

答案 1 :(得分:1)

这取决于matlab的实现。在重新运行相同的架构时,你得到相同的结果吗?如果是,这个问题可能是由精度引起的。有时,它是由CPU的不同FPU(浮点过程uint)引起的。您可以使用不同的CPU尝试更多32位/ 64位。

最佳答案应该是您的matlab提供商的回复。如果您持有有效的许可证,请打电话给他们。

根据link

差异的一个原因是,如果使用x87指令进行计算,则它将保持80位精度。取决于编译器优化,在被截断回64位之前,它的数字可能会保持在80位以进行一些操作。这可能会导致变化。有关详细信息,请参阅http://gcc.gnu.org/wiki/x87note

gcc手册页说在x86-64平台上使用sse(而不是387)是默认的。你应该可以使用类似的东西强制它在32位 -mfpmath = sse -msse -msse2