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)
你永远不会利用lambda
和prob
是Rcpp::NumericVector
s 的事实,你只是使用他们的double
s,所以这对我来说似乎是最简单的方法。在这些更改之后,您的代码可以在我的机器上正常编译。我没有任何测试用例来确保它们按您的预期运行,但我想它们会的。
【讨论】:
非常感谢,它可以在我的电脑上运行。我通常对使用哪一个感到困惑,numeric vector 还是 arma::vec,这个真的很有帮助!以上是关于rcpp中没有匹配的调用函数的主要内容,如果未能解决你的问题,请参考以下文章