为牛顿方法编写实现雅可比矩阵的函数时,我注意到了一个非常严重的错误。
调用函数
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
对于第二个矩阵。(这只是内存中一些未初始化的垃圾)。
有人能解释一下我的代码和示例问题发生了什么吗?我真的不知道这里发生了什么。我特别感兴趣的是,为什么将计算结果保存在临时变量中可以修复这个问题。
因为评论几乎解决了我的问题(非常感谢),我想我应该继续回答我的问题,这样其他人就可以看到这个问题已经解决了。
问题在于,例如,两个矩阵的本征乘法的结果类型不是本征矩阵,而是表示乘法并引用我们试图乘法的两个矩阵的某个内部对象。
因此,如果我们使用auto
关键字,编译器很可能不会给出我们正在设置的变量类型MatrixXd
,而是一些内部对象的类型。
有关更多信息,请参阅Eigen留档,其中明确指出:
简言之:不要使用自动关键字与本征的表达式,除非你是100%确定你在做什么。特别是,不要使用auto关键字替换矩阵
auto
关键字,使用显式类型。自动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