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倍谢谢,这段代码也完全符合我的预期。非常有创意的解决方法。不过要小心,这感觉更像是一个黑客。您可能会遇到其他类型的不规则浮动的问题(例如,不确定无穷大)