特征:行主稀疏矩阵

时间:2017-04-24 16:28:55

标签: c++ matrix sparse-matrix eigen

在特征库中是否可以逐行为行主稀疏矩阵保留空间(每行不同)?

我正在努力优化填充相当大的稀疏矩阵的记忆消耗(约70兆x 70年代,约20亿nnz是我能达到的最大但我还想进一步)。为了清楚我的方式:

首先我使用了推荐的setFromTriplets,这可能是填充矩阵的最快方法,但是检查内存消耗我发现峰值大约是我使用此函数时平均内存的两倍,这是有道理的,因为我 - 在某些时候 - 将元素存储在三元组的矩阵和向量中,直到向量超出范围。

使用insert()显着改善了最大内存消耗。虽然,由于重新分配,我仍然达到了顶峰。然后我也使用reserve(),以便没有(或更少)重新分配。它也会降低峰值,但它并没有完全消失,这也是由于一些重新分配(如果valgrind是正确的)。由于我的大多数行的NNZ都低于最大值,因此我在存储中获得了相当多的空分配条目,这增加了平均内存消耗。使用makeCompressed会再次降低平均值,但显然也会再次提高峰值,因为调用它时必须进行更多的重新分配。

为什么我现在问上面的问题是:我可以预先计算每一行的NNZ,并对它们进行排序,这样我实际上应该能够完全优化这个具有压缩矩阵而没有任何如果我可以为每一行保留不同数量的NNZ,则为空分配且没有重新分配峰值。

如果有人在Eigen中知道是否可能,我会很高兴,如果没有:你知道任何支持它的图书馆吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

是的,这是可能的,你或许可以在纪录片中找到这个功能:

template<class SizesType> void SparseMatrix::reserve(const SizesType & reserveSizes);

请注意,SizesType可以是std::vector(或std::deque)或Eigen::VectorXi

此外,如果您能够按顺序将元素插入矩阵,您还可以查看(内部)函数insertBack