2016-06-20 9 views
2

Ich versuche, eine Sequential Monte Carlo Funktion in RCPP zu schreiben, und ich mit folgendem Problem:Füllen Sie einen Teil eines Vektors mit zufällig ermittelten Werten in RCPP

Ich habe einen Vektor, den die folgende Art und Weise erstellt:

NumericVector R_t(Part*Ttau); 

und ich möchte NUR Teilblöcke des Vektors füllen. Es sollte wie sein:

for (int i=0;i<Part;i++){ 
     R_t[i]=runif(1,0,2); 
} 

und das zweite Mal, dass ich

for (int i=Part+1;i<2*Part;i++){ 
      R_t[i]=runif(1,0,2); 
} 

haben möchte Aber es scheint nicht zu funktionieren. Ich könnte die alten Werte in jeder Iteration durch die neuen ersetzen, aber ich brauche die alten für jede Iteration. Wenn ich zu kompilieren versuchen, erhalte ich folgende Fehlermeldung:

cannot convert 'Rcpp::NUmericVector {aka Rcpp::Vector<14, Rcpp::PrserveStorage>}' to 'Rcpp::traits::storage_type<14>:: type {aka double}' in assignment 

Wäre es leichter, den Vektor mit einer 2-D-Matrix mit Dimensionen Teil und TTau zu ersetzen? Ich möchte diese letzte Option vermeiden.

Sorry, wenn dies beantwortet wurde, aber ich habe nichts in der Nähe dieses für RCPP finden

+0

Da Sie bereits 'Part * Ttau' Platz zuweisen, verwenden Sie eine" Matrix "und in jeder 'Ttau' Iteration füllen Sie die entsprechende Spalte wie' für (int i = 0; ich

+0

Das wäre nett, aber leider ist es nicht mein Code und ich muss auf Rcpp schreiben, und der Code, den ich habe, ist in diesem Format –

Antwort

5

Sie versuchen, eine Länge eines Vektors zu einer Stelle zuweisen, die eine double erwartet, so verwenden [0] die für den Zugriff auf erstes Element: runif(1,0,2)[0]. Sie können aber auch einfach ersetzen Ihre Schleife mit RCPP Zucker wiederholt zu vermeiden, baut einen Zufallswert zu einem Zeitpunkt, zu erzeugen:

#include <Rcpp.h> 

// [[Rcpp::export]] 
Rcpp::NumericVector fill_vector(R_xlen_t n, R_xlen_t m) { 
    Rcpp::NumericVector res(n); 
    for (R_xlen_t i = 0; i < m; i++) { 
     res[i] = Rcpp::runif(1, 0, 2)[0]; 
    } 
    return res; 
} 

// [[Rcpp::export]] 
Rcpp::NumericVector fill_vector2(R_xlen_t n, R_xlen_t m) { 
    Rcpp::NumericVector res(n); 
    res[Rcpp::seq(0, m - 1)] = Rcpp::runif(m, 0, 2); 
    return res; 
} 

/***R 

set.seed(123) 
fill_vector(7, 4) 
#[1] 0.5751550 1.5766103 0.8179538 1.7660348 0.0000000 0.0000000 0.0000000 

set.seed(123) 
fill_vector2(7, 4) 
#[1] 0.5751550 1.5766103 0.8179538 1.7660348 0.0000000 0.0000000 0.0000000 

set.seed(123) 
c(runif(4, 0, 2), rep(0, 3)) 
#[1] 0.5751550 1.5766103 0.8179538 1.7660348 0.0000000 0.0000000 0.0000000 

*/ 
+0

Danke für Ihre Hilfe! Könnte das bei einer Funktion wie dbinom in R gleich sein? –

+0

'std :: generate (res.begin(), res.begin() + m, unif_rand);' funktioniert auch. –

3

Sie haben zwei Möglichkeiten, wenn es um RNGs kommt:

  1. Verwenden Rcpp sugar zu Spiel runif(n,a,b) in R über Rcpp::runif(n,a,b) (liefert NumericVector oder
  2. Ihre eigene Schleife erstellen runif(n,a,b) zu imitieren, indem jedes Mal von R::runif(a,b)
  3. Zeichnung

@nrussell demoed wie 1 verwenden, indem Sie den Vektor über Rcpp::runif(n,a,b)[0] subsetting aber weggelassen Ansatz 2.

Unten ist, wie etwa Ansatz gehen 2:

#include <Rcpp.h> 

// [[Rcpp::export]] 
Rcpp::NumericVector draw_vector(int n, int m) { 
    Rcpp::NumericVector res(n); 
    for (int i = 0; i < m; i++) { 
    res[i] = R::runif(0.0, 2.0); // Draw a single element that is a double 
    } 
    return res; 
} 

/***R 
set.seed(123) 
draw_vector(7, 4) 
*/ 

Das gibt:

[1] 0.5751550 1.5766103 0.8179538 1.7660348 0.0000000 0.0000000 0.0000000 
+0

Könnte das für kompliziertere Funktionen funktionieren, zB das Äquivalent von dbinom in R? –

+0

Ja. Man beachte nur die Parameterstruktur von '? Dbinom'. Sie müssen mit 'double' und' bool' aufrufen. – coatless

Verwandte Themen