【问题标题】:Eigen: How do you store a matrix of unknown size as a member in a class?Eigen:您如何将未知大小的矩阵存储为类中的成员?
【发布时间】:2017-05-18 01:19:15
【问题描述】:

我最近一直在自学 C++,并想在一个新项目中尝试一下。我决定使用 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;
  }

补充一下这个问题,因为矩阵类似乎没有移动构造函数,有没有什么聪明的方法来构造一个数据类而不将矩阵复制到类中?

【问题讨论】:

标签: c++ templates eigen


【解决方案1】:

如果我想根据传递给构造函数的矩阵类型来初始化成员矩阵的类型,我应该创建什么类型的成员矩阵?有没有办法在不指定任何类型的模板参数的情况下做到这一点?

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

但如果您接受使用模板“制作”功能

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 接收一个类型和两个整数作为模板参数;不是三种类型。

【讨论】:

    【解决方案2】:

    鉴于Eigen::Matrix 模板参数有类型定义,您可以简化为单个模板参数。例如,假设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 类,因为它有一个成员需要保存不同类型的矩阵(我假设)。

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      相关资源
      最近更新 更多