为什么我在使用“时会出现错误?”;pnorm";在Rcpp中

为什么我在使用“时会出现错误?”;pnorm";在Rcpp中,r,rcpp,armadillo,R,Rcpp,Armadillo,我需要在我的Rcpp代码中包含来自arma::的变量。但是我在尝试使用sugar函数pnorm时遇到了一个问题。下面是一个演示: #include <RcppArmadillo.h> #include <RcppArmadilloExtensions/sample.h> // [[Rcpp::depends(RcppArmadillo)]] using namespace Rcpp; // [[Rcpp::export]] double pget(NumericVect

我需要在我的Rcpp代码中包含来自
arma::
的变量。但是我在尝试使用sugar函数
pnorm
时遇到了一个问题。下面是一个演示:

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

// [[Rcpp::export]]
double pget(NumericVector x, NumericVector beta) {
  arma::colvec xx = Rcpp::as<arma::colvec>(x) ;
  arma::colvec bb = Rcpp::as<arma::colvec>(beta) ;
  double tt = as_scalar( arma::trans(xx) * bb);
  double temp = Rcpp::pnorm(tt);
  return temp;
}
#包括
#包括
//[[Rcpp::depends(RcppArmadillo)]]
使用名称空间Rcpp;
//[[Rcpp::导出]]
双pget(数值向量x,数值向量β){
arma::colvec xx=Rcpp::as(x);
arma::colvec bb=Rcpp::as(β);
双tt=as_标量(arma::trans(xx)*bb);
双温=Rcpp::pnorm(tt);
返回温度;
}
然后我得到一个错误:
调用'pnorm5'时没有匹配的函数。


这是否意味着我不能使用
Rcpp::pnorm

糖函数用于向量类型的参数,如
Rcpp::NumericVector
。对于标量参数,可以使用
R
命名空间中的函数:

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

// [[Rcpp::export]]
double pget(NumericVector x, NumericVector beta) {
  arma::colvec xx = Rcpp::as<arma::colvec>(x) ;
  arma::colvec bb = Rcpp::as<arma::colvec>(beta) ;
  double tt = as_scalar( arma::trans(xx) * bb);
  double temp = R::pnorm(tt, 0.0, 1.0, 1, 0);
  return temp;
}

/*** R
x <- rnorm(5)
beta <- rnorm(5)
pget(x, beta)
*/
第二种变体不借助犰狳计算标量积:

// [[Rcpp::export]]
double pget3(NumericVector x, NumericVector beta) {
  double tt = Rcpp::sum(x * beta);
  return R::pnorm(tt, 0.0, 1.0, 1, 0);
}

与Rcpp的@RalfStubner相比,我算不上什么专家,所以我不得不(在和的帮助下)四处转转以获得以下代码。我没有在标量上使用R名称空间版本,而是将其转换回
NumericVector
。。。几乎可以肯定的是,如果有人真的知道他们在做什么,他们可以更高效地完成/跳过几个步骤。。。e、 g.arma到数值向量的转换可能直接完成,而无需像标量那样通过

#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
#include <Rcpp.h>

// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;

// [[Rcpp::export]]
NumericVector pget(NumericVector x, NumericVector beta) {
  colvec xx = as<colvec>(x) ;
  colvec bb = as<colvec>(beta) ;
  double tt = as_scalar(trans(xx) * bb);
  NumericVector tt2 = NumericVector::create( tt );
  NumericVector temp = Rcpp::pnorm(tt2);
  return temp;
}
#包括
#包括
#包括
//[[Rcpp::depends(RcppArmadillo)]]
使用名称空间Rcpp;
使用arma;
//[[Rcpp::导出]]
数值向量pget(数值向量x,数值向量β){
colvec xx=as(x);
colvec bb=as(β);
双tt=as_标量(trans(xx)*bb);
NumericVector tt2=NumericVector::create(tt);
数值向量temp=Rcpp::pnorm(tt2);
返回温度;
}

谢谢!如果我做矢量化,
Rcpp::pnorm
会比
R::pnorm
快吗?关于OP的问题,回答得很好(+1),但在你发布的代码中有一点注意:你的参数顺序有点混乱。你想要的是
R::pnorm(tt,0.0,1.0,1,0)
而不是
R::pnorm(tt,1.0,0.0,1,0)
(平均值在sd之前)。@lostintheforest对这两个函数进行基准测试怎么样?
作为标量(arma::trans(xx)*bb
是否相当于更短的
点(xx,bb
?()@mtall的确,谢谢你的提醒。我已经更新了我的答案。这几乎肯定是重复了好几次,但我现在没有时间去挖掘。从
arma
NumericVector
的转换可以在不经过
as_scalar()
的情况下完成,就像这样:
NumericVector tt=as(wrap(arma::trans(xx)*bb)),但我还没有测试它是否有效
#include <RcppArmadillo.h>
#include <RcppArmadilloExtensions/sample.h>
#include <Rcpp.h>

// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;

// [[Rcpp::export]]
NumericVector pget(NumericVector x, NumericVector beta) {
  colvec xx = as<colvec>(x) ;
  colvec bb = as<colvec>(beta) ;
  double tt = as_scalar(trans(xx) * bb);
  NumericVector tt2 = NumericVector::create( tt );
  NumericVector temp = Rcpp::pnorm(tt2);
  return temp;
}