c++ - Eigen 将 vector 与一些 NaN 值进行比较而不会丢失 NaN 值

标签 c++ vector nan eigen comparison-operators

请参阅下面的代码:

    Eigen::VectorXf vec1(3);
    vec1(0) = 231;
    vec1(1) = 512;
    vec1(2) = 213;
    Eigen::VectorXf vec2(3);
    vec2(0) = 10;
    vec2(1) = std::numeric_limits<double>::quiet_NaN();
    vec2(2) = 2213;

    std::cout << (vec1.array() < vec2.array()) << std::endl;


给出以下输出:

0,
0,
1

但是我不想丢失 NaN 值,所以我想要的输出如下:

0,
难,
1

我知道我可以通过循环初始 vector ,记录任何 NaN 值的位置,然后用这些位置更新输出来实现这一点。

然而,这有点困惑,我希望代码尽可能高效(即避免任何不必要的循环)。

所以我的问题是,有没有一种简单的方法可以在不丢失 NaN 值的情况下实现这种比较?

最佳答案

这是可能的,但有一些事情需要注意。

首先是类型 的比较结果会不一样。 Eigen 中按组件比较的结果将是一个整数数组(0 或 1)。如果你想要一些可以是 0、1 或 NaN 的东西您必须将其转换为 float .在 Eigen 中,您必须使用显式转换操作。

请注意,正如评论所指出的,结果不会告诉您不等式的哪一边有 NaN s 首先。

现在,您可以算术地做到这一点。如果我们将所有内容都转换为 float 的 vector 我们可以依赖 NaN 的算术性质s 传播它们:

VectorXf compare_with_nans(const VectorXf& vec1, const VectorXf& vec2) {

  const VectorXf zero_or_nan_1 = vec1 - vec1;
  const VectorXf zero_or_nan_2 = vec2 - vec2;

  const VectorXf compare = (vec1.array() < vec2.array()).matrix().cast<float>();

  return compare + zero_or_nan_1 + zero_or_nan2;
}

这取决于 x-x 的事实将产生 0如果 x是一个常规值和 NaN如果 xNaN , 所以 vec1-vec1将有 0 其组件值是常规数字和 NaN其他地方。

最后添加 NaN s 上 zero_or_nan vector 将污染包含 NaN 的行上的常规值在原始 vector 中。

关于c++ - Eigen 将 vector 与一些 NaN 值进行比较而不会丢失 NaN 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60439292/

相关文章:

c++ - 两个 vector 的可迭代并集

java - 如何创建一个简单的横向卷轴游戏

c++ - 使用集合对 vector 进行排序

VB.NET "For each"与 ".GetUpperBound(0)"

php - 在 PHP 版本中正确处理 NAN

python - 修复函数的奇异性

c++ - 调用临时对象的方法安全吗?

c++ - 在 C++ 中返回一个 vector 附加吗?

python - 如何加快 Pandas 中每个 groupby 组的缺失值替换?

c++ - 将 C++11 转换为等效的 C++98 代码