特征稀疏矩阵,构造函数和 resize(int, int) 是否形成稠密表示?

问题描述 投票:0回答:1

Eigen SparseMatrix 具有以下功能:

  • 稀疏矩阵(索引,索引)
  • 调整大小(索引,索引)
  • make压缩()

我想使用 Eigen 存储一个大但(真正)稀疏的矩阵。调用构造函数

SparseMatrix(Index,Index)
是否会在调用
index^2
之前分配
makeCompress()
内存?调整大小(int,int)怎么样?那么
makeCompress()
会做什么呢?我真的想避免任何密集的表示。

c++ eigen
1个回答
0
投票

调用构造函数 SparseMatrix(Index,Index) 是否会在调用 makeCompress() 之前分配索引^2内存?

不,它存储矩阵的逻辑大小并分配所需的元数据,但不会分配除此之外的任何空间。同样的

resize

makeCompress() 做了什么?

Eigen 使用的稀疏格式是压缩稀疏列 (CSC) 或行 (CSR),具体取决于您将矩阵指定为列优先还是行优先。剩下的我会向 CSC 解释。

压缩的 CSC 格式包括

  • 包含所有非零条目的一个向量。一列的所有条目连续存储;直接跟下一列的值
  • 对应于非零条目的行索引的一个向量
  • 一个向量,每列有一个
    Index
    加 1。每个条目给出该列在其他两个向量中的起始偏移量

列中非零条目的数量计算为从该列的起始索引到下一列的起始索引的偏移量。这就是为什么有一个额外的条目。

在未压缩格式中,前两个向量在每列末尾都有可用空间,以便您可以在聚合的恒定时间内进行追加。存储一个附加向量,给出每列使用范围的末尾。

总结

两种表示都是稀疏的。未压缩的需要更多内存,但可能是两倍左右(取决于预分配的容量)。

通常,您从未压缩的形式开始。然后插入新值,最好在每行/列的末尾。然后最后你调用

makeCompressed()
以获得最终的、最紧凑的表示。

© www.soinside.com 2019 - 2024. All rights reserved.