Как сохранить результаты длинного символьного вычисления для последующего использования?

Мои расчеты примерно такие:

f[x_]:= (*runs fast*)
g[x_]:=(*runs fast*)
h[x_]=depends on f[x],g[x] (*runs slow ~5mins*)

Теперь мне нужны только результаты h[x] и каждый раз, когда я перезапускаю mma, я по существу повторяю одни и те же вычисления, чтобы получить h[x], когда его можно было бы сохранить. Есть ли способ сохранить символические результаты и просто импортировать их в любое время, когда мне это нужно?


person Community    schedule 09.05.2011    source источник
comment
Вы пробовали мое решение? Это работает в вашем приложении? Загрузка с Get не должна не требовать времени, необходимого для создания h[x_] в первую очередь.   -  person Mr.Wizard    schedule 09.05.2011
comment
Связанный: Лучший способ построить функцию с память.   -  person Alexey Popkov    schedule 09.05.2011
comment
@Alexy: Большое спасибо! Этот вопрос был полезен.   -  person    schedule 12.05.2011


Ответы (1)


Попробуйте Сохранить.

Используйте как:

Save["h-defs.m", h]

И загрузите с помощью Get:

<< "h-defs.m"
person Mr.Wizard    schedule 09.05.2011
comment
Вместо этого я предлагаю использовать DumpSave["h-defs.mx", h], это намного быстрее для больших данных. Но это зависит от платформы. т.е. 64-битная версия не будет загружать что-то, сохраненное 32-битной версией. - person Szabolcs; 09.05.2011
comment
В документации Get говорится, что он читает файл, оценивая каждое выражение в нем и возвращая последнее. Я не хочу, чтобы он оценивал каждый раз, когда я его загружаю. - person ; 09.05.2011
comment
Вы не совсем поняли, что оценивается за 5 минут (конечно, не определение функции, так как она была с :=). Выполните вычисление, сохраните результат в переменной, затем сохраните эту переменную с помощью (Dump)Save. В качестве альтернативы используйте запоминание с h и сохраните h после выполнения вычислений. - person Szabolcs; 09.05.2011
comment
Вы также можете использовать use DumpSave, но я думаю, что использование Save лучше для новичка, так как вы можете прочитать файл .m, чтобы увидеть, что он содержит. - person Mr.Wizard; 09.05.2011
comment
@ d'o-o'b, как описывает Сабольч, я предполагаю, что вы создаете серию DownValues ​​​​для h с помощью мемоизации или иным образом. Когда вы используете Get (<<), он оценивает выражение, которое устанавливает эти значения DownValues, что вам и нужно. - person Mr.Wizard; 09.05.2011
comment
@Мистер. Волшебник: Извините за :=. Я просто скопировал из строк выше. Я использую =, поэтому оценка требует времени. - person ; 09.05.2011
comment
@ d'o-o'b Я это понимаю, и мое решение должно работать. Пожалуйста, попробуйте и сообщите о любых проблемах. - person Mr.Wizard; 09.05.2011
comment
@Мистер. Wizard: ваше решение работает и загружается сразу; однако переменные с индексами таким образом не сохраняются. Знаете ли вы обходной путь для этого? Я также символизировал Subscriptbox["_","_"], так что я действительно не знаю, почему это не сохранится. - person ; 09.05.2011
comment
@d'o-o'b есть несколько способов использования индексов, если я правильно помню. Не могли бы вы опубликовать небольшой пример вашего использования? - person Mr.Wizard; 09.05.2011
comment
@Мистер. Волшебник: Я был неправ. На самом деле он сохраняет переменные с индексами. Я был сбит с толку, потому что он ничего не показывал, когда я использовал ?variable, но Definition@variable работал. Принятие вашего ответа. - person ; 09.05.2011
comment
@d'o-o'b спасибо за согласие. Если вам интересно, что сохраняется, вы можете просмотреть файл .m в текстовом редакторе или Mathematica. Вот почему намеренно рекомендуется Save вместо DumpSave. (Кроме того, тот факт, что DumpSave зависит от машины, и поэтому, если вы думаете, что безопасно сохранили свой код и удалили оригинал, вы потом пожалеете.) - person Mr.Wizard; 09.05.2011