gpt4 book ai didi

c++ - rcpp 中没有调用的匹配函数

转载 作者:行者123 更新时间:2023-12-01 14:20:08 25 4
gpt4 key购买 nike

当使用 Rcpp 时,我创建了一个名为 rpois_rcpp 的函数,并尝试在下面的 genDataList 函数中调用它,出现错误并说:“没有匹配函数来调用‘cpprbinom’,候选函数不可行:没有已知的第三个参数从“arma::vec”(又名“Col”)到“Rcpp::NumericVector”(又名“Vector<14>”)的转换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;

}

最佳答案

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

的行的错误

invalid initialization of reference to type 'Rcpp::NumericVector&'

几乎所有东西似乎都在 arma 中,除了 R 绑定(bind)和对 R:: 命名空间的调用,它采用 double 、整数等。看起来最简单的做法(在我看来)就是将 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::NumericVector 的事实,您只需使用 doubles 来自他们,所以这对我来说似乎是最简单的方法。在这些更改之后,您的代码在我的机器上可以正常编译。我没有任何测试用例来确保它们按您预期的方式运行,但我想它们会的。

关于c++ - rcpp 中没有调用的匹配函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62826076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com