2014-09-23 6 views
8

To jest pytanie, na które można odpowiedzieć przez non-Eigen użytkownika ...Inicjalizacja stałą Eigen matrycy w pliku nagłówkowym

chcę użyć API EIGEN zainicjować stałą matrycę w pliku nagłówka, ale Eigen nie wydaje zapewniając konstruktora do osiągnięcia tego celu, a po to, co starałem:

// 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 

Co jest alternatywą dla osiągnięcia tego celu w pliku nagłówka?

+0

Jeśli to w pliku nagłówka, dane mogą być kopiowane dla każdego źródła plik, który go zawiera, marnując pamięć. –

Odpowiedz

9

Istnieją co najmniej dwie możliwości. Pierwszym z nich jest za pomocą funkcji przecinek initialiser z Eigen:

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

Drugi jest za pomocą konstruktora, który kopiuje dane z surowego wskaźnik Matrix3d(const double*). W tym przypadku wartości muszą być dostarczone w tej samej kolejności, niż w celu składowania w miejscu przeznaczenia, więc kolumna-wise w większości przypadków:

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

Czy inicjator przecinka nie wypełnia macierzy wierszowo, podczas gdy inicjalizacja macierzy danych surowych zakłada wypełnianie kolumn? Więc dostaniesz transpozycję pożądanej matrycy? –

+0

Dokładnie, zaktualizowałem odpowiedź. – ggael

1

Nie można umieścić dowolnego kodu poza taką funkcją.

Spróbuj wykonać następujące czynności. Implementacja może nawet znajdować się w pliku źródłowym w celu szybszej kompilacji.

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

nie widziałem sposób, aby zrobić to całkowicie w nagłówku ale to powinno działać:

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 "()" 

Nigdy nie pracowałem z Eigen więc mogę go przetestować ...