我最近一直在教自己C ++并希望在一个新项目上尝试一下。我决定使用Eigen构建一个非常简单的机器学习库来存储和操作数据。我想要一个存储特征矩阵的数据类,它可以对所述矩阵执行shuffle和分区操作。
我的麻烦在于确定成员矩阵的类型。理想情况下,我可以使用已经创建的Eigen矩阵调用构造函数,并使成员矩阵采用该类型。
如果我想要初始化其类型,我应该使用哪种类型的成员矩阵 基于传递给构造函数的矩阵类型?有没有办法在不指定任何类型的模板参数的情况下执行此操作?
template <class T1, class T2, class T3>
class Data{
private:
Eigen::MatrixBase<T1,T2,T3> X;
public:
Data(Eigen::Matrix<T1,T2,T3> feature_matrix ): X{feature_matrix};
};
int main()
{
Eigen::Matrix<int,2,2> m;
m<<1,2,3,4 ;
Data d(m); //doesn't work because Data is missing template args
return 0;
}
要添加这个问题,因为它似乎不是矩阵类的移动构造函数,有没有任何智能方法来构造Data类而不将矩阵复制到类中?
答案 0 :(得分:3)
如果我希望根据传递给构造函数的矩阵类型初始化其类型,我应该使用哪种类型的成员矩阵?有没有办法在不指定任何类型的模板参数的情况下执行此操作?
直接......我不知道如何。
但是如果你接受使用模板&#34; make&#34;功能
template <typename T, int I1, int I2>
Data<T, I1, I2> makeData (Eigen::Matrix<T, I1, I2> em)
{ return em; }
使用auto
(如果您可以使用C ++ 11或C ++ 14),您可以按如下方式初始化d
auto d = makeData(m);
P.s。:我想你的Data
作为模板参数接收一个类型和两个整数;不是三种类型。
答案 1 :(得分:0)
鉴于Eigen::Matrix
模板参数有typedef,您可以简化为单个模板参数。例如,假设Eigen::Matrix
具有以下声明:
namespace Eigen
{
template<class cell_type, int rows, int columns>
class Matrix
{
public:
typedef cell_type CellType;
static const int Rows = rows;
static const int Columns = columns;
//Other stuff
}
}
然后你可以这样编写你的Data
课程:
template<class matrix_type>
class Data
{
private:
Eigen::MatrixBase<typename matrix_type::CellType, matrix_type::Rows, matrix_type::columns> X;
//Rest
}
并像这样实例化:
typedef Eigen::Matrix<int,2,2> mat_type;
mat_type m;
m<<1,2,3,4 ;
Data<mat_type> d(m);
你不能放弃将模板参数传递给Data
类,因为它有一个成员需要持有不同类型的矩阵(我假设)。