2015-07-21 24 views
8

Bir başlık dosyasında bir statik eigen matrix4d başlatılması mümkün mü? Bunu global değişken olarak kullanmak istiyorum.C++ Özgün statik matris başlatılıyor

Ben çizgisinde bir şey yapmak istiyorum:

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

Veya benzer vektörlere:

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

eigen matris dokümanlar için link olduğunu. Bunu nasıl yapacağımı göremiyorum.

cevap

6

:

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 alır geçici bakım, bu yüzden fazladan bir kopya hakkında endişelenmeyin.

2

Böyle başlatma lambda kullanabilirsiniz: yapabileceğiniz (yorumları görmek, küçük bir sorunu var) Dawid cevabı hatları üzerinde

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

, çok güzel görünüyor: dönüşüm 'Eigen :: CommaInitializer <çift Eigen :: Matrix <4, 4,>>' olmayan skalar için 'Eigen :: Matrix4d {aka Eigen :: Matrix <çift, 4, 4>}' talep edildi}(); ' – vsoftco

+0

'Hata: C2440:' başlatılıyor ':' Eigen :: CommaInitializer ''dan dönüştürülemiyor' 'Eigen :: Matrix <çift, 4,4,0,4,4>' ye [Türetilmiş = Eigen :: Matrix <çift, 4,4,0,4,4>] 'Eigen :: Matrix sınıfı için kurucu <çift, 4,4,0,4,4> '' açık '' –

+1

@MattStokes bildirilmiştir küçük sorun 'Matrix4d << a, b, c, ... 'sonucudur türünün bir nesnesidir 'CommaInitializ Matrix4d'ye dönüştürülemeyen er '. – vsoftco

8

Daha şık bir çözüm, finished() kullanımını içerebilir. Fonksiyon, tüm katsayıları ayarlandıktan sonra 'dahili matrisi döndürür.'

Örn: Ben hata `alıyorum rağmen

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

Bu harika bir cevap, aşağı çekildi! Kesinlikle benimkinden daha zarif, bu şekilde yapabileceğini bilmiyordum. – vsoftco

+0

bu kabul edilen cevap olarak işaretlenmelidir – OnurA