我正在制作一个用于Gibbs采样的Rcpp代码。在代码内部,我首先要制作一个三维数组,其中行号=迭代次数(500),列号=参数数量(4)和切片数量=链数(3)。我是这样写的:
#include <RcppArmadillo.h>
#include <math.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
using namespace std;
using namespace arma;
//Gibbs sampling code starts here
Rcpp::List mcmc(const int iter,const int chains, const NumericVector data){
arma::cube posteriorC = arma::zeros(iter, 5, chains);
\\ rest of the codes
List out(Rcpp::List::create(Rcpp::Named("posteriorC") =posteriorC));
return out;
}
。虽然引人注目但它没有显示任何错误。但是,当我想用以下代码运行代码时:
res<- mcmc(iter=500,chains=2,data)
显示错误:
Error: Cube::operator(): index out of bounds
。我想知道制作3D阵列时是否有任何错误。 请注意,我想估算出我模型的5个参数。
答案 0 :(得分:1)
您需要指定arma::zeros
的模板才能正确填写arma::cube
,c.f。 arma::zeros<template>
生成一个向量,矩阵或多维数据集,其元素设置为零
用法:
vector_type v = zeros<vector_type>( n_elem )
matrix_type X = zeros<matrix_type>( n_rows, n_cols )
matrix_type Y = zeros<matrix_type>( size(X) )
cube_type Q = zeros<cube_type>( n_rows, n_cols, n_slices )
cube_type R = zeros<cube_type>( size(Q) )
因此,在您的情况下,它将是:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
Rcpp::List mcmc(const int iter, const int chains,
const Rcpp::NumericVector data){
arma::cube posteriorC = arma::zeros<arma::cube>(iter, 5, chains);
// --------------------------------- ^^^^^^^^
// Not Shown
Rcpp::List out = Rcpp::List::create(Rcpp::Named("posteriorC") =posteriorC);
return out;
}
最后两个笔记:
arma::cube
切片时,您可能需要增加此值以防止出界。 Rcpp::List out
的方式并不完全正确。通常,创建列表的最佳方法是执行:Rcpp::List out = Rcpp::List::create(Rcpp::Named("Blah"), Blah);