如何在xt::filter中使用相等判断?operator==编译报错如何解决
问题原因
xtensor 中operator==的语义和<、>等比较运算符不同:</>等运算符执行逐元素比较,返回和输入数组同形状的布尔张量;而operator==用于判断两个张量的所有元素是否完全相等,返回单个布尔值,因此无法直接作为xt::filter需要的掩码条件,不是接口未实现。
可行替代方案
有两种常用的替代方案可以实现逐元素相等判断的筛选:
- 方案1:使用
xt::equal函数xt::equal是专门用于逐元素相等比较的接口,会返回符合xt::filter要求的布尔掩码数组。注意要保证比较的标量和数组元素类型匹配,你使用的是xt::xarray<float>,所以标量要用2.f而非int类型的2避免类型不匹配。 - 方案2:浮点数场景推荐使用
xt::isclose函数
浮点数存在精度误差,直接判等容易出现预期外的结果,xt::isclose支持设置相对容差和绝对容差,更适合浮点数的相等判断场景。
修改后可正常运行的代码
#include <iostream> #include "xtensor/xadapt.hpp" #include "xtensor/xarray.hpp" #include "xtensor/xindex_view.hpp" #include "xtensor/xio.hpp" #include "xtensor/xmasked_view.hpp" #include "xtensor/xview.hpp" // 显式引入xmath.hpp保证xt::equal/xt::isclose可用,避免部分版本依赖缺失编译失败 #include "xtensor/xmath.hpp" using namespace std; int main() { xt::xarray<float> a = {{1, 2, 3}, {4, 2, 6}, {9, 0, 2}}; cout << a << endl; // 方案1写法 xt::filter(a, xt::equal(a, 2.f)) = 10; // 浮点数场景优先用方案2写法 // xt::filter(a, xt::isclose(a, 2.f)) = 10; cout << a << endl; }
运行后数组中所有值为2的元素都会被修改为10,符合预期。
内容的提问来源于stack exchange,提问作者Joseph Summerhays
相关产品推荐
相关产品推荐

