【问题标题】:Initialize a constant eigen matrix in a header file在头文件中初始化一个常数特征矩阵
【发布时间】:2014-09-23 15:47:18
【问题描述】:

这是一个非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

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

【问题讨论】:

  • 如果它在头文件中,可能会为每个包含它的源文件复制数据,浪费内存。

标签: c++ eigen


【解决方案1】:

至少有两种可能性。第一个是使用 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);

【讨论】:

  • 逗号初始化器不是按行填充矩阵,而原始数据数组初始化假设按列填充?所以你会得到所需矩阵的转置?
【解决方案2】:

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

试试下面的。该实现甚至可以在源文件中以加快编译速度。

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

【讨论】:

    【解决方案3】:

    我还没有看到在标题中完全做到这一点的方法,但是 这应该工作:

    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 合作过,所以我无法对其进行测试...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2018-12-13
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多