使用 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];
提示?
根据官方文档here,
RealForward
是一种重载了赋值运算符的类型,因此您可以使用 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
以下代码:
#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];
提示?
根据官方文档here,
RealForward
是一种重载了赋值运算符的类型,因此您可以使用 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