rcpp中没有匹配的调用函数

Posted

技术标签:

【中文标题】rcpp中没有匹配的调用函数【英文标题】:no matching function for call in rcpp 【发布时间】:2020-07-10 01:33:54 【问题描述】:

使用 Rcpp 时,我创建了一个名为 rpois_rcpp 的函数,并尝试在下面的 genDataList 函数中调用它,出现错误并说: “调用‘cpprbinom’没有匹配的函数, 候选函数不可行:第三个参数没有从 'arma::vec'(又名 'Col')到 'Rcpp::NumericVector'(又名'Vector')的已知转换 arma::vec cpprbinom(int n, double size, NumericVector prob).

谁能帮帮我,谢谢!

这是我的代码:

//create a random matrix X with covariance matrix sigma
// [[Rcpp::export]]
arma::mat mvrnormArma(const int n, arma::vec mu, const int p, const 
double rho) 

  arma::mat sigma(p, p, arma::fill::zeros);

  for (int i = 0; i < sigma.n_rows; ++i) 
    for (int j = 0; j < sigma.n_cols; ++j) 
      sigma(i,j) = pow(rho, abs((i + 1) - (j + 1)));
    
  

  int ncols = sigma.n_cols;
  arma::mat Y = arma::randn(n, ncols);


  return arma::repmat(mu, 1, n).t() + Y * arma::chol(sigma);


//create a vector sampled from poisson distribution with mean vector 
//lambda
// [[Rcpp::export]]
arma::vec rpois_rcpp( NumericVector &lambda) 
  int n= lambda.length();
  unsigned int lambda_i = 0;
  IntegerVector sim(n);
  for (unsigned int i = 0; i < n; i++) 
    sim[i] = R::rpois(lambda[lambda_i]);
    // update lambda_i to match next realized value with correct mean
    lambda_i++;

  
  return  as<arma::vec>(sim);


//create a vector sampled from binomial distribution with probability 
vector prob
// [[Rcpp::export]]
arma::vec cpprbinom(int n, double size, NumericVector prob)  
  NumericVector v = no_init(n);
  std::transform( prob.begin(), prob.end(), v.begin(), [=](double p) 
      return R::rbinom(size, p); ); 
  return as<arma::vec>(v);




// [[Rcpp::export]]44
List genDataList(int n, arma::vec& mu, int p, double rho,
             arma::vec& beta, const double SNR, const std::string & 
  Test_case) 

  arma::mat U, V, data, normData, Projection;
  arma::vec s, y, means, noise;

  data = mvrnormArma(n, mu, p, rho);
  normData = arma::normalise(data,2,0);
  arma::svd_econ(U,s,V,normData,"right");
  Projection = V * trans(V);
  beta = Projection * beta;


  if(Test_case == "gaussian")
  
    means=normData * beta;
    y = means + arma::randn(n) * sqrt(arma::var(means) / SNR);
  else if (Test_case == "poisson")
  
    means=exp(normData * beta);
    y = rpois_rcpp(means);
  else
  
    means=exp(normData * beta)/(1 + exp(normData * beta));
    y = cpprbinom(n,1,means);




  List ret;
  ret["data"] = data;
  ret["normData"] = normData;
  ret["V"] = V;
  ret["beta"] = beta;
  ret["y"] = y;
  return ret;

  

【问题讨论】:

在 *** 上,代码必须是文本并且在问题中。 正如@drescherjm 建议的那样,如果您edit您的问题将您的代码作为文本复制并粘贴到您的问题本身(我们不能很好地复制和粘贴您的代码),这将有助于我们帮助您从图像中可以自己检查出来) 欢迎来到 ***!看看标签[rcpp] 的现有问题——你的问题目前还没有我们可以添加很多的形式。 mcve 会有很大帮助。 @duckmayr @Dirk Eddelbuettel @drescherjm 非常感谢我刚刚解决了这个问题 你好 Mohan,欢迎来到 ***,只是一个问题,你如何应用你的函数?你能分享一个示例数据集和你在 R 中的函数吗? 【参考方案1】:

感谢您添加代码。当我尝试编译时,我得到了和你一样的错误,但是调用rpois_rcpp()的行出错了

对类型 'Rcpp::NumericVector&' 的引用初始化无效

几乎所有东西似乎都在arma 中,除了R 绑定和对R:: 命名空间的调用,它需要双精度、整数等。这似乎是最简单的事情(在我看来),只是取 arma::vec 作为参数:

arma::vec rpois_rcpp( arma::vec &lambda) 
    int n= lambda.n_elem;

    arma::vec cpprbinom(int n, double size, arma::vec prob)  

你永远不会利用lambdaprobRcpp::NumericVectors 的事实,你只是使用他们的doubles,所以这对我来说似乎是最简单的方法。在这些更改之后,您的代码可以在我的机器上正常编译。我没有任何测试用例来确保它们按您的预期运行,但我想它们会的。

【讨论】:

非常感谢,它可以在我的电脑上运行。我通常对使用哪一个感到困惑,numeric vector 还是 arma::vec,这个真的很有帮助!

以上是关于rcpp中没有匹配的调用函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在Rstudio中调用Rcpp向量的对数函数

如何从 Rcpp 中的另一个函数调用一个函数?

调用“距离(int&,int&)”没有匹配的功能

将 C++ 函数用作由导出的 Rcpp 函数调用的另一个 C++ 函数的参数

RCPP Armadillo:在函数中打印整数值

构造函数中的“没有匹配的函数调用”