我希望有一个特征系数运算符,其中返回类型与输入矩阵类型不同,例如,
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 :(得分:1)
我想这只是一个简化的例子,在你的真实场景中,仿函数要复杂得多,并且不能通过连接标准的一元运算符来实现。如果是这样,那么你有两个解决方案:
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)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;}
}
如下:
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