matlab - matlab中相同算法的不同结果

标签 matlab matrix linear-algebra

我正在做线性代数作业,以比较 QR 因式分解算法 Gram-Schmidt 和 Householder 的性能和稳定性。

我的疑惑是在计算下表时出现的:

enter image description here

其中矩阵 Q 和 R 是通过将 Gram-Schmidt 和 householder 应用于希尔伯特矩阵 A 而对 QR 进行因式分解的结果矩阵,I 是维度 N 的单位矩阵;和|| * ||是 Frobenius 范数。

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

enter image description here

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

最佳答案

如果你能找到答案,我真的很感兴趣!
不幸的是,很多事情都会改变数值结果...

为了提高效率,一些 LAPACK 算法在子矩阵 block 上进行迭代。为了获得最佳效率, block 的大小必须以某种方式适应 CPU L1/L2/L3 缓存的大小......

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

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

对于底层 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 在编译这些库时是否特别注意确保浮点确定性结果。

关于matlab - matlab中相同算法的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12102431/

相关文章:

javascript - Matrix3d propertyValues 及其他

linear-algebra - hlsl 点函数

python - 将向量与轴对齐的旋转矩阵的不精确性

matlab - MATLAB 中最有效的矩阵求逆

c++ - Eigen 矩阵分配需要很长时间——有解决办法吗?

matlab - Matlab 求解器中的相对和绝对公差定义

matlab - 在 Matlab 中的线条内绘制数据标签

arrays - 将 bsxfun 与匿名函数一起使用

c++ - 如何输入矩阵样式的 txt 文件而不是为 C++ 定义我自己的 int 二维数组

image - 检测 RGB 图像中的像素是否属于其他两个像素之间的直线 (MATLAB)