2016-11-21 9 views
0

私はここでサンプルを取る関数を持っていますが、それは動作しますが、私はそれらをプロットできるようにベクトルに取り込まれたサンプルを格納するのに苦労しています。ここに私の機能は以下の通りです:私は関数の結果がベクトルに格納されます

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

で、最初は0のベクトルを作成しようとした

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

その後、何とか採取したサンプルでこれらの0年代に埋めるが、それは動作しません。誰かが私はとても幸せになるベクトルに私の印刷(x)の値を格納するとして支援してください可能性がある場合

+0

がそうであるようにrunifがベクトル化されましたか? – doctorlove

+0

これはR –

答えて

1

あなたは、xのすべての反復を格納するためのリストを作成する必要があります。それらの値を取得するために必要な関数を呼び出す必要があります。ここでxxは結果を格納します。 Rolandが示唆しているように、Rでのリストの作成は非常に遅い操作です。可能であれば、ベクトル化手法を使用する必要があります。

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) 

ベクタをあらかじめ定義してループで使用できます。これはリスト操作よりもはるかに高速です。

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

を使用しています。いいえ、本当にリストを使う必要はありません。そして、実際にループ内でオブジェクトを成長させるべきではありません。それは可能な最も遅い操作の1つです。 'for'ループを絶対に使いたい場合は' x < - numeric(n) 'を実行してください。 – Roland

+0

ええ、ここにリストは必要ありません。私は問題について十分な考えをしておらず、単にOPのコードを修正しただけです。それを反映するために私の答えを編集します。 –

1

ここでループを使用する必要はありません。この中で言語sqrtlogなど

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 
関連する問題