#function #recursion #wolfram-mathematica
#Функция #Рекурсия #Wolfram-Mathematica
Вопрос:
Рассмотрим :
dist = Parallelize[
Table[RandomVariate[NormalDistribution[]], {100000}]];
Как я мог бы создать рекурсивную функцию, такую, что :
Subscript[d, 1] = dist[[1]]
Subscript[d, 2] = .95 Subscript[d, 1] dist[[2]]
Subscript[d, 3] = .95 Subscript[d, 2] dist[[3]]
И делайте это до Subscript[d, 100000]
Спасибо.
Удивительно, что я впервые сталкиваюсь с этим.
Комментарии:
1. Из любопытства, должно
dist[[i]]
быть0.05*dist[[i]]
? (Если нет, мне любопытно, какое приложение для этого.)2. @Brett, вы увидите больше в вопросе «таблица непредвиденных обстоятельств», который я задал вскоре после этого. Имитация некоторой волатильности рынка 🙂
Ответ №1:
Рассмотрим это:
dist = RandomVariate[NormalDistribution[], {100000}];
dist2 = Rest@FoldList[0.95 # #2 amp;, 0, dist];
Subscript[d, x_] := dist2[[x]]
Обычно я не использую нижний индекс таким образом; Я не знаю, что может сломаться при этом. Если вы подробнее опишете свою проблему, у меня может быть альтернативное предложение.
Комментарии:
1. Спасибо! Нижний индекс указан только потому, что я работаю со своим двоюродным братом и писал так, как он говорил. Как бы вы поступили?
2. @500 Я не говорю, что это обязательно неправильно, просто мне это не нравится. Я бы использовал что-то вроде
d[x_]
илиfunc[d, x_]
вместо того, чтобы присоединять определение кSubscript
.3. @Mr. Wizard, понял! Я никогда раньше не сталкивался с этим, я приму ваш формат!
4. 1 за использование генерации всех 100000 значений за один вызов вместо использования a
(Parallel)Table
.5. @Бретт, спасибо. Почему вы изменили его на
RandomVariate
? Этого нет в версии 7. В версии 8 это быстрее, чемRandomReal
?
Ответ №2:
Как насчет использования чего-то вроде
In[1]:= dist = ParallelTable[RandomVariate[NormalDistribution[]], {100000}];//Timing
Out[1]= {0.15601, Null}
In[2]:= folded = FoldList[.95 #1 #2 amp;, First@dist, Rest@dist]; // Timing
Out[2]= {0.056003, Null}
которую вы можете сравнить с
In[3]:= Subscript[d, 1] = dist[[1]];
Do[Subscript[d, n] = 0.95 Subscript[d, n - 1] dist[[n]],
{n, 2, Length@dist}] // Timing
Out[3]= {1.09607, Null}
In[4]:= Table[Subscript[d, n], {n, 1, Length@dist}] === folded
Out[4]= True
Комментарии:
1. (воспроизведение тега комментария) — Мне было жаль, потому что я сначала написал «чем это отличается от моего ответа?», А затем понял, что вы это признали.
2. @Mr.Wizard: о, мне было интересно. Да, я получил уведомление о том, что вы опубликовали ответ, как раз в тот момент, когда я убирал нумерацию входов / выходов, поэтому я все равно решил опубликовать. В конце концов,
Do
цикл, который я даю, реализует что-то вроде того, что изначально имел в виду OP. (Если бы не раннее воскресное утро, я мог бы быть быстрее и победить тебя!)