C ++:用于密集线性代数运算的高效库(行列式和主要未成年人)

计算科学 C++ 拉帕克 本征 犰狳
2021-12-03 09:01:56

我通常使用 Python,但我对 c++ 的基本知识允许我在需要提高代码速度时进行切换。

目前,我有一个 python 脚本(除其他外)计算方阵的所有主要未成年人(指定顺序)的均值和标准差。未成年人是子矩阵的决定因素(参见维基百科的定义)。即使是具有 30x30 条目的矩阵也有超过十亿个不同的子矩阵,因此也有超过十亿个不同的次要矩阵。因此,即使是未成年人计算中的微小时间差异对我来说也很重要。

Python/NumPy 使用 LAPACK 例程来创建子矩阵和计算行列式。所以我认为最好在 c++ 中使用相同的例程。然而,似乎更有经验的程序员倾向于劝阻初学者不要在 c++ 中使用 LAPACK 库(参见 stackexchange上的其他问题),而是指向其他包,例如 Armadillo 或 Eigen。

据我了解,Armadillo 和 Eigen 是再次依赖 LAPACK 的库,但我不知道这些库是否会产生某种可能会减慢速度的开销。

所以我的问题是:我是否应该期望通过增加计算时间(如果与 LAPACK 相比)为犰狳或 Eigen 的“初学者友好”付费?如果有,多少钱?

1个回答

您的问题的答案是基准测试。ArmadilloEigen在他们的文档中都提供了一些基准。唯一的问题是它们无法与相同的库进行比较,但您仍然可以有所了解。也许其他地方有更全面的基准......

无论如何,与 Python/Numpy 相比,在 C++ 库中包装 LAPACK 的开销要小得多。