繁体   English   中英

Eigen:如何将未知大小的矩阵存储为类中的成员?

[英]Eigen: How do you store a matrix of unknown size as a member in a class?

我最近一直在教自己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类而不将矩阵复制到类中?

如果我想根据传递给构造函数的矩阵类型初始化其类型,我应该使用什么类型的成员矩阵? 有没有办法在不指定任何类型的模板参数的情况下执行此操作?

直接......我不知道怎么做。

但是如果你接受使用模板“make”功能

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);

Ps:我想你的Data作为模板参数接收一个类型和两个整数; 不是三种类型。

鉴于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类,因为它有一个需要保存不同类型矩阵的成员(我假设)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM