通过以下简化代码,我希望从N(0,1)分布进行仿真,并返回一个列表,其中包含仿真值以及取决于仿真法线的向量(请参见下面的代码)。问题在于if-else语句根本不起作用!请,有人可以帮助我了解问题出在哪里吗?
#include <RcppArmadillo.h>
#include <Rcpp.h>
using namespace Rcpp;
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::export]]
List cond(arma::vec epsilon, IntegerVector Nsim) {
int iNsim = Nsim[0];
arma::vec ans(1);
arma::vec epsil(epsilon);
arma::vec vans = arma::zeros(iNsim);
arma::vec vcond = arma::zeros(iNsim);
LogicalVector cond;
RNGScope scope;
for (int i=0; i<iNsim; i++) {
ans = Rcpp::rnorm(1, 0.0, 1.0);
vans.row(i) = ans[0];
cond = abs(ans) >= epsil;
if (cond) {
vcond.row(i) = 10;
} else {
vcond.row(i) = -10;
}
}
return List::create(
_["sim"] = vans,
_["cond"] = vcond);
}
我通过将其保存到file.cpp然后通过sourceCpp(“ file.cpp”)在R中运行它。
原始代码对于在哪里使用向量以及在哪里使用标量感到困惑。
他是更短和修复的版本:
#include <Rcpp.h>
using namespace Rcpp;
//[[Rcpp::export]]
DataFrame cond(double epsil, int iNsim) {
double ans;
NumericVector vans(iNsim);
NumericVector vcond(iNsim);
RNGScope scope;
for (int i=0; i<iNsim; i++) {
ans = R::rnorm(0.0, 1.0);
vans[i] = ans;
if (fabs(ans) >= epsil) {
vcond[i] = 10;
} else {
vcond[i] = -10;
}
}
return DataFrame::create(_["sim"] = vans,
_["cond"] = vcond);
}
除了使用(并通过)其中标量的意思是使用标量,它也校正abs()
到fabs()
-一个共同的C / C ++问题。我还恢复了Rcpp向量-尽管我喜欢使用Armadillo,但这里并不需要它。
这是给定随机种子的示例输出:
R> sourceCpp("/tmp/erlis.cpp")
R> set.seed(1)
R> cond(1.0, 6)
sim cond
1 -0.626454 -10
2 0.183643 -10
3 -0.835629 -10
4 1.595281 10
5 0.329508 -10
6 -0.820468 -10
R>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句