2015-07-21 199 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