C++ 特征值将向量与一些NaN值进行比较,而不会丢失NaN值

C++ 特征值将向量与一些NaN值进行比较,而不会丢失NaN值,c++,vector,nan,eigen,comparison-operators,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 << (

请参阅下面的代码:

    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;

Eigen::VectorXf vec1(3);
vec1(0)=231;
vec1(1)=512;
vec1(2)=213;
本征::向量xf-vec2(3);
vec2(0)=10;
vec2(1)=标准::数值限制::安静(n));
vec2(2)=2213;

std::cout这是可能的,但有几件事需要注意

首先,比较结果的类型将不同。Eigen中的分量比较结果将是一个整数数组(0或1)。如果您想要0、1或
NaN
的值,则必须将其转换为
float
。在Eigen中,必须使用显式强制转换操作

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

现在,你可以用算术来计算。如果我们将所有内容转换为
float
的向量,我们可以依赖
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;
}
VectorXf比较_与_nans(const VectorXf&vec1,const VectorXf&vec2){
常量向量xf zero_或_nan_1=vec1-vec1;
常数向量xf zero_或_nan_2=vec2-vec2;
const VectorXf compare=(vec1.array()
这取决于这样一个事实,即
x-x
将产生
0
如果
x
是正则值,而
NaN
如果
x
NaN
,那么
vec1-vec1
将产生0,其中其分量值是正则数,并且
NaN
在其他任何地方


最后添加后,
zero\u或\u NaN
向量上的
NaN
s将污染原始向量中包含
NaN
的行上的常规值。

我在本征文档中没有找到它,但我想
operator@idclev463035818在我正在构建的应用程序中,我读取向量的真值是为了其他目的。如果我要做
不(vec1.array()
,那么这将在NaN应该是的地方创建一个真实值,而不应该是这种情况。我不知道eigen,所以我不能给出一个充分的答案,但似乎你想要一个
枚举{true,False,LHS_NaN,RHS_NaN,两者都是}
,而不是
bool
。您不需要第二个循环,而是需要一个不同于
运算符的比较函数。您的问题不清楚的是,为什么要避免循环。是出于代码清晰(“这有点混乱”)还是出于性能(“尽可能高效”)?@Louen performance。我在for循环中尝试了等效的代码,速度是原来的4/5倍谢谢,这段代码也完全符合我的预期。非常有创意的解决方法。不过要小心,这感觉更像是一个黑客。您可能会遇到其他类型的不规则浮动的问题(例如,不确定无穷大)