具有特征库的块稀疏矩阵

Posted

技术标签:

【中文标题】具有特征库的块稀疏矩阵【英文标题】:Block Sparse Matrix with Eigen library 【发布时间】:2016-09-06 07:25:10 【问题描述】:

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

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

稀疏矩阵仅以系数方式而非块方式实现是否有特定原因?

我的意思是,当前的实现对于具有少量非零元素的大型矩阵是有效的,但对于具有可比数量的非零和零的矩阵则不是。

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

【问题讨论】:

Is there a specific reason why sparse matrix are implemented only coefficient wise and not block wise? 可能是因为它更简单,但我们必须等待 ggael 才能得到明确的答案。除此之外,你有一个实际的问题吗?此外,对于小型矩阵(您说的是多达 400 个元素),仅使用密集算法可能会更快。确保您有实际需求,而不仅仅是过早优化,这可能会导致速度放缓。 Do you know other libraries for this? 被认为与 SO 无关(参见第 4 项 here)。 @AviGinsburg:可能是因为它更简单,这是我的猜测。我只能找到有关该主题的几篇文章,所以我想知道是否还有其他原因(例如不值得)。 我敢打赌,这只是历史原因。块稀疏矩阵至少有两个用例有用。块对角线的逆通常是比对角线的逆更好的预处理器。如果矩阵已经是块稀疏形式,则预处理器的计算成本更低。此外,通用稀疏非线性最小二乘求解器(例如 g2o 或 ceres)在内部根据稀疏块保存矩阵(例如,用于高效的 Schur 补码计算),并且仅在与外部库(Suitespare 等)接口时转换为标准 CSC 形式. 【参考方案1】:

对于这样的小矩阵没什么可期待的,因为这会减少向量化机会和指令流水线。您可以通过比较 triangular matrix * vectorfull matrix * vector 对于 10x10 矩阵的性能来自行检查。

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

【讨论】:

感谢您的回答。我想我必须找到其他点来优化。我完全同意SVD 上的评论。我想到的优化将在 JacobiSVD 类之外完成(删除行或列,块对角矩阵)。

以上是关于具有特征库的块稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

如何hstack几个稀疏矩阵(特征矩阵)?

使用 Eigen3 的稀疏矩阵的特征值

如何求稀疏矩阵的全部特征值和特征向量?

来自密集的Tensorflow的稀疏矩阵

在朴素贝叶斯(Python、scikit)中使用稀疏矩阵/在线学习

来自密集张量 Tensorflow 的稀疏张量(矩阵)