Rcpp 文件中的多个函数且没有匹配函数
Rcpp multiple functions in a file and no matching function
我正在尝试 运行 R 中下面的函数 weights
。下面的函数 mN
和 PsiN
单独工作,我不需要将它们导出到R(即它们的唯一目的是使函数权重看起来更整洁)。
出于某种原因,只有 mN
在函数 weights
中给出了错误 "no matching function call"。知道为什么吗?
#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;
}
定义中的函数签名:
arma::vec mN(double kappa, double ni, arma::vec m, arma::vec C)
与其用法不符:
mu = mN(kappa, kappaN, nj[i], m, C[i]);
您必须决定函数是否需要 4 个或 5 个参数。
您 mN
的函数签名是
arma::vec mN(double, double, arma::vec, arma::vec)
但你称它为
mu = mN(kappa, kappaN, nj[i], m, C[i]);
其中 kappa
是 int
,kappaN
是 int
,nj[i]
是 double
,m
是 int
和 C
是 List
的 SEXP
s.
请注意,与 R 不同,您通常不能在 C++ 中将双精度数和整数与放弃混合使用。特别是,我还要指出像
这样的声明
double r = indic.n_elem;
double p = y.n_cols;
double n = y.n_rows;
应该都是int
s或者unsigned int
s.
我正在尝试 运行 R 中下面的函数 weights
。下面的函数 mN
和 PsiN
单独工作,我不需要将它们导出到R(即它们的唯一目的是使函数权重看起来更整洁)。
出于某种原因,只有 mN
在函数 weights
中给出了错误 "no matching function call"。知道为什么吗?
#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;
}
定义中的函数签名:
arma::vec mN(double kappa, double ni, arma::vec m, arma::vec C)
与其用法不符:
mu = mN(kappa, kappaN, nj[i], m, C[i]);
您必须决定函数是否需要 4 个或 5 个参数。
您 mN
的函数签名是
arma::vec mN(double, double, arma::vec, arma::vec)
但你称它为
mu = mN(kappa, kappaN, nj[i], m, C[i]);
其中 kappa
是 int
,kappaN
是 int
,nj[i]
是 double
,m
是 int
和 C
是 List
的 SEXP
s.
请注意,与 R 不同,您通常不能在 C++ 中将双精度数和整数与放弃混合使用。特别是,我还要指出像
这样的声明double r = indic.n_elem;
double p = y.n_cols;
double n = y.n_rows;
应该都是int
s或者unsigned int
s.