2014-12-10 10 views
5

Jest to dość proste zadanie, ale nie był w stanie znaleźć odpowiedź na to:kolumna Dołącz do Matrix, stosując Eigen bibliotekę

wykorzystaniem biblioteki EIGEN załóżmy, że mam Matrix2Xd mat i Vector2d vec, gdzie

mat = 1 1 1 
     1 1 1 
vec = 2 2 

teraz muszę coś podobnego mat.addCol(vec) tak że potem

mat = 1 1 1 2 
     1 1 1 2 

Jaki jest najlepszy (najprostszy) sposób, aby osiągnąć ten cel?

Należy pamiętać, że nie jest to duplikat numeru How do you make a matrix out of vectors in eigen?. Nie chcę inicjować konstrukcji macierzy, ale dołącz do istniejącej. A może jest jakaś sztuczka, jak użyć w tym przypadku inicjalizacji przecinkiem? Poniższy kod nie powiedzie:

Matrix2Xd mat(2,3); 
Vector2d vec; 
mat << 1, 1, 1, 1, 1, 1; 
vec << 2, 2; 

cout << mat << endl; 
mat << vec;    // <-- crashes here 
cout << mat << endl; 

Edycja: następujące prace, ale nie podoba mi się konieczność zmiennej tymczasowej dla takiego podstawowego zadania. Czy istnieje lepszy sposób?

Matrix2Xd tmp(2, mat.cols()+1); 
tmp << mat, vec; 
mat = tmp; 
+1

można było odczytać pierwszą odpowiedź w dupe: „Matryca m mus zostały odpowiednio przeskalowane w pierwszej kolejności.”? Macierz Eigen ma funkcję składową ['resize'] (http://eigen.tuxfamily.org/dox/classEigen_1_1PlainObjectBase.html#afbbb33d14fe7fb9683019a39ce1c659d) ... Dokumentację można przeglądać lub czytać przynajmniej. – rubenvb

+1

@rubenvb 'resize' nie zachowuje zawartości macierzy. Jeśli zrobię 'mat.resize (2, mat.cols() + 1);', macierz jest wypełniona później pewnymi losowymi wartościami. – luator

+0

Następnie musisz utworzyć tymczasowy lub zainicjować go do prawidłowego rozmiaru. – rubenvb

Odpowiedz

9

Można użyć do tego celu conservativeResize:

mat.conservativeResize(mat.rows(), mat.cols()+1); 
mat.col(mat.cols()-1) = vec; 
+3

Dzięki, to działa. Doszedłem do wniosku, że możliwe jest nawet napisanie 'mat.conservativeResize (NoChange, mat.cols() + 1);' która pozwala na niezmienioną liczbę wierszy. – luator