Eigen中逐元素除法遇除数为0时如何将对应结果置0
Eigen逐元素除法除数为0的处理方法
直接执行c = b/a的写法会在除数a为0的位置产生inf或nan值,不符合结果为0的预期,可通过Eigen Array内置的select()条件选择方法实现需求,全程为向量化运算,无额外性能损耗。
实现逻辑
逐元素判断除数是否为0:
- 若除数不等于0,该位置返回
b/a的计算结果 - 若除数等于0,该位置直接返回0
修正后可直接运行的代码
#include <iostream> #include <Eigen/Dense> using namespace Eigen; int main() { ArrayXd a(3), b(3), c; a << 1, 2, 0; b << 1.2, 3.4, 5.6; // 条件分支计算,避免除零 c = (a != 0).select(b / a, 0); // 打印验证结果 std::cout << c << std::endl; /* 输出结果: 1.2 1.7 0 */ }
注意事项
- 条件判断部分
(a != 0)的括号不能省略,否则会因C++运算符优先级问题触发语法错误 - 如果除数是浮点类型,可根据业务精度要求将判断条件替换为阈值判断,比如
a.abs() > 1e-12,避免浮点计算误差导致的极小值被误判为非零,触发异常除零结果 - 该方法仅适用于Eigen的Array类型逐元素操作,如果是Matrix类型需要先调用
.array()方法转换为Array视图再做计算。
内容的提问来源于stack exchange,提问作者Maxime Charrière
相关产品推荐
相关产品推荐

