例如,假设我想编写一个函数来检查密集特征对象中的每个浮点数是否为normal,1.0如果正常则返回相应位置,或者0.0如果不正常则返回.不得立即评估输出,最好采用表达式的形式.
我已经阅读了关于将特征对象作为参数传递的文档,这使我尝试了以下方法:
#include <functional>
#include <Eigen/Dense>
template <typename Derived>
auto Fun(const Eigen::DenseBase<Derived>& matrix) -> decltype(matrix.unaryExpr(std::ptr_fun<typename Derived::Scalar, bool>(std::isnormal)).template cast<typename Derived::Scalar>())
{
return matrix.unaryExpr(std::ptr_fun<typename Derived::Scalar, bool>(std::isnormal)).template cast<typename Derived::Scalar>();
}
int main()
{
Eigen::Matrix<double, -1, -1> mat;
mat.resize(100,100);
mat.fill(100);
auto mat2 = Fun(mat);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这失败了,unaryExpr没有为类型对象定义的错误,Eigen::DenseBase<Derived>果然,如果我查看文档,DenseBase我看到没有这样的功能.
那么,每次我想调用此函数并将特征对象转换为已评估时Matrix,如果没有强制求值,我该如何实现呢?