将Eigen Vector4类型转换为Vector3的最佳方法是什么?

Ree*_*rds 13 c++ data-conversion eigen

我想将Eigen中Vector4类型的三个第一个值提取到Vector3类型中.到目前为止,我在for循环中进行此操作.有更聪明的方法吗?

Jit*_*sen 21

所述.head()成员函数返回第一Ñ一个矢量的元素.如果n是编译时常量,那么您可以使用模板化变量(如下面的代码示例中所示),并且Eigen库将自动展开循环.

Eigen::Vector4f vec4;
// initialize vec4
Eigen::Vector3f vec3 = vec4.head<3>();
Run Code Online (Sandbox Code Playgroud)

在Eigen文档中,请参阅块操作以了解用于提取向量和矩阵的部分的类似操作,以及用于特定函数的DenseBase :: head().


Cra*_*lds 5

@Jitse Niesen 的答案是正确的。也许这应该是对原始问题的评论,但我发现这个问题是因为我对 Eigen 有一些困惑。如果最初的提问者或一些未来的读者有同样的困惑,我想提供一些额外的解释。

如果目标是通过 4x4 齐次变换矩阵来变换 3d(“位置”)向量,这在 3d 图形(例如 OpenGL 等)中很常见,那么 Eigen 提供了一种更简洁的方法来使用它的Transform模板类来做到这一点,通常表示为具体类Affine3fAffine3d(如简洁地描述在这里)。因此,虽然您可以编写这样的转换:

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
Run Code Online (Sandbox Code Playgroud)

你可以更简洁地写成这样:

Eigen::Affine3f transform;      // your 4x4 homogeneous transformation
Eigen::Vector3f input;          // your input
Eigen::Vector3f output = transform * input;
Run Code Online (Sandbox Code Playgroud)

也就是说:一个Eigen::Affine3f是一个 4x4 同构变换,它从 3d 映射到 3d。