具有不同返回类型的特征系数运算符

时间:2017-03-06 21:08:52

标签: c++ eigen

我希望有一个特征系数运算符,其中返回类型与输入矩阵类型不同,例如,

struct TimesPi {
  double operator()(int v) { return 3.14 * v; }
};

// in main
Eigen::Vector3i vec_ints(1, 2, 3);
Eigen::Vector3d vec_dbls = vec_ints.unaryExpr<TimesPi>();

这会导致编译器错误消息error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY

如何生成返回不同类型的元素操作?

编辑:对于我所拥有的特定情况(与示例不同),我不能使用强制转换(例如,使用自定义标量类型)。我认为unaryExpr在这里使用可能是错误的。也许是CwiseUnaryOp的东西?

更合适的例子可能是

struct SomeOperation {
  double operator()(const Foo& v) { return v.attribute; }
};

// in main
Eigen::Matrix<Foo, 3, 1> vec_foos;
Eigen::Matrix<double, 3, 1> = vec_foos.unaryExpr<SomeOperation>();

2 个答案:

答案 0 :(得分:1)

我想这只是一个简化的例子,在你的真实场景中,仿函数要复杂得多,并且不能通过连接标准的一元运算符来实现。如果是这样,那么你有两个解决方案:

  1. 在C ++ 11模式下编译(例如,result_type),以便Eigen可以使用c ++ 11 std :: result_of自动计算返回类型。 (您还需要制作#include <Eigen/Dense> struct TimesPi { typedef double result_type; // needed for c++98/03 only double operator()(int v) const { return 3.14 * v; } }; int main() { Eigen::Vector3i vec_ints(1, 2, 3); Eigen::Vector3d vec_dbls = vec_ints.unaryExpr(TimesPi()); } const)
  2. 如果您需要c ++ 98兼容性,那么您必须告诉Eigen public class TModel { public int TID{get;set;} public string Name{get;set;} public string Location{get;set;} public string address{get;set;} } public class UiModel { public string Name{get;set;} public string Location{get;set;} } 如下:

  3. cfg.CreateMap < TModel, UiModel  >();
    cfg.CreateMap < UiModel,TModel > ();
    

答案 1 :(得分:0)

我看起来不需要使用结构来创建一元Expr。为什么不呢......

Eigen::Vector3i vec_ints(1,2,3);
Eigen::Vector3d vec_dbls = vec_ints.cast<double>() * M_PI;

std::cout << vec_dbls << std::endl;

返回......

3.14159
6.28319
9.42478