rcpp 一个文件中有多个函数且没有匹配的函数

标签 r rcpp armadillo

我正在尝试在 R 中运行下面的函数 weights。下面的函数 mNPsiN 单独工作,我不需要将它们导出到 R 中(即它们的唯一目的是使函数权重看起来更整洁)。

出于某种原因,在函数 weights 中,只有 mN 给出错误“没有匹配的函数调用”。知道为什么吗?

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;

arma::vec mN(double kappa, double ni, arma::vec m, arma::vec C) {
  arma::vec mN; 
  double kappaN;
  kappaN = kappa + ni;
  mN = (kappa/kappaN) * m + (ni/kappaN) * C;
  return mN; 
}
arma::mat PsiN(double ni, double kappa, double kappaN,
               arma::mat y, arma::vec indic, arma::vec C, arma::vec m,
               arma::mat Psi) { 
  double r = indic.n_elem;
  double p = y.n_cols; 
  double n = y.n_rows;
  arma::mat S(p, p); 
  arma::mat PN(p, p); 
  if (r == 1) {
    PN = Psi + kappa*ni/kappaN * ( (C - m ) * (C - m).t() ); 
  } else {
    for (int i = 0; i < n; i++) {
      S += y.row(i).t() * y.row(i);
    }
    PN = Psi + S + kappa*ni/kappaN * ( (C - m ) * (C - m).t() ) ;  
  }
  return PN;
}

// [[Rcpp::export]]

arma::vec weights(int alpha, int v, int kappa, int m,
                  arma::vec nj, arma::mat x, arma::mat Psi, 
               List C, List indic) {
  int p = x.n_cols;
  int n = x.n_rows;
  int kappaN;
  int vN; 
  int crp; 
  arma::vec Q; 
  arma::vec mu;
  arma::mat Sigma;

  for (int i = 0; i < n; i++) {
    kappaN = kappa + nj[i];
    vN     = v + nj[i] - p + 1;
    Sigma  = PsiN(nj[i], kappa, kappaN, x, indic[i], C[i], m, Psi);
    Sigma  = Sigma*(kappaN + 1)/(kappaN*(vN - p + 1));
    mu     = mN(kappa, kappaN, nj[i], m, C[i]); 
    crp    = log(nj[i]) - log(n + alpha - 1);
    Q[i]   = (crp - lgamma((vN + p)/2) - lgamma(vN/2) - p/2*(log(vN) + log(
      datum::pi)) - 1/2*log_det(Sigma) - (vN + p)/2 * (log(1 + 1/v*(x - mu).t()*Sigma.i()*(x-mu)))) ;
  }

 return Q;
}

最佳答案

您的 mN 函数签名是

arma::vec mN(double, double, arma::vec, arma::vec) 

但是你称它为

mu     = mN(kappa, kappaN, nj[i], m, C[i]);

其中kappaintkappaNintnj[i]doublemintCList >SEXPs。

请注意,与 R 不同,您通常不能在 C++ 中随意混合 double 和整数。特别是,我还将指出诸如

之类的声明
double r = indic.n_elem;
double p = y.n_cols; 
double n = y.n_rows;

应全部为intunsigned int

关于rcpp 一个文件中有多个函数且没有匹配的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50078336/

相关文章:

r - 将列表中的所有名称保留到 data.frame

r - 如何修复ggplot中的纵横比?

r - 非线性回归 'abline'

c++ - R(macos 10.8.5),RcppArmadillo : can not find armadillo library or symbol _wrapper_ddot_

c++ - RcppArmadillo:arma::cube 的 vector

c++ - 低 RAM 消耗 C++ 特征求解器

r - 获取列表中等于特定条件的值

c++ - 有没有办法让 Rcpp 停止定义 NDEBUG?

r - 在 Rcpp 中通过调用 `[data.frame` 对 data.frame 进行子集化时避免 SIGSEGV

r - 具有 Armadillo 矩阵概率的矢量化 Rcpp rbinom