Arrays 在Rcpp中使用arma::cube制作3d数组显示立方体错误

Arrays 在Rcpp中使用arma::cube制作3d数组显示立方体错误,arrays,r,rcpp,bayesian,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 s

我正在为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;
}

。我想知道制作3D阵列时是否有任何错误请注意,我希望获得模型的5个参数的估计值。

您需要指定
arma::zeros
的模板,以正确填充
arma::cube
,c.f

生成元素设置为零的向量、矩阵或立方体

用法:

  • v型向量=零(n元素)
  • X型矩阵=零(n行,n列)
  • Y型矩阵=零(大小(X))
  • cube\u type Q=0(n行、n列、n片)
  • cube\u type R=0(大小(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;
}
#包括
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出]]
Rcpp::列出mcmc(常数整数,常数整数链,
常量Rcpp::数值向量数据){
arma::立方体后验概率=arma::零(iter,5,链);
// --------------------------------- ^^^^^^^^
//未显示
Rcpp::List out=Rcpp::List::create(Rcpp::Named(“posteriorC”)=posteriorC);
返回;
}
最后两项说明:

  • 您明确声明现在的代码将创建4列来存储4个变量。但是,您明确提到需要估计5个参数。在保存到
    arma::cube
    切片时,可能需要增加该值以防止越界
  • 创建
    Rcpp::List out
    的方式不太正确。通常,创建列表的最佳方法是:
    Rcpp::list out=Rcpp::list::create(Rcpp::Named(“Blah”),Blah)

  • @不穿上衣,非常感谢。但这对我不起作用(.在编写或编译时没有显示任何错误。我可以同时使用arma::cube和Rcpp::NumericVector吗?或者我一直只需要使用arma???@gultu我对MCMC例程中发生的事情没有任何线索,因为您忽略了它。我无法诊断为什么它对您不起作用,因为我所拥有的信息非常稀少,并且与您的MCMC例程直接相关<代码> ARMA::Cube :“无代码,主代码很长,很复杂。我要把它放在这里吗?”Gultuu在这种情况下只需切换<代码> RCPP::MigultValue/Cube >到<代码> ARMA::Cube 。假设你正在将一个3D R数组传递给C++。@ CouTabess,我不明白。我可以向你展示我的完整代码吗?我不知道怎么做。
    Error: Cube::operator(): index out of bounds
    
    #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;
    }