2017-03-06 84 views
1

明智操作者我想有一个本征coeffientwise操作者在返回类型从输入矩阵类型不同,例如,本征系数具有不同的返回类型

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>(); 
+0

我的天堂” t使用了Eigen,但是我可以从错误消息中猜出它就像'vec_ints.cast ().unaryExpr ()'。 – chris

+0

对于具体情况我有(不同于示例),我不能使用强制转换。我认为'unaryExpr'可能是在这里使用的错误的东西。也许有'CwiseUnaryOp'的东西? – Jeff

+0

这看起来像表达式模板类,不应该需要明确使用。在它的页面上,我也看到它看起来应该直接允许'x * vec'。 – chris

回答

1

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

  1. 编译C++ 11模式(例如,-std=c++11),因此本征可以使用C++ 11的std ::的result_of的找出返回自动输入。 (你也需要让你的operator()常量)
  2. 如果你需要C++ 98的兼容性,那么你必须告诉艾根的result_type如下:


#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()); 
} 
+0

谢谢,这正是我正在寻找的。指定result_type用于我的自定义标量类型。 – Jeff

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