使用 CoDiPack 自动区分

Automatic Differentiation with CoDiPack

以下代码:

#include <codi.hpp>
...
codi::RealForward Gcodi[l];
for (int p = 0; p < l; p++) 
{
     ...
     double a = Gcodi[p];
}

给我编译错误:

nnBFAD.cpp: 在函数‘void OptBF()’中:

nnBFAD.cpp:156:25: 错误:无法在初始化 double

中将‘codi::RealForward {aka codi::ActiveReal >}’转换为‘double’
a = Gcodi[p];

提示?

根据官方文档hereRealForward 是一种重载了赋值运算符的类型,因此您可以使用 double..

对其进行赋值

喜欢

codi::RealForward a = 3.0;

反方向当然没有定义,

这就是为什么你不能直接将 codi::RealForward 转换为双精度的原因:

double a = Gcodi[p];

但是你可以调用上面的函数,即

double a = Gcodi[p].getGradient();

更新:

然后你可以像这样给一个 RealForward 对象分配一个 double

double myDouble{3.3};
RealForward a = myDouble;

但直接从 REalForwad 分配双精度数是不合法的:

RealForward a = ...;
double myDouble = a; //not valid!

其他例子

RealForward b = a * a; //this is ok because a * a is a double

我找到了一个函数:getValue()

double a = Gcodi[p].getValue();

如中所述:https://www.scicomp.uni-kl.de/codi/d5/dbb/Tutorial1.html