2017-10-11 3 views
1

Ich mache einen Rcpp-Code für Gibbs Sampling. Innerhalb des Codes möchte ich zuerst ein 3-dimensionales Array mit Zeilennummer = Anzahl der Iterationen (500), Spaltenanzahl = Anzahl der Parameter (4) und Schichtnummer = Anzahl der Ketten (3) erstellen. Ich schrieb es auf diese Weise:macht 3D-Array mit Arma :: Cube in Rcpp zeigt Cube-Fehler

#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; 
} 

. Während es zwingt, zeigt es keinen Fehler. Aber wenn ich mit dem Code ausführen mag:

res<- mcmc(iter=500,chains=2,data) 

es zeigt den Fehler:

Error: Cube::operator(): index out of bounds 

. Ich möchte wissen, ob beim 3D-Array ein Fehler vorliegt. Bitte beachten Sie, dass ich Schätzungen von 5 Parametern meines Modells erhalten möchte.

Antwort

0

Sie müssen die Vorlage für arma::zeros angeben richtig ein arma::cube, vgl zu füllen arma::zeros<template>

Generate a vector, matrix or cube with the elements set to zero

Usage:

  • 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))

in Ihrem Fall also wäre es:

#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; 
} 

Zwei abschließende Bemerkungen:

  1. Sie ausdrücklich fest, dass der Code, wie es jetzt schaffen wird Spalten steht zu speichern Variablen. Sie erwähnen jedoch explizit, dass Sie Parameter schätzen mussten. Sie müssen diesen Wert möglicherweise erhöhen, um beim Speichern in die Slices eine Überschreitung zu verhindern.
  2. Die Art und Weise, wie die Rcpp::List out erstellt wird, ist nicht ganz korrekt. Im Allgemeinen ist der beste Weg, um die Liste zu erstellen: Rcpp::List out = Rcpp::List::create(Rcpp::Named("Blah"), Blah);
+0

@ coatless, Vielen Dank. Aber es hat nicht für mich funktioniert. :(. Zeigt beim Schreiben oder Kompilieren keinen Fehler an. Kann ich gleichzeitig arma :: cube und Rcpp :: NumericVector verwenden? Oder muss ich immer nur arma verwenden? – gultu

+0

@gultu Ich habe 0 Hinweise dazu was passiert in Ihrer MCMC-Routine, wie Sie es weggelassen haben.Ich kann nicht diagnostizieren, _why_ es funktioniert nicht für Sie, da die Informationen, die ich habe, spärlich und direkt mit der Instanziierung des "arma :: cube" verbunden ist. – coatless

+0

@ coatless , der Hauptcode ist sehr lang und ist kompliziert.Soll ich es hier posten? – gultu