11

我编写了算法的两种实现来计算对称矩阵的所有特征值和特征向量。一种实现使用 REPA 库

https://github.com/felipeZ/Haskell-abinitio/blob/master/Science/QuantumChemistry/NumericalTools/JacobiMethod.hs

而其他实现使用可变向量和 ST monad

https://github.com/felipeZ/Haskell-abinitio/blob/master/Science/QuantumChemistry/NumericalTools/JacobiMethodST.hs

该算法是 Jacobi 方法,其描述可在 http://en.wikipedia.org/wiki/Jacobi_eigenvalue_algorithm找到

我已经使用 100 个尺寸为 100 x 100 的矩阵测试了这两种实现,按顺序运行代码,我发现了以下时间:

                  REPA      Mutable Vectors

Total time(s)    6.7            28.5

GC (s)           0.2             1.2

Jacobi 算法需要对一些矩阵条目进行迭代更新,这意味着大多数矩阵在迭代之间保持不变。因此,我会(错误地)猜到,在 REPA 实现中为每次迭代复制一个新矩阵的成本将大于使用 monad ST 改变矩阵的成本,因为据我所知,REPA 不会改变数组,但复制它。

是 REPA 融合了所有操作并避免在每次迭代中复制新数组吗?还是别的什么?

有人可以评论这个结果吗?

4

0 回答 0