当前位置: 首页 > 知识库问答 >
问题:

当不存储中间结果时,Eigen给出错误的结果

章睿
2023-03-14

为牛顿方法编写实现雅可比矩阵的函数时,我注意到了一个非常严重的错误。

调用函数

auto DF = [T](VectorXd y){
    return 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).second - MatrixXd::Identity(2,2);
    return mat;
 };

一切工作无缝。

我试图重现它,这不是完全相同的行为,但它也没有表现为想要的:

考虑下面的代码:

MatrixXd FF(MatrixXd y){
  return y;
}

int other(){

  auto DF = [](MatrixXd y){
    MatrixXd test = FF(y)  - MatrixXd::Identity(2,2);
    return test;
  };

  std::cout << DF(MatrixXd::Ones(2,2)) <<std::endl;
  std::cout << std::endl;
  std::cout << (MatrixXd::Ones(2,2) - MatrixXd::Identity(2,2))<< std::endl;

}

它会打印出来

>  1 0
>  0 1 
>
>  1 0 
>  0 1 

到控制台。

但是,如果我更改为函数DF

  auto DF = [](MatrixXd y){
    return FF(y)  - MatrixXd::Identity(2,2);
  };

控制台会打印

>  2.22045e-15 1.63042e-322
>  2.37152e-322    -0.999998

对于第二个矩阵。(这只是内存中一些未初始化的垃圾)。

有人能解释一下我的代码和示例问题发生了什么吗?我真的不知道这里发生了什么。我特别感兴趣的是,为什么将计算结果保存在临时变量中可以修复这个问题。

共有1个答案

谷梁镜
2023-03-14

因为评论几乎解决了我的问题(非常感谢),我想我应该继续回答我的问题,这样其他人就可以看到这个问题已经解决了。

问题在于,例如,两个矩阵的本征乘法的结果类型不是本征矩阵,而是表示乘法并引用我们试图乘法的两个矩阵的某个内部对象。

因此,如果我们使用auto关键字,编译器很可能不会给出我们正在设置的变量类型MatrixXd,而是一些内部对象的类型。

有关更多信息,请参阅Eigen留档,其中明确指出:

简言之:不要使用自动关键字与本征的表达式,除非你是100%确定你在做什么。特别是,不要使用auto关键字替换矩阵

  • 不要使用auto关键字,使用显式类型。
  • 对于lambda函数总是指定返回类型:写自动DF = []() -

 类似资料:
  • 问题内容: 根据Wolfram Mathematica: cos(50) = 0.6427876096865394 ; 但是这段Java代码: 给出 0.9649660284921133 。 有什么问题吗? 问题答案: 期望参数以弧度为单位。这将返回您需要的结果:

  • 当两个向量求和时,我使用auto和

  • 我在两个特征类中有两个几何,一个名为“HY90299”,另一个名为“hyboxsdo”,这两个几何不相交。 但是当我在oralce中运行空间查询时, “从 HY90299 t,hyboxsdo g 中选择sdo_relate(t.shape,g.shape ,'mask=ANYINTERACT') ” , 我的预言机版本是11g 追加

  • 问题内容: 这是一个有关使用haversine公式计算地球上两个纬度和经度之间的距离的问题,用于需要“查找我最近的”功能的项目中。 haversine公式很好地讨论并在MySQL解决了这个帖子。 然后,我问了一个有关将其转换为存储函数的问题,这样它就可以在以后的项目中使用,而不必查找,记住或重新键入长格式的公式。 都很好。除了我的函数的结果(略有不同)以外,其他条件相同时,直接在查询中直接键入公式

  • 我在程序中声明了两个Eigen::RowVectorXd变量,如下所示。我在复合加法语句中得到了错误的结果。仅添加前两个元素,向量中的其余元素变为1e19。我不知道为什么会这样。请帮忙。

  • 我试图使用谷歌的ceres求解器(http://ceres-solver.org/)来计算非线性最小二乘三边测量(目标是使用BLE信标进行室内定位)。我的问题是,CERES给出的结果有一个显著的错误,比较另一个解决方案,也使用Levenberg-Marquott算法,很明显,我的ceres设置有问题。 我的出发点是:https://nrr.mit.edu/sites/default/files/d