如何在if语句中结合阈值对Eigen向量元素进行布尔判断?
解决Eigen向量阈值比较的编译错误
这个编译错误的核心原因是Eigen的Array比较表达式不会直接返回原生bool类型,而||运算符要求两边都是bool值。让我一步步帮你解决:
错误原因拆解
当你调用.array()并使用>比较时,哪怕是针对单个元素的向量片段(比如row(1)),Eigen返回的是一个Eigen::CwiseBinaryOp表达式对象,而不是直接的bool。虽然在某些简单上下文里这个1x1的表达式会隐式转成bool,但在||运算符的右侧,这种隐式转换不生效,就会触发类型不匹配的错误。
两种解决方案
方案1:显式提取布尔值(适配你原来的写法)
在每个比较表达式后面加上.value(),把Eigen的1x1布尔Array转换成原生bool:
Eigen::Vector3f Translation; Eigen::Vector3f prevTranslation; float threshold = 5; // 建议显式声明float类型,避免隐式转换问题 if ((Translation.row(1).cwiseAbs().array() > prevTranslation.row(1).cwiseAbs().array() + threshold).value() || (Translation.row(2).cwiseAbs().array() > prevTranslation.row(2).cwiseAbs().array() + threshold).value()) { std::cout << " #### EXXXITTTTTTT #### " << std::endl; return; }
方案2:直接操作标量元素(更简洁高效)
既然你只是比较向量的单个元素,完全不需要转成Array操作,直接用向量的元素访问+标准库的std::abs就可以,代码更清晰,还避免了Eigen表达式的类型问题:
Eigen::Vector3f Translation; Eigen::Vector3f prevTranslation; float threshold = 5; if (std::abs(Translation(1)) > std::abs(prevTranslation(1)) + threshold || std::abs(Translation(2)) > std::abs(prevTranslation(2)) + threshold) { std::cout << " #### EXXXITTTTTTT #### " << std::endl; return; }
这里Translation(1)对应你原来的Translation.row(1)(Eigen向量默认是列向量,(index)直接访问第index个元素,索引从0开始),用std::abs对标量取绝对值后直接比较,返回的就是原生bool,完美适配||运算符。
额外提示
- 尽量避免对单个元素使用Eigen的Array操作,直接对标量处理更高效易读。
- 显式声明变量类型(比如
float threshold = 5;而不是threshold = 5;)可以避免很多隐式转换带来的潜在问题。
内容的提问来源于stack exchange,提问作者Mohamad Halwani
相关产品推荐
相关产品推荐

