在头文件中初始化常量特征矩阵

时间:2014-09-23 15:47:18

标签: c++ eigen

这是一个非特征用户可以回答的问题......

我想使用Eigen API来初始化头文件中的常量矩阵,但是Eigen似乎没有提供构造函数来实现这一点,以下是我尝试过的:

// tried the following first, but Eigen does not provide such a constructor
//const Eigen::Matrix3f M<<1,2,3,4,5,6,7,8,9;
// then I tried the following, but this is not allowed in header file
//const Eigen::Matrix3f M;
//M <<1,2,3,4,5,6,7,8,9; // not allowed in header file

在头文件中实现此目的的替代方法是什么?

3 个答案:

答案 0 :(得分:10)

至少有两种可能性。第一个是使用Eigen的逗号初始化功能:

Eigen::Matrix3d A((Eigen::Matrix3d() << 1, 2, 3, 4, 5, 6, 7, 8, 9).finished());

第二种是使用Matrix3d(const double*)构造函数来复制原始指针中的数据。在这种情况下,必须以与目标的存储顺序相同的顺序提供值,因此在大多数情况下按列进行:

const double B_data[] = {1, 4, 7, 2, 5, 8, 3, 6, 9};
Eigen::Matrix3d B(B_data);

答案 1 :(得分:1)

你不能把任意代码放在这样的函数之外。

尝试以下方法。该实现甚至可以在源文件中进行更快的编译。

const Eigen::Matrix3f& GetMyConst()
{
    static const struct Once
    {
        Eigen::Matrix3f M;

        Once()
        {
            M <<1,2,3,4,5,6,7,8,9;
        }
    } once;
    return once.M;
}

答案 2 :(得分:1)

我还没有看到在Header中完全做到这一点的方法 这应该有效:

const Eigen::Matrix3f& getMyConst()
 {
    static Eigen::Matrix3f _myConstMatrix((Eigen::Matrix3f() << 1,2,3,4,5,6,7,8,9).finished()));

    return _myConstMatrix;
 }

 #define myConst getMyConst() // To access it like a variable without "()"

我从未与Eigen合作过,所以我无法测试它......