You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:42:39