我有以下问题。我有一些使用 Eigen3 的代码。Eigen3 使用 int 或 long int 作为索引。在代码中的某些地方,我必须将特征数组中的值存储在std::vector.
这是一些例子:
std::vector myStdVector;
Eigen::VectorXd myEigen;
....
for(size_t i=0; i<myStdVector.size(); i++)
{
    myStdVector[i] = myEigen(i);
}
这里我得到编译器警告:
警告:隐式转换会丢失整数精度:“const size_t”(又名“const unsigned long”)到“int”
所以我当然可以static_cast<int>(i)在发生这种情况的所有函数中添加 a ,但我想知道是否有更好的方法来处理这种情况。我想许多其他“库混合”也会发生这种情况。
在这种特定情况下,我建议使用较小容器的索引类型;这将是 Eigen 的索引类型,由您的Eigen::VectorXd. 理想情况下,它将用作Eigen::Index, 以实现向前兼容性。
也许还值得研究一下 Eigen 如何定义其索引类型。特别是,如果需要,您可以通过更改预处理器指令、通过#define符号EIGEN_DEFAULT_DENSE_INDEX_TYPE;来重新定义它。它默认为std::ptrdiff_t.
[但是请注意,在我自己的代码中,我通常更喜欢使用较大的索引(在本例中为size_t),但会进行范围检查,就像使用较小的索引类型(如果适用)(在本例中为Eigen::Index)。然而,这只是个人偏好,并不一定是我认为最好的选择。]
一般来说,当尝试选择最佳索引类型时,我建议您查看它们的可用范围。首先,如果一种或多种潜在类型是有符号的,并且一种或多种有符号潜在类型允许负值*,则您需要消除任何无符号类型,尤其是大于最大有符号类型的类型。然后,您将查看您的用例,消除任何不适合您的预期目的的类型,并从剩余的潜在类型中选择最适合的类型。
具体来说,在您的情况下,您希望将 Eigen3 容器中的值存储在 STL 容器中,其中 Eigen3 容器使用索引,并且ptrdiff_t(如您的评论中所述)据您所知仅使用非负索引值。在这种情况下,两者都是可行的选择;提供的非负索引值的范围ptrdiff_t非常适合 的size_t范围,并且循环条件将由您确定VectorXd(因此也保证适合 Eigen3 容器的索引类型)。因此,这两种潜在类型都是可行的选择。由于当前不需要提供额外的范围size_t,因此我认为 Eigen 设置提供的索引类型稍微更适合手头的任务。
*:虽然由于索引的工作原理,通常可以安全地假设索引值始终为正,但我可以看到在一些情况下允许负值会是有益的。不过,这些通常很少见。
请注意,我假设示例代码中的循环条件i<myStdVector.size()是一个拼写错误,因为与初始描述或循环体内执行的操作不相符。如果我错了,那么这个决定就会变得更加复杂。