提问人:CocoLAsticot 提问时间:10/23/2023 更新时间:10/23/2023 访问量:32
关于 Eigen::SparseMatrix 的默认存储索引类型
About the default storage index type for Eigen::SparseMatrix
问:
对于 Eigen 中的密集矩阵,存储索引类型默认为,但可以使用处理器指令设置进行调整(影响所有代码)。std::ptr_diff
EIGEN_DEFAULT_DENSE_INDEX_TYPE
但是,对于稀疏矩阵,存储索引类型将每个单独的矩阵设置为模板参数,并且默认为 。在整个代码中,似乎没有可以设置来更改此默认值。int
#define
我想知道造成这种差异的原因是什么,以及我是否错过了为稀疏矩阵全局设置默认存储索引的方法,以便它与密集矩阵保持一致?
为了提供一些上下文,我的代码混合使用密集和稀疏矩阵,并且由于整数类型转换,我收到了很多编译器警告。为了摆脱这些,目前唯一的选择是始终指定稀疏矩阵的存储类型,这有点冗长(尽管我想作为最后的手段可能会有所帮助)。typedef
答:
在密集矩阵中,只有两个索引变量,一个用于行数,一个用于列数。因此,它们的内存大小并不重要。同时,任何索引变量都可以直接用于寻址内存。使用是自然的选择。使用可能会导致编译器发出额外的指令来对 64 位进行签名扩展。ptrdiff_t
int
ptrdiff_t
但是,对于稀疏矩阵,您需要记录每个非零元素的位置。Eigen 使用压缩稀疏行/列 (CSR/CSC) 格式。在 CSC 中,每个非零标量都与其行的一个索引耦合。此外,无论稀疏性如何,每列都有一个(或两个非压缩形式)索引变量的固定开销。因此,切换到会使内存使用量增加一倍。同时,您需要超过 20 亿行或列或 20 亿个非零条目的可能性相当低。这就是为什么这种权衡是有道理的,正如你所指出的,你总是可以制作自己的 typedef。ptrdiff_t
与其使用错误的索引类型而损害性能,不如建议您更改编译器警告设置或添加显式强制转换。
评论