请参阅下面的代码:
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
如果 x
是 NaN
, 所以 vec1-vec1
将有 0 其组件值是常规数字和 NaN
其他地方。最后添加
NaN
s 上 zero_or_nan
vector 将污染包含 NaN
的行上的常规值在原始 vector 中。
关于c++ - Eigen 将 vector 与一些 NaN 值进行比较而不会丢失 NaN 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60439292/