关于 Eigen::SparseMatrix 的默认存储索引类型

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

对于 Eigen 中的稠密矩阵,默认情况下存储索引类型为

std::ptr_diff
,但可以通过处理器指令设置
EIGEN_DEFAULT_DENSE_INDEX_TYPE
进行调整(影响所有代码)。

然而,对于稀疏矩阵,存储索引类型是为每个单独的矩阵设置的,作为模板参数,默认为

int
。整个代码中似乎没有一个
#define
可以设置来更改此默认值。

我想知道造成这种差异的原因是什么,是否有一种方法我错过了全局设置稀疏矩阵的默认存储索引,使其与稠密矩阵一致?

为了提供一些上下文,我的代码混合使用了密集矩阵和稀疏矩阵,并且由于整数类型转换,我收到了很多编译器警告。为了摆脱这些,目前唯一的选择是始终指定稀疏矩阵的存储类型,这有点冗长(尽管我猜

typedef
可以作为最后的手段有所帮助)。

c++ eigen eigen3
1个回答
0
投票

在稠密矩阵中只有两个索引变量,一个用于行数,一个用于列数。因此它们的内存大小并不重要。同时,任何索引变量都可以直接用于寻址内存。使用

ptrdiff_t
是自然的选择。使用
int
可能会导致编译器发出额外的指令以符号扩展至 64 位
ptrdiff_t

但是,对于稀疏矩阵,需要记录每个非零元素的位置。 Eigen 使用压缩稀疏行/列 (CSR/CSC) 格式。在 CSC 中,每个非零标量与其行的一个索引耦合。此外,无论稀疏性如何,每列都有一个(或两个非压缩形式)索引变量的固定开销。因此,切换到

ptrdiff_t
会使内存使用量增加一倍以上。同时,您需要超过 20 亿行或列或 20 亿个非零条目的可能性相当低。这就是为什么这种权衡是有意义的,正如您所指出的,您始终可以创建自己的 typedef。

我建议您更改编译器警告设置或添加显式强制转换,而不是使用错误的索引类型来损害性能。

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