Eigen::Matrix | 为什么Eigen库要求使用int而不是size_t?

4
根据Eigen文档,第二个和第三个模板参数对应行数和列数,预期为int

我想知道为什么这些参数不是size_t?唯一需要使用int的理由是Eigen允许有负数行或列吗?

唯一有可能合理的解释是Eigen::Dynamic。有人可以确认这是否是允许行/列具有负值的原因吗?


1
也许是,也许不是 - 你可能应该问一下库的作者。我会说这些是 int,因为 Eigen::Dynamic 是一个负值,在库中具有特殊含义。但话说回来,这并不能真正解释为什么选择了 int,他们本可以很容易地将其设为 ssize_t,后者是 size_t 的有符号版本。 - Filipe Gonçalves
1
对于大矩阵,最好使用动态大小而不是巨大的固定大小。除了位域或大数之外,不建议使用无符号类型。 - Marc Glisse
1
@FilipeGonçalves ssize_t 不是 C++ 的一部分,而是 POSIX 的一部分。如果我没记错的话,它的范围是 [-1...2*10^15] 或者类似的值。由于 Eigen 旨在跨平台使用,因此它没有这个选项。 - Avi Ginsburg
1
@Marc Glisse,这不被谁推荐?C++标准库容器的随机访问是通过size_t索引实现的,它们的大小也返回为size_t。这基本上使得使用Eigen与C++代码进行接口(除了玩具示例)的程序非常容易发出警告或充满转换。 - Slava
@Slava https://dev59.com/OmMk5IYBdhLWcg3w-Spm - Marc Glisse
使用适当的类型,如果不确定,可以先使用int类型,直到你确定为止。这是被接受的答案,与“不推荐”的说法相去甚远。尽管Bjarne的引用确实很强烈。 - Slava
1个回答

0

Eigen::Dynamic并不是一个理由,因为它可以被设置为numeric_limits<size_t>::max()或者size_t(-1)

我认为这更多是因为Eigen的目标受众更喜欢使用int而不是其他类型。如果您对此选择感到不舒服,可以使用EIGEN_DEFAULT_DENSE_INDEX_TYPE预处理指令将其设置为您认为合适的类型,并面对后果... :) 不过,说真的,在实际使用之前,至少要运行完整个Eigen测试集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接