16
votes

It's quite a simple task, but I was not able to find an answer to it:

Using the Eigen library, suppose I have Matrix2Xd mat and Vector2d vec, where

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

Now I need something like mat.addCol(vec) such that afterwards

mat = 1 1 1 2
      1 1 1 2

What is the best (simplest) way to accomplish this?

Please note, that this is not a duplicate of How do you make a matrix out of vectors in eigen?. I don't want to initialy construct the matrix but append to an existing one. Or is there maybe a trick, how to use the comma initialization in this case? The following code will fail:

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;

Edit: The following works, but I don't like the need of a temporary variable for such a basic task. Is there a better way?

Matrix2Xd tmp(2, mat.cols()+1);
tmp << mat, vec;
mat = tmp;
1
You did read the first answer in the dupe: "The matrix m mus have been properly resized first."? An Eigen Matrix has a resize member function... Documentation can be googled, or read, at the least.rubenvb
@rubenvb resize does not keep the content of the matrix. If I do mat.resize(2, mat.cols()+1);, the matrix is filled with some random values afterwards.luator
Then you'll need to either create a temporary or initialize it to the correct size.rubenvb
@rubenvb The size is not known in the beginning, so this is not possible. I hoped there is a better solution than copying all the data to a temporary :/luator
just so you know, those functions might well reallocate the memory, you're just "hiding" that fact from plain view. See e.g. this question for some more info.rubenvb

1 Answers

28
votes

You can use conservativeResize for that purpose:

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