2015-07-21 193 views
8

是否可以初始化头文件中的静态特征矩阵4d?我想用它作为一个全局变量。C++ Eigen初始化静态矩阵

我想沿着线做一些事情:

static Eigen::Matrix4d foo = Eigen::Matrix4d(1, 2 ... 16); 

或类似的载体:

static Eigen::Matrix4d foo = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; 

这里是一个link的特征矩阵文档。我似乎无法从那里找到如何做到这一点。

回答

6

上的Dawid的答案的线(其中有一个小问题,见注释),你可以这样做:

static Eigen::Matrix4d foo = [] { 
    Eigen::Matrix4d tmp; 
    tmp << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16; 
    return tmp; 
}(); 

Return value optimization需要照顾临时,所以不用担心额外的副本。

2

您可以使用初始化拉姆达这样的:

static Eigen::Matrix4d foo = [] { 
    Eigen::Matrix4d matrix; 
    matrix << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16; 
    return matrix; 
}(); 
+0

看起来很漂亮,但我得到'错误:转换,从 '征:: CommaInitializer <征::矩阵<双,4,4>>' 非标type''Eigen :: Matrix4d {aka Eigen :: Matrix }'requested}();' – vsoftco

+0

我得到错误:C2440:'initializing':无法从'Eigen :: CommaInitializer '到'Eigen :: Matrix 'with [Derived = Eigen :: Matrix ] class'Eigen :: Matrix的构造方法'被声明为'explicit'' –

+1

@MattStokes小问题是'Matrix4d << a,b,c,...'的结果是类型的对象'CommaInitializ er',它不能转换为'Matrix4d'。 – vsoftco

8

更优雅的解决方案可能包括使用finished()。一旦设置了所有系数,函数就会返回''。

如:

static Eigen::Matrix4d foo = (Eigen::Matrix4d() << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16).finished(); 
+2

这是一个很棒的答案,upvoted!这绝对比我的更优雅,我不知道你可以这样做。 – vsoftco

+0

这应该被标记为接受的答案 – OnurA