2016-11-21 2 views
0

Ich habe hier eine Funktion, die Proben nimmt, es funktioniert aber ich kämpfe, um die in einem Vektor genommenen Proben zu speichern, so dass ich sie plotten kann; hier ist meine Funktion unten:Speicherfunktion ergibt einen Vektor

InvCDF = function(n, sd) { 
for (i in 1:n) { 
u=runif(1, min = 0, max = 1) 
x = sqrt(-2*(sd^2)*log(1-u)) 
print(x) 
} 
} 

ich versucht habe, zunächst mit

x = vector(mode="numeric",length=n) 

dann füllen irgendwie in diesem 0en mit den entnommenen Proben einen Vektor von 0en zu schaffen, aber es funktioniert nicht.

Wenn jemand bitte mit mit der Speicherung meiner print (x) Werte in einem Vektor helfen könnte, würde ich so glücklich

+0

Welche Sprache ist dies? – doctorlove

+0

Dies ist mit R –

Antwort

1

Sie sein müssen, eine Liste erstellen, für alle die Iteration von x zu speichern. dann müssen Sie die erforderliche Funktion aufrufen, um diese Werte zu erhalten, d. h. hier speichert xx die Ergebnisse. Wie von Roland vorgeschlagen, ist das Vergrößern einer Liste im R ein sehr langsamer Vorgang. Sie sollten den vektorisierten Ansatz verwenden, wann immer es möglich ist.

InvCDF = function(n, sd) { 
    x=list() 
    for (i in 1:n) { 
     u=runif(1, min = 0, max = 1) 
     x[[i]] = sqrt(-2*(sd^2)*log(1-u))   
    } 
    unlist(x) 
} 
xx=InvCDF(100,19) 

Sie könnten einen Vektor vordefinieren und in einer Schleife verwenden. Dies wäre viel schneller als Listenoperationen.

x <- numeric(n) 
InvCDF = function(n, sd) { 
    for (i in 1:n) { 
     u=runif(1, min = 0, max = 1) 
     x[i] = sqrt(-2*(sd^2)*log(1-u)) 
    } 
    x 
} 
+0

Nein, es gibt wirklich keine Notwendigkeit, eine Liste zu verwenden. Und du solltest wirklich kein Objekt in einer Schleife wachsen lassen. Das ist eine der langsamsten möglichen Operationen. Tun Sie einfach 'x <- numeric (n)', wenn Sie unbedingt eine 'for'-Schleife verwenden möchten. – Roland

+0

Ja, es gibt keine Notwendigkeit für eine Liste hier. Ich habe nicht genug über das Problem nachgedacht und lediglich den OP-Code korrigiert. Ich werde meine Antwort bearbeiten, um das zu reflektieren. –

1

Hier ist wirklich keine Schleife erforderlich. runif wird vektorisiert als sind sqrt, log usw.

InvCDF = function(n, sd) { 
    u <- runif(n, 0, 1) 
    sqrt(-2*(sd^2)*log(1-u)) 
} 

set.seed(1) # for reproducibility 
InvCDF(5, 1) 
#[1] 0.7855916 0.9647926 1.3043220 2.1855104 0.6711903