我正在尝试使用 stan 数学库进行反向自动微分,我从这个链接得到了例子
// [[Rcpp::export]]
auto g(Eigen::VectorXd x, Eigen::VectorXd a) { // gradient by AD using Stan
double fx;
Eigen::VectorXd grad_fx;
using stan::math::dot_self;
stan::math::gradient([&a](auto x) { return dot_self( (x - a).eval() ); },
x, fx, grad_fx);
return grad_fx;
}
上述函数成功计算了函数 f(x)=||xa||^{2} 的梯度。
相反,是否可以计算矩阵值参数的标量函数的梯度?例如 f(x) = trace( x * transpose(x) ) 其中 x 是一个矩阵?我尝试了以下但它给出了错误
// [[Rcpp::export]]
auto g(Eigen::MatrixXd x) { // gradient by AD using Stan
double fx;
Eigen::MatrixXd grad_fx;
stan::math::gradient([](auto x) { return (x *x.transpose()).trace() ; }, x, fx, grad_fx);
return grad_fx;
}