在英特尔 MKL 和 MTL4 库的帮助下,我已将用于对称特征值求解器的 MATLAB Lanczos 求解器转移到 C++ 中。我有一些 MKL 例程的包装模板。然而,在迭代过程中,我的 C++ 实现的结果开始偏离 MATLAB 找到的值。在迭代中的某个时间点,差异似乎很小,但在大约 9-10 次迭代后,结果开始出现偏差。
我怀疑这是由于我在 Lanczos 求解器中使用的完全重新正交化。奇怪的是,我在 MATLAB 中使用了简单的 Gram-Schmidt 正交化,但是在 C++ 中使用相同的操作会导致我的问题的 \alpha 和 \beta 系数不同。据我所知,MATLAB 使用双精度,而在 C++ 中,我默认也使用双精度。英特尔 MKL 也使用双精度。然而,中间计算中引入的舍入误差似乎严重影响了 C++ 代码的性能,至少这是我的猜测,除了正交化。有什么想法可以解决这个奇怪的问题吗?