在Rcpp中使用arma :: cube制作3d数组显示多维数据集错误

时间:2017-10-11 12:39:12

标签: arrays r rcpp bayesian

我正在制作一个用于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个参数。

1 个答案:

答案 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;
}

最后两个笔记:

  1. 您明确声明现在的代码将创建 4 列来存储 4 变量。但是,您明确提到需要估算 5 参数。保存到arma::cube切片时,您可能需要增加此值以防止出界。
  2. 创建Rcpp::List out的方式并不完全正确。通常,创建列表的最佳方法是执行:Rcpp::List out = Rcpp::List::create(Rcpp::Named("Blah"), Blah);