使用 RcppNumerical 优化后获取 f_grad 函数中的变量访问权限
Get access to variables in f_grad function after optimization with RcppNumerical
我使用 RcppNumerical 进行优化,我需要在优化完成后在 f_grad
函数中声明一些变量。
为了解释我的问题,让我们以 RcppNumerical 包中的标准示例为例。首先,我们需要创建一个class.
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::depends(RcppNumerical)]]
#include <RcppNumerical.h>
using namespace Numer;
// f = 100 * (x2 - x1^2)^2 + (1 - x1)^2
// True minimum: x1 = x2 = 1
class Rosenbrock: public MFuncGrad
{
public:
double f_grad(Constvec& x, Refvec grad)
{
double t1 = x[1] - x[0] * x[0];
double t2 = 1 - x[0];
grad[0] = -400 * x[0] * t1 - 2 * t2;
grad[1] = 200 * t1;
return 100 * t1 * t1 + t2 * t2;
}
};
然后使用下面的代码进行优化
// [[Rcpp::export]]
Rcpp::List optim_test()
{
Eigen::VectorXd x(2);
x[0] = -1.2;
x[1] = 1;
double fopt;
Rosenbrock f;
int res = optim_lbfgs(f, x, fopt);
return Rcpp::List::create(
Rcpp::Named("xopt") = x,
Rcpp::Named("fopt") = fopt,
Rcpp::Named("status") = res
);
}
如何在优化完成后访问 t1
或 t2
值。我想为优化解决方案指的是这些变量的值。
我的例子可能不太适合我正在寻找的东西,因为在这个例子的优化之外很容易计算 t1
或 t2
。就我而言,我需要一些计算繁琐的变量。因此,如果在优化期间已经计算了它们,为什么不在优化后 return 它们(或访问它们的值)而不必在优化之外再次计算它们?
您可以对感兴趣的变量使用成员变量。为简单起见,我在这里使用 public
成员:
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::depends(RcppNumerical)]]
#include <RcppNumerical.h>
using namespace Numer;
// f = 100 * (x2 - x1^2)^2 + (1 - x1)^2
// True minimum: x1 = x2 = 1
class Rosenbrock: public MFuncGrad
{
public:
double t1;
double t2;
double f_grad(Constvec& x, Refvec grad)
{
t1 = x[1] - x[0] * x[0];
t2 = 1 - x[0];
grad[0] = -400 * x[0] * t1 - 2 * t2;
grad[1] = 200 * t1;
return 100 * t1 * t1 + t2 * t2;
}
};
// [[Rcpp::export]]
Rcpp::List optim_test()
{
Eigen::VectorXd x(2);
x[0] = -1.2;
x[1] = 1;
double fopt;
Rosenbrock f;
int res = optim_lbfgs(f, x, fopt);
return Rcpp::List::create(
Rcpp::Named("xopt") = x,
Rcpp::Named("fopt") = fopt,
Rcpp::Named("status") = res,
Rcpp::Named("t1") = f.t1,
Rcpp::Named("t2") = f.t2
);
}
/*** R
optim_test()
*/
结果:
> optim_test()
$xopt
[1] 1 1
$fopt
[1] 3.12499e-15
$status
[1] 0
$t1
[1] -2.849634e-09
$t2
[1] -4.809313e-08
我使用 RcppNumerical 进行优化,我需要在优化完成后在 f_grad
函数中声明一些变量。
为了解释我的问题,让我们以 RcppNumerical 包中的标准示例为例。首先,我们需要创建一个class.
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::depends(RcppNumerical)]]
#include <RcppNumerical.h>
using namespace Numer;
// f = 100 * (x2 - x1^2)^2 + (1 - x1)^2
// True minimum: x1 = x2 = 1
class Rosenbrock: public MFuncGrad
{
public:
double f_grad(Constvec& x, Refvec grad)
{
double t1 = x[1] - x[0] * x[0];
double t2 = 1 - x[0];
grad[0] = -400 * x[0] * t1 - 2 * t2;
grad[1] = 200 * t1;
return 100 * t1 * t1 + t2 * t2;
}
};
然后使用下面的代码进行优化
// [[Rcpp::export]]
Rcpp::List optim_test()
{
Eigen::VectorXd x(2);
x[0] = -1.2;
x[1] = 1;
double fopt;
Rosenbrock f;
int res = optim_lbfgs(f, x, fopt);
return Rcpp::List::create(
Rcpp::Named("xopt") = x,
Rcpp::Named("fopt") = fopt,
Rcpp::Named("status") = res
);
}
如何在优化完成后访问 t1
或 t2
值。我想为优化解决方案指的是这些变量的值。
我的例子可能不太适合我正在寻找的东西,因为在这个例子的优化之外很容易计算 t1
或 t2
。就我而言,我需要一些计算繁琐的变量。因此,如果在优化期间已经计算了它们,为什么不在优化后 return 它们(或访问它们的值)而不必在优化之外再次计算它们?
您可以对感兴趣的变量使用成员变量。为简单起见,我在这里使用 public
成员:
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::depends(RcppNumerical)]]
#include <RcppNumerical.h>
using namespace Numer;
// f = 100 * (x2 - x1^2)^2 + (1 - x1)^2
// True minimum: x1 = x2 = 1
class Rosenbrock: public MFuncGrad
{
public:
double t1;
double t2;
double f_grad(Constvec& x, Refvec grad)
{
t1 = x[1] - x[0] * x[0];
t2 = 1 - x[0];
grad[0] = -400 * x[0] * t1 - 2 * t2;
grad[1] = 200 * t1;
return 100 * t1 * t1 + t2 * t2;
}
};
// [[Rcpp::export]]
Rcpp::List optim_test()
{
Eigen::VectorXd x(2);
x[0] = -1.2;
x[1] = 1;
double fopt;
Rosenbrock f;
int res = optim_lbfgs(f, x, fopt);
return Rcpp::List::create(
Rcpp::Named("xopt") = x,
Rcpp::Named("fopt") = fopt,
Rcpp::Named("status") = res,
Rcpp::Named("t1") = f.t1,
Rcpp::Named("t2") = f.t2
);
}
/*** R
optim_test()
*/
结果:
> optim_test()
$xopt
[1] 1 1
$fopt
[1] 3.12499e-15
$status
[1] 0
$t1
[1] -2.849634e-09
$t2
[1] -4.809313e-08