Eigen SparseMatrix 具有以下功能:
我想使用 Eigen 存储一个大但(真正)稀疏的矩阵。调用构造函数
SparseMatrix(Index,Index)
是否会在调用 index^2
之前分配 makeCompress()
内存?调整大小(int,int)怎么样?那么makeCompress()
会做什么呢?我真的想避免任何密集的表示。
调用构造函数 SparseMatrix(Index,Index) 是否会在调用 makeCompress() 之前分配索引^2内存?
不,它存储矩阵的逻辑大小并分配所需的元数据,但不会分配除此之外的任何空间。同样的
resize
makeCompress() 做了什么?
Eigen 使用的稀疏格式是压缩稀疏列 (CSC) 或行 (CSR),具体取决于您将矩阵指定为列优先还是行优先。剩下的我会向 CSC 解释。
压缩的 CSC 格式包括
Index
加 1。每个条目给出该列在其他两个向量中的起始偏移量列中非零条目的数量计算为从该列的起始索引到下一列的起始索引的偏移量。这就是为什么有一个额外的条目。
在未压缩格式中,前两个向量在每列末尾都有可用空间,以便您可以在聚合的恒定时间内进行追加。存储一个附加向量,给出每列使用范围的末尾。
两种表示都是稀疏的。未压缩的需要更多内存,但可能是两倍左右(取决于预分配的容量)。
通常,您从未压缩的形式开始。然后插入新值,最好在每行/列的末尾。然后最后你调用
makeCompressed()
以获得最终的、最紧凑的表示。