【发布时间】:2020-01-03 23:27:50
【问题描述】:
为牛顿方法编写一个实现雅可比矩阵的函数我注意到一个非常严重的错误。
调用函数
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的部分:eigen.tuxfamily.org/dox-devel/TopicPitfalls.html -
(在这种情况下,
auto隐含地是 lambda 的返回类型) -
你试过
auto DF = []() -> MatrixXd {...}吗?这应该强制评估返回值。 -
这是另一个很好的例子,
auto可能不像其他人(除了我)似乎相信的那样酷。 ;-) 我假设显式转换也可以修复第一个样本:auto DF = [](MatrixXd y){ return MatrixXd(FF(y) - MatrixXd::Identity(2,2)); }; -
@Scheff You're not the only one.