1

在 Rcpp 中使用 OptimLib 库时遇到错误。首先我sphere_fn在线复制了函数,以便以后在 optim 函数中使用它。然而,这shere_fn并没有奏效。

Error: can not initialize a member subobject of type `'arma::Col<double>*'with an lvalue of type 'SEXP'(aka'SEXPREC *').` 

似乎问题出在 grad_out,但优化功能需要这种输入形式。

例如,使用以下命令调用 optim 算法:

bool cg(arma::vec& init_out_vals, std::function<double (const arma::vec& vals_inp, arma::vec* grad_out, void* opt_data)> opt_objfn, void* opt_data);  

谁能帮我解决这个问题?

我的代码是:

#include <iostream>
#include <math.h>       /* sqrt */

#define USE_RCPP_ARMADILLO
#include "optim.hpp"

// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;
using namespace std;

// This is a simple example of exporting a C++ function to R. You can
// source this function into an R session using the Rcpp::sourceCpp
// function (or via the Source button on the editor toolbar). Learn
// more about Rcpp at:
//
//   http://www.rcpp.org/
//   http://adv-r.had.co.nz/Rcpp.html
//   http://gallery.rcpp.org/
//


// [[Rcpp::export]]
double sphere_fn(const arma::vec& vals_inp, arma::vec* grad_out, void* opt_data)
{
  double obj_val = arma::dot(vals_inp,vals_inp);
  //
  if (grad_out) {
    *grad_out = 2.0*vals_inp;
  }
  //
  return obj_val;
}
4

1 回答 1

1

好吧,有时您可能需要花时间学习走路,然后才能参加比赛。

换句话说,您不能只是将半任意签名放在那里并期望 Rcpp 属性为您翻译它。void *应该映射到什么?同样适用于 arma::vec*。

只需传递一个 arma::vec,它将在内部使用一个指针。从工作 RcppArmadillo-using 包中研究一些现有的例子,也许看看一些小插曲。

于 2020-07-22T01:50:53.550 回答