gpt4 book ai didi

c++ - 当不存储中间结果时,特征给出错误的结果

转载 作者:行者123 更新时间:2023-12-02 18:05:26 25 4
gpt4 key购买 nike

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

调用函数

auto DF = [T](VectorXd y){
return PhiAndW(y(0),y(1),T).second - MatrixXd::Identity(2,2);
};

仅返回PhiAndW(y(0),y(1),T).second的值并省略 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

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

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

最佳答案

由于评论基本上解决了我的问题(非常感谢),我想我应该继续回答我的问题,以便其他人看到这个问题已经解决了。

为什么会出现这个问题?

问题是,例如两个矩阵的特征乘法的结果类型不是特征矩阵,而是一些表示乘法并引用我们尝试相乘的两个矩阵的内部对象。

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

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

In short: do not use the auto keywords with Eigen's expressions, unless you are 100% sure about what you are doing. In particular, do not use the auto keyword as a replacement for a Matrix<> type

如何防止这种情况发生?

  • 不要使用 auto 关键字,使用显式类型。
  • 对于 lambda 函数,请始终指定返回类型:编写 auto DF = []() -> MatrixXd {...} 而不是 auto DF = []() {。 ..}

关于c++ - 当不存储中间结果时,特征给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59586537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com