如果您找到答案,我真的很感兴趣!
不幸的是,很多事情都会改变数值结果......
为了提高效率,一些 LAPACK 算法在子矩阵块上进行迭代。为了获得最佳效率,块的大小必须以某种方式适应 CPU L1/L2/L3 缓存的大小......
块的大小由 LAPACK 例程 ILAENV 控制,请参见http://www.netlib.org/lapack/lug/node120.html
当然,如果块大小不同,结果会在数值上有所不同……可能是Matlab提供的lapack/BLAS DLL在两台机器上用不同调优的ILAENV版本编译,或者ILAENV被替换为定制的考虑到缓存大小的优化版本,您可以自己检查制作一个调用 ILAENV 的小型 C 程序并将其链接到 Matlab 提供的 DLL...
对于底层的 BLAS,情况更糟:如果使用优化版本,某些融合的 mul-add FPU 指令可能会在示例可用时使用,并且它们不一定在所有 FPU 上都可用。AFAIK,Matlab 使用 ATLAS http://math-atlas.sourceforge.net/,你必须询问图书馆是如何产生的......你必须跟踪基本代数运算结果的差异(如矩阵*向量或矩阵*矩阵...)。
更新:即使 ILAENV 相同,QR 使用基本旋转,所以它显然取决于 sin/cos 实现。不幸的是,没有标准准确地说明 sin 和 cos 应该如何按位表现,它们可能与舍入的精确结果相差几个 ulp,并且从一个库到另一个库会有所不同,并且会在不同的架构/编译器上给出不同的结果(在 x87 FPU 中硬连线)。因此,除非您提供您自己版本的这些函数(或在 ADA 中工作)并使用特制的编译器选项编译它们,并且可能精细控制 FPU 模式,否则几乎没有机会在不同架构上找到完全相同的结果......您将还必须询问 Matlab,他们在编译这些库时是否特别注意确保浮点确定性结果。