2015-07-21 21 views
8

E 'possibile inizializzare una matrice statica eigen in un file di intestazione? Voglio usarlo come variabile globale.C++ Eigen inizializza la matrice statica

mi piacerebbe fare qualcosa sulla falsariga di:

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

o simili a vettori:

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

Ecco un link alle Eigen documenti matrice. Non riesco a trovare come farlo da lì.

risposta

6

Sulle linee della risposta di Dawid (che ha un piccolo problema, vedere i commenti), si può fare:

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 prende cura del provvisorio, quindi non preoccuparti di una copia extra.

2

È possibile utilizzare l'inizializzazione lambda come questo:

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

sembra molto bello, anche se sto ricevendo 'errore: conversione da 'Eigen :: CommaInitializer >' a non scalare digita 'Eigen :: Matrix4d {aka Eigen :: Matrix }' richiesto}(); ' – vsoftco

+0

Ottengo l'errore': C2440: 'inizializzazione': impossibile convertire da 'Eigen :: CommaInitializer ' a 'Eigen :: Matrix ' con [Derived = Eigen :: Matrix ] Costruttore per la classe 'Eigen :: Matrix 'è dichiarato' esplicito'' –

+1

@MattStokes il piccolo problema è che il risultato di 'Matrix4d << a, b, c, ...' è un oggetto di tipo 'CommaInitializ er', che non è convertibile in 'Matrix4d'. – vsoftco

8

Una soluzione più elegante potrebbe includere l'uso di finished(). La funzione restituisce 'la matrice creata una volta impostati tutti i suoi coefficienti'.

Esempio:

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

Questa è una grande risposta, ottimizzata! È decisamente più elegante del mio, non sapevo che puoi farlo in questo modo. – vsoftco

+0

dovrebbe essere contrassegnato come risposta accettata – OnurA

Problemi correlati