2016-11-21 4 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 'с образцами, взятых, но он не работает.

Если кто-то может помочь, пожалуйста, с с хранением моего печати (х) значений в векторе Я был бы так счастлив

+0

Какой язык это? – doctorlove

+0

Это используется R –

ответ

1

Вам нужно создать список для хранения все итерации х. то вам нужно вызвать нужную функцию, чтобы получить эти значения, т. е. здесь xx сохранит результаты. Как предложил Роланд, рост списка в 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

Нет, вам не нужно использовать список. И вы действительно не должны выращивать объект в цикле. Это одна из самых медленных операций. Просто сделайте 'x <- numeric (n)', если вы абсолютно хотите использовать цикл 'for'. – Roland

+0

Да, здесь нет необходимости в списке. Я не думал достаточно о проблеме и просто исправил код OP. Я отредактирую свой ответ, чтобы это отразить. –

1

Здесь действительно нет необходимости использовать петлю. runif является векторизация как и sqrt, log и т.д.

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 
Смежные вопросы