6 Stimmen

Dynamisch Größe der Liste in Rcpp erhöhen

Ich versuche, einen "Coupling to the past"-Algorithmus in Rcpp zu implementieren. Dafür muss ich eine Matrix mit Zufallszahlen speichern und, falls der Algorithmus nicht konvergiert, eine neue Matrix mit Zufallszahlen erstellen und diese auch speichern. Dies muss möglicherweise 10+ Mal oder öfter erfolgen, bis die Konvergenz erreicht ist.

Ich hoffte, dass ich eine Liste verwenden und sie dynamisch aktualisieren könnte, ähnlich wie in R. Ich war tatsächlich sehr überrascht, dass es ein wenig funktioniert hat, aber ich habe Fehlermeldungen erhalten, wenn die Größe der Liste groß wird. Dies scheint sinnvoll zu sein, da ich nicht den nötigen Speicher für die zusätzlichen Listenelemente reserviert habe, obwohl ich mit C++ nicht so vertraut bin und nicht sicher bin, ob das das Problem ist.

Hier ist ein Beispiel von dem, was ich versucht habe. Seien Sie jedoch vorsichtig, denn dies wird wahrscheinlich Ihre R-Sitzung abstürzen lassen:

library("Rcpp")

cppFunction(
includes = ' 
NumericMatrix RandMat(int nrow, int ncol)
 {
  int N = nrow * ncol;
  NumericMatrix Res(nrow,ncol);
  NumericVector Rands  = runif(N);
   for (int i = 0; i < N; i++) 
  {
    Res[i] = Rands[i];
  }
  return(Res);
 }',

code = '
void foo()
{
  // Dies ist der relevante Teil. Ich erstelle eine Liste, aktualisiere sie dann und drucke die Ergebnisse aus:
  List x;
  for (int i=0; i<10; i++)  
  {
   x[i] = RandMat(100,10);
   Rf_PrintValue(wrap(x[i]));
  }
}
')

foo()

Weiß jemand einen Weg, dies zu tun, ohne dass R abstürzt? Ich denke, ich könnte die Liste hier mit einer festen Anzahl von Elementen initialisieren, aber in meiner Anwendung ist die Anzahl der Elemente zufällig.

7voto

Romain Francois Punkte 17194

Sie müssen genügend Platz für Ihre Liste "allokieren". Vielleicht können Sie etwas wie eine resize-Funktion verwenden:

List resize( const List& x, int n ){
    int oldsize = x.size() ;
    List y(n) ;
    for( int i=0; i

`

und wann immer Sie möchten, dass Ihre Liste größer ist als jetzt, können Sie dies tun:

x = resize( x, n ) ;

Ihre Ausgangsliste hat die Größe 0, daher ist es zu erwarten, dass Sie beim ersten Durchlauf Ihrer Schleife ein unvorhersehbares Verhalten erhalten.

`

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X