我通过逐个矩阵乘法遇到了麻烦。即一个看上去很像的表达式总是返回一个接近[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)
答案 0 :(得分:5)
我的猜测(假设您没有在问题中包含足够的信息供任何人复制),使用auto
是您的问题。在你的第二个案例中,非工作的一个,我怀疑你留下了对被破坏的临时Vector3D
的悬挂引用。
documentations说“不要将自动关键字与Eigen的表达式一起使用,除非你100%确定你在做什么”。
如果您使用显式类型,您的程序将更清晰,更有可能发挥作用。