为什么我不能在 Eigen3 中消除这个临时变量?
Why can't I eliminate this temporary variable in Eigen3?
我在逐矩阵乘法时遇到了麻烦。也就是说,一个看起来无害的表达式总是返回一个接近 [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% 确定自己在做什么"。
如果使用显式类型,则程序将更清晰,更有可能工作。
相关文章:
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- 变量不能明确
- 流变量不能出现在 OpenMP 第一私有中?
- 为什么 UInt64 变量不能包含大于 UInt32::Max 的值?
- 变量不能在 lambda 中隐式捕获,并且没有使用 switch 语句指定捕获默认值
- 什么形式上保证了非原子变量不能看到凭空出现的值,并像理论上原子一样创造数据竞赛?
- 为什么可以将Char指针变量初始化为字符串,而INT指针变量不能初始化到整数数组
- clang vs gcc CRTP:constexpr 变量不能有非文字类型
- 为什么这些变量不能移动?
- 为什么我的基类指针变量不能访问派生类中的函数?
- 变量不能出现在常量表达式中
- 哪些临时变量不能在 c++11 中使用“someType()”初始化
- 为什么除了直接赋值0之外,bool变量不能设置为0
- 常量变量不能是引用的模板参数,但非常量可以
- WARN:变量不能绑定(它要么不存在,要么已经被优化掉了)
- 整型变量不能存储大的值
- 变量不能在没有指定capture-default的lambda中隐式捕获
- 变量不能产生正确的数据