[英]Rcpp R sample equivalent from a NumericVector
我已经创建了一个NumericVector,我需要从中采样一个随机的Integer。 我尝试使用各种RcppArmarillo函数,但对我而言无效。 该功能如下:
//#include <algorithm>
#include <RcppArmadilloExtensions/sample.h>
using namespace Rcpp;
using namespace arma;
using namespace std;
int simulateNextStepC(double currentAmount, double lastPaid, int currentStatus, int currentMaturity, NumericMatrix amountLinkMatrix, NumericMatrix statusMatrix, double percentile4Capping=1, bool verbose=false)
{
int nrow = amountLinkMatrix.nrow(), outsize;
bool check;
LogicalVector positionsToSample(nrow);
for(int i=0;i< nrow;i++) {
check=false;
check=((statusMatrix(i,currentMaturity)==currentStatus)&&(is_finite(statusMatrix(i,currentMaturity+1))));
positionsToSample[i]=check;
}
outsize=sum(positionsToSample);
IntegerVector historicalStatus(max(outsize,1));
int out;
if(outsize==0)
out=currentStatus;
else {
for(int i=0, j=0; i<nrow; i++) {
if(positionsToSample[i]){
historicalStatus[j]=statusMatrix(i,currentMaturity+1);
j++;
}
}
out=RcppArmadillo::sample(historicalStatus,1); // SAMPLING HERE
};
返回 }
您的函数存在一些问题,导致不同的错误。
// [[Rcpp::depends(RcppArmadillo)]]
,通常将其放置在#include
语句之后。 没有这个,您将得到一个编译错误- fatal error: RcppArmadilloExtensions/sample.h: No such file or directory
RcppArmadillo::sample(...)
可能会或可能不会导致您出错。 在此Rcpp Gallery帖子中 ,作者大概使用RcppArmadillo::sample
可能没有问题。 但是,我收到以下错误消息: error: reference to 'RcppArmadillo' is ambiguous out=RcppArmadillo::sample(historicalStatus,1);
。 我通过使用Rcpp::RcppArmadillo:sample
来解决此问题; 考虑到using namespace Rcpp;
进行声明,这对我来说似乎很奇怪using namespace Rcpp;
到位。 sample
,我认为您不能仅使用两个参数来调用RcppArmadillo::sample
这样做会导致此错误: error: no matching function for call to 'sample(Rcpp::IntegerVector&, int)'
。 通过为替换参数提供布尔值可以解决此问题: Rcpp::RcppArmadillo::sample(historicalStatus,1,false)
error: invalid user-defined conversion from 'Rcpp::Vector<13, Rcpp::PreserveStorage>' to 'int'
。 通过添加Rcpp::as
轻松解决,即out=as<int>(Rcpp::RcppArmadillo::sample(historicalStatus,1,false));
// [[Rcpp::export]]
。 我注意到您中的三个参数尚未使用lastPaid
, percentile4Capping
和verbose
-我假设您还没有机会在函数体中实现它们。 我无法在实际数据上对此进行测试,因为您没有在问题中提供任何信息,但是在进行了上述更改之后,为我编译了此代码:
#include <RcppArmadilloExtensions/sample.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace arma;
using namespace std;
// [[Rcpp::export]]
int simulateNextStepC(double currentAmount, double lastPaid,
int currentStatus, int currentMaturity,
NumericMatrix amountLinkMatrix,
NumericMatrix statusMatrix,
double percentile4Capping=1,
bool verbose=false)
{
int nrow = amountLinkMatrix.nrow(), outsize;
bool check;
LogicalVector positionsToSample(nrow);
for(int i=0; i<nrow; i++) {
check = false;
check = ((statusMatrix(i,currentMaturity)==currentStatus) &&
(is_finite(statusMatrix(i,currentMaturity+1))));
positionsToSample[i] = check;
}
outsize = sum(positionsToSample);
IntegerVector historicalStatus(max(outsize,1));
int out;
if( outsize==0 ) {
out=currentStatus;
} else {
for(int i=0, j=0; i<nrow; i++) {
if( positionsToSample[i] ) {
historicalStatus[j]=statusMatrix(i,currentMaturity+1);
j++;
}
}
out=as<int>(Rcpp::RcppArmadillo::sample(historicalStatus,1,false));
}
return out;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.