我想加快我正在开发的库的速度。大多数矩阵的尺寸都相当小(比如最大 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/