2015-07-21 19 views
8

Czy można zainicjować statyczną matrycę elektroniczną4d w pliku nagłówkowym? Chcę używać go jako zmiennej globalnej.C++ zainicjować macierz statyczną

Chciałbym zrobić coś wzdłuż linii:

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

lub podobne do wektorów:

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

Oto link do docs macierzy EIGEN. Nie mogę znaleźć sposobu, aby to zrobić.

Odpowiedz

6

na liniach odpowiedzi Dawid zrobił (który ma mały problem, patrz komentarze), można zrobić:

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 trwa opieka tymczasowa, więc nie martw się o dodatkową kopię.

2

Można używać inicjalizacji lambda tak:

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

Wygląda bardzo ładnie, choć jestem coraz 'błąd: konwersja z 'Eigen :: CommaInitializer >' do nieskalarnych wpisz 'Eigen :: Matrix4d {aka Eigen :: Matrix }' requested}(); ' – vsoftco

+0

Otrzymuję komunikat" error: C2440: "initializing": nie można przekonwertować z 'Eigen :: CommaInitializer ' do 'Eigen :: Matrix ' z [Derived = Eigen :: Matrix ] Konstruktor klasy "Eigen :: Matrix 'jest deklarowane' explicite'' –

+1

@MattStokes małym problemem jest to, że wynik 'Matrix4d << a, b, c, ...' jest obiektem typu 'CommaInitializ er'', który nie jest wymienny na 'Matrix4d'. – vsoftco

8

Bardziej eleganckie rozwiązanie może obejmować użycie finished(). Funkcja zwraca "zbudowaną matrycę po ustawieniu wszystkich jej współczynników."

Np

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

To wspaniała odpowiedź, awansowano! Jest zdecydowanie bardziej elegancki niż mój, nie wiedziałem, że możesz to zrobić w ten sposób. – vsoftco

+0

powinno to być oznaczone jako zaakceptowana odpowiedź – OnurA

Powiązane problemy