C++ 当不存储中间结果时,Eigen给出错误的结果
为牛顿方法编写实现雅可比矩阵的函数时,我注意到了一个非常严重的错误 调用函数C++ 当不存储中间结果时,Eigen给出错误的结果,c++,eigen,C++,Eigen,为牛顿方法编写实现雅可比矩阵的函数时,我注意到了一个非常严重的错误 调用函数 auto-DF=[T](VectorXd-y){ 返回PhiAndW(y(0),y(1),T).second-MatrixXd::Identity(2,2); }; 仅返回PhiAndW(y(0),y(1),T)的值。秒并忽略MatrixXd::Identity(2,2)的减法。但是如果我把代码改成 auto-DF=[T](VectorXd-y){ MatrixXd mat=PhiAndW(y(0),y(1),T)。
auto-DF=[T](VectorXd-y){
返回PhiAndW(y(0),y(1),T).second-MatrixXd::Identity(2,2);
};
仅返回PhiAndW(y(0),y(1),T)的值。秒并忽略MatrixXd::Identity(2,2)
的减法。但是如果我把代码改成
auto-DF=[T](VectorXd-y){
MatrixXd mat=PhiAndW(y(0),y(1),T)。第二个-MatrixXd::Identity(2,2);
返回垫;
};
一切都天衣无缝
我试图复制它,但这不是完全相同的行为,但它的行为也不符合要求:
考虑以下代码:
MatrixXd FF(MatrixXd y){
返回y;
}
int其他(){
自动测向=[](矩阵y){
MatrixXd检验=FF(y)-MatrixXd::恒等式(2,2);
回归试验;
};
std::cout由于这些评论基本上解决了我的问题(非常感谢),我想我应该继续回答我的问题,让其他人看到这个问题已经解决了
为什么会出现这个问题?
问题在于,例如,两个矩阵的本征乘法的结果类型不是本征矩阵,而是表示乘法并引用我们试图乘法的两个矩阵的某个内部对象
因此,如果我们使用auto
关键字,编译器很可能不会给出我们正在设置的变量类型MatrixXd
,而是一些内部对象的类型
有关更多信息,请参阅,其中明确说明:
简言之:除非您100%确定自己在做什么,否则不要将auto关键字与Eigen表达式一起使用。特别是,不要将auto关键字用作矩阵类型的替换
我如何防止它发生?
- 不要使用
auto
关键字,使用显式类型
- 对于lambda函数,始终指定返回类型:Write
auto-DF=[]()->MatrixXd{…}
而不是auto-DF=[](){…}
请阅读本页有关使用auto
的部分:(在本例中,auto
隐式表示lambda的返回类型)您是否尝试过auto DF=[]()->MatrixXd{…}
?这应该强制计算返回值。这是另一个很好的例子,auto
可能不像其他人(除了我)似乎相信的那么酷;-)我假设显式强制转换也会修复第一个示例:auto DF=[](MatrixXd y){return MatrixXd(FF(y)-MatrixXd::Identity(2,2));};
@Scheff
> 1 0
> 0 1
>
> 1 0
> 0 1
auto DF = [](MatrixXd y){
return FF(y) - MatrixXd::Identity(2,2);
};
> 2.22045e-15 1.63042e-322
> 2.37152e-322 -0.999998