无法将Rcpp::sugar::Plus_Vector_原语转换为Rcpp::traits::storage_类型
我基本上是想用无法将Rcpp::sugar::Plus_Vector_原语转换为Rcpp::traits::storage_类型,r,rcpp,armadillo,R,Rcpp,Armadillo,我基本上是想用Rcpp把一些R代码翻译成cpp。我在下面的代码中遇到以下错误: error: cannot convert ‘Rcpp::sugar::Plus_Vector_Primitive<14, true, Rcpp::stats::D2<14, true, Rcpp::Vector<14, Rcpp::PreserveStorage> > >’ to ‘Rcpp::traits::storage_type<14>::type {aka d
Rcpp
把一些R
代码翻译成cpp
。我在下面的代码中遇到以下错误:
error: cannot convert ‘Rcpp::sugar::Plus_Vector_Primitive<14, true, Rcpp::stats::D2<14, true, Rcpp::Vector<14, Rcpp::PreserveStorage> > >’ to ‘Rcpp::traits::storage_type<14>::type {aka double}’ in assignment
错误:无法在赋值中将'Rcpp::sugar::Plus_Vector_Primitive'转换为'Rcpp::traits::storage_type::type{aka double}'
这是密码
#include <RcppArmadillo.h>
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export(".loop_exp")]]
void mm_mult(const arma::vec& helpa, const arma::mat& helpb, const arma::vec& helpc,
const Rcpp::NumericVector& t1, const arma::vec& t2, int J, Rcpp::NumericVector& prob)
{
int j;
for (j = 1; J <= J; j++)
{
arma::mat t = (helpb.row(j)).t() * (t2);
double tt = t[0,0];
prob[j] = (helpa[j] + dnorm(t1, tt, helpc[j])); <---- here is the error
}
return;
}
#包括
#包括
使用名称空间Rcpp;
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出(“.loop\u exp”)]]
无效mm_mult(常数arma::vec&helpa,常数arma::mat&helpb,常数arma::vec&helpc,
常量Rcpp::NumericVector&t1,常量arma::vec&t2,int J,Rcpp::NumericVector&prob)
{
int j;
对于(j=1;j原因是,dnorm
“合成糖”有一个签名NumericVector dnorm(NumericVector,double,double)
由于它返回一个数值向量
,您必须自己将其转换为一个双精度
值
一种快速且简单(但不是很健壮)的方法是对返回的向量进行子集,以仅获取其第一个元素。在您的示例中:
prob[j] = (helpa[j] + dnorm(t1, tt, helpc[j])[0]); // Note the "[0]"
否则,代码中还有一些其他潜在问题:您不应该#include
,因为#include
——还有循环结束条件,J。这解决了编译错误,仔细想想,您的意思可能是用eit存储J-th
元素herprob[j]=(helpa[j]+dnorm(t1,tt,helpc[j]);
或prob[j]=(helpa[j]+dnorm(t1[j],tt,helpc[j]);
命名空间中的标量变量提供了一种替代方法:R::dnorm()
——请参见文件Rmath.h
。