是否可以初始化const Eigen矩阵?

Jan*_*egg 10 c++ constructor const initializer-list eigen

我有以下课程:

class Foo
{
public:
   Foo(double a, double b, double c, double d, double e)
   // This does not work:
   // : m_bar(a, b, c, d, e)
   {
      m_bar << a, b, c, d, e;
   }

private:
   // How can I make this const?
   Eigen::Matrix<double, 5, 1, Eigen::DontAlign> m_bar;
};
Run Code Online (Sandbox Code Playgroud)

我如何制作m_bar const并将其初始化为a到f作为构造函数中的值?C++ 11也没问题,但初始化程序列表似乎不受eigen支持...

Mar*_* A. 12

我看到最简单的解决方案,因为该类还定义了一个复制构造函数:

class Foo
{
public:
   Foo(double a, double b, double c, double d, double e) :
       m_bar( (Eigen::Matrix<double, 5, 1, Eigen::DontAlign>() << a, b, c, d, e).finished() )
   {
   }

private:
   const Eigen::Matrix<double, 5, 1, Eigen::DontAlign> m_bar;
};
Run Code Online (Sandbox Code Playgroud)


Jar*_*d42 5

你可以做一个实用功能

Eigen::Matrix<double, 5, 1, Eigen::DontAlign>
make_matrix(double a, double b, double c, double d, double e)
{
    Eigen::Matrix<double, 5, 1, Eigen::DontAlign> m;

    m << a, b, c, d, e;
    return m;
}
Run Code Online (Sandbox Code Playgroud)

然后:

class Foo
{
public:
   Foo(double a, double b, double c, double d, double e) :
       m_bar(make_matrix(a, b, c, d, e))
   {
   }

private:
   const Eigen::Matrix<double, 5, 1, Eigen::DontAlign> m_bar;
};
Run Code Online (Sandbox Code Playgroud)

或者你可以内联该函数并使用finished() :

class Foo
{
    using MyMatrice = Eigen::Matrix<double, 5, 1, Eigen::DontAlign>;
public:
   Foo(double a, double b, double c, double d, double e) :
       m_bar((MyMatrice() << a, b, c, d, e).finished())
   {
   }

private:
   const MyMatrice m_bar;
};
Run Code Online (Sandbox Code Playgroud)