如何在Eigen中为自定义类型实现allFinite方法?
解决Eigen中自定义类型使用allFinite的问题
问题原因
Eigen的allFinite()方法检查自定义类型时,会通过参数依赖查找(ADL)调用全局的isfinite函数,而非类型的成员函数。你之前定义的是成员函数isfinite(),Eigen无法识别该逻辑;同时成员函数内直接写isfinite(a)会递归调用自身,而非标准库的有限值检查函数,逻辑本身也存在错误。
解决方案
定义一个全局的(或与自定义类型同命名空间的)isfinite函数,明确调用标准库的std::isfinite来检查结构体成员变量:
示例代码
#include <Eigen/Core> #include <cmath> // 必须包含以使用std::isfinite struct Mytype{ double a; double b; }; // 全局命名空间下定义isfinite函数,Eigen会通过ADL找到它 bool isfinite(const Mytype& obj) { // 调用标准库函数检查每个成员的有限性 return std::isfinite(obj.a) && std::isfinite(obj.b); } int main() { Eigen::Array<Mytype,4,1> array; // 给数组元素赋值示例 array[0].a = 1.0; array[0].b = 2.0; array[1].a = NAN; array[1].b = 3.0; // 包含非有限值 bool result = array.allFinite(); // 此时会返回false,符合预期 return 0; }
命名空间适配
如果Mytype在自定义命名空间中,只需把isfinite函数放在同一命名空间内即可,Eigen会通过ADL自动查找:
namespace my_space { struct Mytype{ double a; double b; }; bool isfinite(const Mytype& obj) { return std::isfinite(obj.a) && std::isfinite(obj.b); } } // 使用示例 Eigen::Array<my_space::Mytype,4,1> array; array.allFinite(); // 正常工作
内容的提问来源于stack exchange,提问作者yuwen
相关产品推荐
相关产品推荐

