首页 文章

matlab中相同算法的结果不同

提问于
浏览
4

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

在计算下表时我怀疑:

enter image description here

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

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

enter image description here

matlab中的这些结果涉及计算机架构,其中进行了计算?

2 回答

  • 2

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

    最好的答案应该是您的matlab提供商的回复 . 如果您持有有效许可证,请致电他们 .

    据此link .

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

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

  • 1

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

    为了有效,一些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在编译这些库时是否特别注意确保浮点确定性结果 .

相关问题