web-dev-qa-db-ja.com

C ++ Eigenは静的行列を初期化します

ヘッダーファイルで静的固有行列4dを初期化することは可能ですか?グローバル変数として使いたいです。

次のようなことをしたいのですが。

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

これが リンク 固有行列のドキュメントです。そこからこれを行う方法を見つけることができないようです。

16
Matt Stokes

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

戻り値の最適化 一時的な処理を行うため、余分なコピーの心配はありません。

10
vsoftco

より洗練された解決策には、 finished() の使用が含まれる場合があります。この関数は、すべての係数が設定されると、構築された行列を '返します。'

例えば:

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

次のように初期化ラムダを使用できます。

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;
}();
3
Dawid