2016-11-21 29 views
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 = vector(mode="numeric",length=n) 

然後在這些0與抽取的樣品在某種程度上填補,但它無法正常工作。

如果有人可以幫助請與我存儲打印(x)的值向量我會很高興

+0

哪種語言是這裏? – 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

不,確實沒有必要使用列表。你真的不應該在一個循環中增長一個對象。這是可能的最慢操作之一。如果你絕對想使用'for'循環,只要'x < - numeric(n)'。 – Roland

+0

是的,這裏沒有必要列出。我對這個問題沒有足夠的認識,只是糾正了OP的代碼。我將編輯我的答案以反映這一點。 –

1

這裏確實沒有必要使用循環。 runif被矢量因爲是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 
相關問題