Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to convert an Eigen Vector4 type to Vector3?

I want to extract the three first values of a Vector4 type in Eigen, into a Vector3 type. So far I am doing it in a for-loop. Is there a smarter way to do it?

like image 481
Reed Richards Avatar asked Aug 03 '14 12:08

Reed Richards


2 Answers

The .head() member function returns the first n elements of a vector. If n is a compile-time constant, then you can use the templated variant (as in the code example below) and the Eigen library will automatically unroll the loop.

Eigen::Vector4f vec4;
// initialize vec4
Eigen::Vector3f vec3 = vec4.head<3>();

In the Eigen documentation, see Block operations for an introduction to similar operations for extracting parts of vectors and matrices, and DenseBase::head() for the specific function.

like image 52
Jitse Niesen Avatar answered Sep 19 '22 20:09

Jitse Niesen


The answer of @Jitse Niesen is correct. Maybe this should be a comment on the original question, but I found this question because I had some confusion about Eigen. In case the original questioner, or some future reader has the same confusion, I wanted to provide some additional explanation.

If the goal is to transform 3d (“position”) vectors by a 4x4 homogeneous transformation matrix, as is common in 3d graphics (e.g. OpenGL etc), then Eigen provides a cleaner way to do that with its Transform template class, often represented as the concrete classes Affine3f or Affine3d (as tersely described here). So while you can write such a transform like this:

Eigen::Matrix4f transform;      // your 4x4 homogeneous transformation
Eigen::Vector3f input;          // your input
Eigen::Vector4f input_temp;
input_temp << input, 1;         // input padded with w=1 for 4d homogeneous space
Eigen::Vector4f output_temp = transform * input_temp;
Eigen::Vector3f output = output_temp.head<3>() / output_temp.w(); // output in 3d

You can more concisely write it like this:

Eigen::Affine3f transform;      // your 4x4 homogeneous transformation
Eigen::Vector3f input;          // your input
Eigen::Vector3f output = transform * input;

That is: an Eigen::Affine3f is a 4x4 homogeneous transformation that maps from 3d to 3d.

like image 24
Craig Reynolds Avatar answered Sep 20 '22 20:09

Craig Reynolds