2016-11-21 57 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