为什么我不能在 Eigen3 中消除这个临时变量?

Why can't I eliminate this temporary variable in Eigen3?

本文关键字:变量 不能 Eigen3 为什么      更新时间:2023-10-16

我在逐矩阵乘法时遇到了麻烦。也就是说,一个看起来无害的表达式总是返回一个接近 [1 0] 的向量,而一个看起来相似的表达式返回正确的结果:

// version WITH temp var, correct
Eigen::Vector3d lcoord_eig(lcoord[0], lcoord[1], lcoord[2]);
auto lcoord2d = P3to2 * lcoord_eig;
std::cout << std::endl << lcoord2d << std::endl;
// version WITHOUT temp var, always [1 0]
auto lcoord2d_2 = P3to2 * Eigen::Vector3d(lcoord[0], lcoord[1], lcoord[2]);
std::cout << std::endl << lcoord2d_2 << std::endl;

其中P3to2是一个2×3矩阵(Eigen::MatrixXd),lcoord是其他库的3D向量类型,上面的代码包含在for循环中。

一些输出(我的注释):

-0.0036135
2.1684e-18   // correct
1
0   // [1 0], wrong
0.00209583
0.000388139   // correct
1
5.55112e-17   // [1 0], wrong
0.00148429
-0.000435008   // correct
1
5.55112e-17   // [1 0], wrong

这个错误花了我很长时间才发现,我仍然不明白发生了什么会导致第二个版本的行为像这样。我犯了什么错误?


编辑:常量向量也会发生这种情况,例如Eigen::Vector3d(.5,.5,.5)

我的猜测(鉴于您在问题中没有包含足够的信息供任何人复制)是使用auto是您的问题。在你的第二种情况下,非工作的情况,我怀疑你留下了一个悬而未决的参考被摧毁的临时Vector3D.

文档说"不要将自动关键字与 Eigen 的表达式一起使用,除非您 100% 确定自己在做什么"。

如果使用显式类型,则程序将更清晰,更有可能工作。