Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当不存储中间结果时,Eigen给出错误的结果_C++_Eigen - Fatal编程技术网

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