c++ - 使用 Eigen 库 block 稀疏矩阵

标签 c++ sparse-matrix eigen

我想加快我正在开发的库的速度。大多数矩阵的尺寸都相当小(比如最大 10x40)。大多数都是 block 稀疏的,具有运行时已知的稀疏模式。我想利用稀疏性来加速线性代数运算。

除了基本的线性代数运算之外,我还使用了 SVD 分解。分块稀疏矩阵有助于检测零列/行和分块对角矩阵,从而减少分解时间。

稀疏矩阵仅按系数实现而不按 block 实现有什么具体原因吗?

我的意思是,当前的实现对于具有一些非零元素的大型矩阵来说是有效的,但对于具有相当数量的非零和零元素的矩阵来说却不是。

我查看了the so-bogus library它使用 Eigen 库实现稀疏 block 矩阵。

最佳答案

对于如此小的矩阵没有太多期望,因为这会减少矢量化机会和指令流水线。您可以通过比较 10x10 矩阵的三角矩阵 * vector 完整矩阵 * vector 的性能来自行检查。

然后,对于 SVD,情况更糟,因为对于如此小的矩阵,首选 JacobiSVD,并且在第一次扫描期间零的结构可能会完全丢失,除非它有一个非常特殊的可以利用的结构,例如 block 对角线结构。

关于c++ - 使用 Eigen 库 block 稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39342955/

相关文章:

c++ - 如何从 EigenBase 构建动态数组?

c# - 任何防止 Windows 8 进入连接待机模式的 API?

c++ - (C++) 试图完成一个快速程序,但我不确定哪里出错了?

python-3.x - 从稀疏矩阵中删除条件列

python - 寻找大稀疏矩阵的最小特征向量,在 SciPy 中比在 Octave 中慢 100 倍以上

c++ - 在 Linux 服务器上编译 C++ 程序时英特尔编译器的语法

c++ - 在 Eigen 中计算 SparseMatrix 1-范数、Inf-范数的有效方法

c++ - 调用模板参数的构造函数

c++ - 我什么时候应该真正使用 noexcept?

algorithm - 另一个生命游戏问题(无限网格)?