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