Мы все знаем, что Mathematica великолепна, но ей также часто не хватает критически важной функциональности. Какие внешние пакеты / инструменты / ресурсы вы используете с Mathematica?
Я отредактирую (и приглашаю кого-либо еще сделать это) этот основной пост, чтобы он включал ресурсы, посвященные общей применимости в научных исследованиях и которые как можно больше людей найдут полезными. Не стесняйтесь вносить что угодно, даже небольшие фрагменты кода (как я сделал ниже для процедуры синхронизации).
Также приветствуются недокументированные и полезные функции в Mathematica 7 и более поздних версиях, которые вы нашли или нашли в какой-либо статье / сайте.
Пожалуйста, включите краткое описание или комментарий о том, почему что-то великолепно или какую утилиту он предоставляет. Если вы ссылаетесь на книги на Amazon с помощью партнерских ссылок, укажите это, например, указав свое имя после ссылки.
Пакеты:
LevelScheme
это пакет, который значительно расширяет возможности Mathematica по созданию хороших участков. Я использую его, если не для чего-то еще, то для намного, намного улучшенного контроля над тиками кадра / осей. Его новейшая версия называется SciDraw, и она будет выпущена где-то в этом году.- David Park's
Presentation Package
(50 долларов США - бесплатно) grassmannOps
Пакет Джереми Майкельсона предоставляет ресурсы для выполнения алгебры и исчисления с грассмановыми переменными и операторами, которые имеют нетривиальные коммутационные отношения.GrassmannAlgebra
Пакет и книга Джона Брауна для работы с алгебрами Грассмана и Клиффорда.- RISC (Научно-исследовательский институт символических вычислений) имеет множество пакетов для Mathematica (и других языков), доступных для скачивания. В частности, есть Теорема для автоматического доказательства теорем и множество пакетов для символьного суммирования, разностных уравнений и т. Д. На странице программного обеспечения группы Algorithmic Combinatorics .
Инструменты:
MASH
превосходный Perl- скрипт Даниэла Ривза, по сути обеспечивающий поддержку сценариев для Mathematica v7. (В настоящее время встроено в Mathematica 8 с-script
возможностью.)- An
alternate Mathematica shell
с GNU readline входом (используя python, только * nix) - Пакет ColourMaths позволяет визуально выбирать части выражения и манипулировать ими. http://www.dbaileyconsultancy.co.uk/colour_maths/colour_maths.html
Ресурсы:
В собственном репозитории Wolfram
MathSource
есть много полезных, но узких тетрадей для различных приложений. Также проверьте другие разделы, такие какCurrent Documentation
,Courseware
для лекций,Demos
ну и для демо.
Книги:
- Программирование в Mathematica: подробное введение Леонида Шифрина (
web
,pdf
) необходимо прочитать, если вы хотите сделать что-то большее, чем цикл For в Mathematica. Мы рады, чтоLeonid
сам отвечаем на вопросы здесь. - Квантовые методы с Mathematica Джеймсом Ф. Феагином ( амазонка )
- Книга Математики Стивена Вольфрама ( амазонка ) (
web
) - Схема Шаума ( амазонка )
- Mathematica в действии Стэна Вагона ( Амазонка ) - 600 страниц аккуратных примеров и доходит до версии 7. Mathematica. Методы визуализации особенно хороши, некоторые из них вы можете увидеть на авторской
Demonstrations Page
. - Основы программирования Mathematica от Ричарда Гейлорда (
pdf
) - хорошее краткое введение в большинство того, что вам нужно знать о программировании Mathematica. - Поваренная книга Mathematica Сала Мангано, опубликованная O'Reilly 2010 832 страниц. - Написано в хорошо известном стиле поваренной книги О'Рейли: проблема - решение. Для посредников.
- Дифференциальные уравнения с Mathematica, 3-е изд. Elsevier 2004 Amsterdam от Марты Л. Абелл, Джеймса П. Бразелтона - 893 страницы Для начинающих изучите решение задач DE и Mathematica одновременно.
Недокументированные (или едва документированные) функции:
- Как настроить сочетания клавиш Mathematica. См
this question
. - Как проверить шаблоны и функции, используемые собственными функциями Mathematica. Видеть
this answer
- Как добиться согласованного размера для GraphPlots в Mathematica? См
this question
. - Как составлять документы и презентации с помощью Mathematica. См
this question
.
источник
Grid
или чего-то подобного.Ответы:
Я уже говорил это раньше, но инструмент , который я нахожу наиболее полезным является применение
Reap
иSow
который подражает / расширяет поведениеGatherBy
:Это позволяет мне группировать списки по любым критериям и преобразовывать их в процессе. Это работает так: функция критериев (
f
) помечает каждый элемент в списке, каждый элемент затем преобразуется с помощью второй предоставляемой функции (g
), а конкретный вывод контролируется третьей функцией (h
). Функцияh
принимает два аргумента: тег и список собранных элементов, имеющих этот тег. Элементы сохраняют свой первоначальный порядок, поэтому, если вы установите,h = #1&
вы получите несортированныйUnion
, как в примерах дляReap
. Но его можно использовать для вторичной переработки.В качестве примера его полезности я работал с Wannier90, который выводит пространственно зависимый гамильтониан в файл, где каждая строка представляет собой отдельный элемент в матрице, как показано ниже.
Чтобы превратить этот список в набор матриц, я собрал все подсписки, содержащие одну и ту же координату, превратил информацию об элементе в правило (то есть {i, j} -> Re [Hij] + I Im [Hij]) и затем превратили собранные правила во
SparseArray
все с одним вкладышем:Честно говоря, это мой швейцарский армейский нож, и он делает сложные вещи очень простыми. Большинство других моих инструментов в некоторой степени относятся к конкретному домену, поэтому я, вероятно, не буду публиковать их. Однако большинство, если не все, из них ссылки
SelectEquivalents
.Изменить : он не полностью подражает
GatherBy
в том, что он не может сгруппировать несколько уровней выражения так просто, какGatherBy
может. Тем не менее,Map
работает просто отлично для большинства того, что мне нужно.Пример : @ Ярослав Булатов попросил самостоятельный пример. Вот одно из моих исследований, которое было значительно упрощено. Итак, скажем, у нас есть набор точек на плоскости
и мы хотели бы уменьшить количество точек с помощью набора операций симметрии. (Для любопытных мы генерируем небольшую группу каждой точки.) Для этого примера давайте используем четырехкратную ось вращения вокруг оси z.
Используя
SelectEquivalents
мы можем сгруппировать точки, которые производят одинаковый набор изображений под этими операциями, то есть они эквивалентны, используя следующиекоторый производит 3 подсписка, содержащие эквивалентные пункты. (Обратите внимание, что
Union
здесь абсолютно необходимо, поскольку оно гарантирует, что одно и то же изображение создается каждой точкой. Первоначально я использовалSort
, но если точка лежит на оси симметрии, она инвариантна относительно поворота вокруг этой оси, давая дополнительное изображение самого себя. Таким образом,Union
устраняются эти дополнительные изображения. Кроме того,GatherBy
будет получен тот же результат.) В этом случае точки уже в форме, которую я буду использовать, но мне нужно только репрезентативные точки из каждой группировки, и я хотел бы подсчет из эквивалентных точек. Поскольку мне не нужно преобразовывать каждую точку, я используюIdentity
функция во второй позиции. Для третьей функции мы должны быть осторожны. Первым аргументом, переданным ему, будут изображения точек под поворотами, которые для точки{0,0,0}
представляют собой список из четырех идентичных элементов, и использование его приведет к сбросу счетчика. Однако второй аргумент - это просто список всех элементов, которые имеют этот тег, поэтому он будет содержать только{0,0,0}
. В кодеОбратите внимание, что этот последний шаг может быть легко выполнен
Но с помощью этого и менее полного примера выше легко увидеть, как очень сложные преобразования возможны с минимумом кода.
источник
Fortran
кодов, которые я видел. Заставляет меня почти подумать об использованииFortran
...Одна из приятных особенностей интерфейса ноутбука Mathematica заключается в том, что он может оценивать выражения на любом языке, а не только в Mathematica. В качестве простого примера рассмотрим создание нового типа входной ячейки оболочки, который передает содержащееся выражение в оболочку операционной системы для оценки.
Сначала определите функцию, которая делегирует оценку текстовой команды внешней оболочке:
Второй аргумент необходим и игнорируется по причинам, которые станут очевидными позже. Далее мы хотим создать новый стиль под названием Shell :
Shell
.Используйте следующее выражение ячейки в качестве текста шага 6 :
Большая часть этого выражения была скопирована непосредственно из встроенного стиля Программы . Ключевые изменения следующие:
Evaluatable
включает функциональность SHIFT + ENTER для ячейки. Оценка будет называтьCellEvaluationFunction
передаваемое содержимое ячейки и тип содержимого аргументами (shellEvaluate
игнорирует последний аргумент).CellFrameLabels
это просто изюминка, позволяющая пользователю определить, что эта ячейка необычна.Имея все это в наличии, мы можем теперь ввести и оценить выражение оболочки:
Лучше всего хранить этот определенный стиль в центральной таблице стилей. Кроме того, такие функции оценки, как
shellEvaluate
лучше всего, определены как заглушки с использованием DeclarePackage вinit.m
. Детали обоих этих действий выходят за рамки этого ответа.С помощью этой функции можно создавать записные книжки, содержащие входные выражения в любом интересующем синтаксисе. Функция оценки может быть написана на чистом Mathematica или делегировать какую-либо или все части оценки внешнему агентству. Имейте в виду, что есть другие крючки, которые относятся к оценке клеток, например
CellEpilog
,CellProlog
иCellDynamicExpression
.Обычный шаблон включает запись текста входного выражения во временный файл, компиляцию файла на каком-либо языке, запуск программы и захват вывода для окончательного отображения в выходной ячейке. При реализации полного решения такого рода необходимо учитывать множество деталей (например, правильно регистрировать сообщения об ошибках), но следует учитывать тот факт, что такие действия возможны не только так, но и практично.
Что касается меня, именно такие особенности делают интерфейс ноутбука центром моей вселенной программирования.
Обновить
Следующая вспомогательная функция полезна для создания таких ячеек:
Используется таким образом:
Теперь, если
shellCell[]
вычислено, входная ячейка будет удалена и заменена новой входной ячейкой, которая оценивает ее содержимое как команду оболочки.источник
CellEvaluationFunction
Я думаю, что можно использовать и для взлома синтаксиса низкого уровня.CellEvaluationFunction
тот крючок, который вы искали?Cell
вариант, связанный с оценкой ячеекEvaluator -> "EvaluatorName"
. Значение"EvaluatorName"
может быть настроено через диалог Evaluation :: Kernel Configuration Options .... Я до сих пор не знаю, возможно ли это настроить программно ... Этот метод позволяет использовать разные MathKernels в разныхCell
s в одной записной книжке. Эти MathKernels могут быть из разных версий Mathematica .Import
, или, возможно, запустить внешний процесс Python и обмениваться данными через его потоки (например, используя Java ProcessBuilder ). Я уверен, что есть лучший способ Mathematica - звучит как хороший вопрос :)Тодд Гейли (Wolfram Research) просто прислал мне приятный хак, который позволяет «обернуть» встроенные функции произвольным кодом. Я чувствую, что должен поделиться этим полезным инструментом. Вот ответ Тодда на мой
question
.источник
Unprotect
действительно, должно быть, просто не учтено . ТочкаBlock
(динамическая область видимости) и$inMsg
является именно для предотвращения бесконечной рекурсии. Поскольку$inMsg
не определено снаружи (это важное требование), сначала выполняетсяTrueQ
оценкаFalse
, и мы входим в тело функции. Но когда у нас есть вызов функции внутри тела, условие оценивается какFalse
(поскольку переменная была переопределена блоком). Таким образом, пользовательское правило не соответствует, и вместо него используется встроенное правило.DownValues
во время выполнения, вы можете посмотреть этот пример groups.google.com/group/comp.soft-sys.math.mathematica/… , например (SetDelayed
переопределение) , Но мой метод менее элегантен, менее надежен, более подвержен ошибкам и делает отрыв от рекурсии гораздо менее тривиальным для реализации. Так что в большинстве ситуаций метод, описанный @Alexey, выигрывает.Это не полный ресурс, поэтому я добавляю его сюда, в раздел ответов, но я нашел его очень полезным при выяснении проблем со скоростью (что, к сожалению, является большой частью того, что представляет собой программирование на Mathematica).
Использование тогда просто
timeAvg@funcYouWantToTest
.EDIT: Г - н Мастер предоставил более простую версию , которая покончила с
Throw
иCatch
и немного легче разбором:РЕДАКТИРОВАТЬ: Вот версия из ACL (взято отсюда ):
источник
Catch
иThrow
должны были использоваться с уникальными тегами исключений.Throw
иCatch
», а не «Reap
иSow
».RepeatedTiming
чтобы сделать это.Internal`InheritedBlock
Недавно я узнал о существовании такой полезной функции, как
Internal`InheritedBlock
из этого сообщения Даниэля Лихтблау в официальной группе новостей.Как я понимаю,
Internal`InheritedBlock
позволяет передавать копию исходящей функции вBlock
область видимости:Я думаю, что эта функция может быть очень полезна для всех, кому необходимо временно изменить встроенные функции!
Сравнение с блоком
Давайте определим некоторую функцию:
Теперь мы хотим передать копию этой функции в
Block
область видимости. Наивное испытание не дает того, что мы хотимТеперь попробуем использовать отложенное определение в первом аргументе
Block
(это тоже недокументированная функция):Мы видим, что в этом случае
a
работает, но у нас нет копии оригиналаa
внутриBlock
области.Теперь давайте попробуем
Internal`InheritedBlock
:У нас есть копия исходного определения для
a
внутренней частиBlock
области, и мы можем изменить ее так, как мы хотим, не затрагивая глобальное определение дляa
!источник
Mathematica - острый инструмент, но он может поразить вас своим нетипичным поведением и лавинами загадочных диагностических сообщений . Один из способов справиться с этим - определить функции, следующие этой идиоме:
Это много шаблонов, которые я часто испытываю, чтобы пропустить. Особенно при прототипировании, что часто случается в Mathematica. Итак, я использую макрос,
define
который позволяет мне оставаться дисциплинированным, с гораздо меньшим количеством шаблонов.Основное использование
define
это так:Поначалу это выглядит не очень, но есть некоторые скрытые преимущества. Первая услуга, которая
define
предоставляет, это то, что она автоматически применяетсяClearAll
к определяемому символу. Это гарантирует отсутствие оставшихся определений - обычное явление во время первоначальной разработки функции.Второй сервис заключается в том, что определяемая функция автоматически «закрывается». Под этим я подразумеваю, что функция выдаст сообщение и прервет работу, если она вызывается со списком аргументов, который не соответствует ни одному из определений:
Это основное значение
define
, которое улавливает очень распространенный класс ошибок.Другое удобство - это краткий способ указания атрибутов в определяемой функции. Давайте сделаем функцию
Listable
:В дополнение ко всем обычным атрибутам,
define
принимает дополнительный вызываемый атрибутOpen
. Это предотвращаетdefine
добавление определения всеобщей ошибки в функцию:Несколько функций могут быть определены для функции:
Без дальнейших церемоний, вот определение
define
:Представленная реализация не поддерживает ни up-значения, ни карри, ни шаблоны более общие, чем простое определение функции. Это остается полезным, однако.
источник
Начните без пустой записной книжки
Меня беспокоило, что Mathematica начала с пустой записной книжки. Я мог бы закрыть эту записную книжку сценарием, но она все равно быстро открылась. Мой хак - создать файл,
Invisible.nb
содержащий:И добавить это в мой
Kernel\init.m
:Теперь я запускаю Mathematica, открыв
Invisible.nb
Может быть, есть и лучший способ, но это мне хорошо послужило.
Индивидуальные
Fold
иFoldList
Fold[f, x]
сделан эквивалентноFold[f, First@x, Rest@x]
Между прочим, я считаю, что это может найти свой путь в будущей версии Mathematica.Сюрприз! Это было реализовано, хотя в настоящее время это не документировано. Мне сообщили, что он был реализован в 2011 году Оливером Рюбенкоенигом, по-видимому, вскоре после того, как я опубликовал это. Спасибо Оливер Рюбенкоениг!
Обновлено, чтобы разрешить это:
"Динамический раздел"
См. Mathematica.SE post # 7512 для новой версии этой функции.
Часто я хочу разделить список в соответствии с последовательностью длин.
Пример псевдокода:
partition[{1,2,3,4,5,6}, {2,3,1}]
Вывод:
{{1,2}, {3,4,5}, {6}}
Я придумал это:
Который я тогда закончил с этим, включая проверку аргументов:
Третий аргумент управляет тем, что происходит с элементами, выходящими за пределы спецификации разделения.
Уловки Сабольца по математике
Наиболее часто я использую Палитру табличных данных.
Изменить внешние данные изнутри
Compile
Недавно Даниэль Лихтблау показал этот метод, которого я никогда раньше не видел. На мой взгляд, это значительно расширяет полезность
Compile
источник
Compile
- весь мой пост здесь: stackoverflow.com/questions/5246330/… , должен был продемонстрировать эту возможность в нетривиальной обстановке (там было опубликовано там более короткое и быстрое решение рассматриваемой проблемы) , ИМО, самая большая победа здесь - это возможность эмулировать передачу по ссылке и разбивать большие скомпилированные функции на более управляемые и повторно используемые фрагменты.Общие проблемы экспорта PDF / EMF и их решения
1) Это совершенно неожиданно и недокументировано, но Mathematica экспортирует и сохраняет графику в форматах PDF и EPS, используя набор определений стилей, который отличается от набора, используемого для отображения Блокнотов на экране. По умолчанию блокноты отображаются на экране в среде стиля «Работа» (которая является значением по умолчанию для
ScreenStyleEvironment
глобальной$FrontEnd
опции), но печатаются в"Printout"
среде стиля (которая является значением по умолчанию дляPrintingStyleEnvironment
глобальной$FrontEnd
опции). При экспорте графики в растровые форматы, такие как GIF и PNG или в формате EMF, Mathematica генерирует графику, которая выглядит точно так же, как в Notebook. Кажется, что"Working"
В этом случае для рендеринга используется стиль среды. Но это не тот случай, когда вы экспортируете / сохраняете что-либо в форматах PDF или EPS! В этом случае"Printout"
по умолчанию используется среда стиля, которая очень сильно отличается от среды стиля «Работа». Прежде всего, в"Printout"
стиле наборы окружающей средыMagnification
до 80% . Во-вторых, он использует свои собственные значения для размеров шрифта разных стилей, что приводит к непоследовательным изменениям размера шрифта в измененном файле PDF по сравнению с исходным представлением на экране. Последнее можно назвать флуктуациями FontSize, которые очень раздражают. Но, к счастью, этого можно избежать , установивPrintingStyleEnvironment
глобальный$FrontEnd
параметр «Работа» :2) Общая проблема при экспорте в формат EMF состоит в том, что большинство программ (не только Mathematica ) генерируют файл, который выглядит хорошо при размере по умолчанию, но становится уродливым при его увеличении. Это связано с тем, что метафайлы выбираются с точностью разрешения экрана . Качество созданного файла EMF может быть улучшено за счет
Magnify
использования исходного графического объекта, так что точность выборки исходной графики становится намного более точной. Сравните два файла:Если вы вставите эти файлы в Microsoft Word и увеличите их, вы увидите, что у первого «а» есть пилообразный сигнал, а у второго нет (протестировано с Mathematica 6).
Крис Дегнен ( Chris Degnen)
ImageResolution
предложил другой путь (по крайней мере, начиная с Mathematica 8):3) В Mathematica есть три способа преобразования графики в метафайл: через
Export
к"EMF"
(настоятельно рекомендуется образом: производит метафайл с максимально возможным качеством), с помощьюSave selection As...
пункта меню ( производит гораздо меньшее точную цифру , не рекомендуется) и с помощьюEdit ► Copy As ► Metafile
пункта меню ( я настоятельно рекомендую против этого маршрута ).источник
По многочисленным просьбам, код для генерации топ-10 SO отвечает ответчикам (кроме аннотаций ) с использованием SO API .
источник
Кэширование выражений
Я считаю, что эти функции очень полезны для кэширования любого выражения. Интересная вещь для этих двух функций заключается в том, что само удерживаемое выражение используется в качестве ключа хеш-таблицы / символа Cache или CacheIndex, по сравнению с хорошо известным памятником в mathematica, где вы можете кэшировать результат, только если функция определена как f [x_]: = f [x] = ... Таким образом, вы можете кэшировать любую часть кода, это полезно, если функция должна вызываться несколько раз, но только некоторые части кода не должны пересчитываться.
Кэшировать выражение независимо от его аргументов.
Во второй раз выражение возвращает 6 без ожидания.
Для кэширования выражения используется псевдоним, который может зависеть от аргумента кэшированного выражения.
Если для вычисления expr требуется некоторое время, гораздо быстрее вычислить {"f", 2}, например, для получения кэшированного результата.
Разновидность этих функций для того, чтобы иметь локализованный кеш (т. Е. Кеш-память автоматически высвобождается за пределами конструкции Block), см. В этом посте. Избегайте повторных обращений к интерполяции.
Удаление кэшированных значений
Чтобы удалить кэшированные значения, когда вы не знаете количество определений функции. Я считаю, что определения имеют пробел где-то в своих аргументах.
Удалить кэшированные значения, когда вы знаете количество определений функции (идет немного быстрее).
При этом используется тот факт, что определения функции находятся в конце их списка DownValues, а кэшированные значения - раньше.
Использование символов для хранения данных и объектоподобных функций
Также здесь есть интересные функции для использования символов, таких как объекты.
Уже хорошо известно, что вы можете хранить данные в символах и быстро получать к ним доступ, используя DownValues
Вы можете получить доступ к списку ключей (или свойств) символа, используя эти функции в зависимости от того, что dreeves представили в посте на этом сайте:
Я часто использую эту функцию для отображения всей информации, содержащейся в DownValues символа:
Наконец, вот простой способ создать символ, который ведет себя как объект в объектно-ориентированном программировании (он просто воспроизводит самое основное поведение ООП, но я нахожу синтаксис элегантным):
Свойства сохраняются как DownValues, а методы - как задержанные Upvalues в символе, созданном модулем, который возвращается. Я нашел синтаксис для function2, который является обычным OO-синтаксисом для функций в структуре данных Tree в Mathematica .
Список существующих типов значений, которые имеет каждый символ, см. В http://reference.wolfram.com/mathematica/tutorial/PatternsAndTransformationRules.html и http://www.verbeia.com/mathematica/tips/HTMLLinks/Tricks_Misc_4.html. ,
Например попробуйте это
Вы можете пойти дальше, если хотите эмулировать наследование объектов, используя пакет InheritRules, доступный здесь http://library.wolfram.com/infocenter/MathSource/671/
Вы также можете хранить определение функции не в newObject, а в символе типа, поэтому, если NewObject возвращает тип [newObject] вместо newObject, вы можете определить function и function2 как это вне NewObject (и не внутри) и использовать то же, что и раньше ,
Используйте UpValues [тип], чтобы увидеть, что функция и function2 определены в символе типа.
Дополнительные идеи об этом последнем синтаксисе представлены здесь https://mathematica.stackexchange.com/a/999/66 .
Улучшенная версия SelectEquivalents
@rcollyer: Большое спасибо за то, что вывели SelectEquivalents на поверхность, это потрясающая функция. Вот улучшенная версия SelectEquivalents, перечисленных выше, с большим количеством возможностей и опций, это облегчает использование.
Вот примеры того, как эта версия может быть использована:
Использование Mathematica Gather / Collect правильно
Как бы вы сделали функцию сводной таблицы в Mathematica?
Mathematica быстрый алгоритм 2D-биннинга
Internal`Bag
Даниэль Лихтблау описывает здесь интересную внутреннюю структуру данных для растущих списков.
Внедрение Quadtree в Mathematica
Функции отладки
Эти два сообщения указывают на полезные функции для отладки:
Как отлаживать при написании маленьких или больших кодов с помощью Mathematica? верстак? мма отладчик? или что-то другое? (Покажи это)
/programming/5459735/the-clearest-way-to-represent-mathematicas-evaluation-sequence/5527117#5527117 (TraceView)
Вот еще одна функция, основанная на Reap и Sow, для извлечения выражений из разных частей программы и сохранения их в символе.
Вот пример
Другие источники
Вот список интересных ссылок для целей обучения:
Коллекция учебных ресурсов Mathematica
Обновлено здесь: https://mathematica.stackexchange.com/a/259/66
источник
f[x_] := f[x] = some code
.c:Cache[expr_] := c = expr
.SelectEquivalents
. Думаю, я бы оставилTagOnElement
второй параметр по умолчаниюIdentity
, хотя он наиболее часто используется. Я не думаю, что я включилFinalOp
, так как это может быть обработано внутриOpOnTaggedElems
. Я также сократил бы имена опций, так как их длина затрудняет ввод. ПопробуйтеTagFunction
,TransformElement
,TransformResults
иTagPattern
вместо этого. И то,TagPattern
и другоеMapLevel
- отличное дополнение к функциональности и хорошая перезапись в целом.Мои служебные функции (у меня есть эти встроенные в MASH, который упоминается в вопросе):
источник
Один трюк, который я использовал, который позволяет вам эмулировать работу большинства встроенных функций с неверными аргументами (отправляя сообщение, а затем возвращая всю форму без оценки), использует причуду способа
Condition
работы при использовании в определении. Еслиfoo
должен работать только с одним аргументом:Если у вас есть более сложные потребности, легко выделить проверку аргументов и генерацию сообщений как независимую функцию. Вы можете делать более сложные вещи, используя побочные эффекты,
Condition
помимо генерации сообщений, но, по моему мнению, большинство из них попадают в категорию «подлых хаков», и их следует избегать, если это возможно.Кроме того, в категории «метапрограммирование», если у вас есть
.m
файл пакета Mathematica ( ), вы можете использовать этот"HeldExpressions"
элемент для получения всех выражений в файлеHoldComplete
. Это значительно упрощает отслеживание, чем использование текстового поиска. К сожалению, нет простого способа сделать то же самое с ноутбуком, но вы можете получить все входные выражения, используя что-то вроде следующего:Наконец, вы можете использовать тот факт, что
Module
эмулирует лексические замыкания для создания эквивалента ссылочных типов. Вот простой стек (который использует разновидностьCondition
трюка для обработки ошибок в качестве бонуса):Теперь вы можете напечатать элементы списка в обратном порядке в излишне запутанном виде!
источник
HeldExpressions
элемент в пакетах, не знал об этом. Я обычно импортирования в виде строки , а затем использоватьToExpression
сHoldComplete
качестве последнего арг. Что касается использованияCondition
для сообщений - это был стандартный метод при написании пакетов, по крайней мере, с 1994 года. Что касается постоянства с помощьюModule
vars - я уже давно писал об этом в Mathgroup : groups.google.com/group/comp.soft- sys.math.mathematica /… (мой третий пост в этой теме), в том же духе и содержит ссылки на несколько нетривиальных примеров использования.Condition
вещь как знания, вероятно, от коллеги, но не понял, что это стандартная техника. Ссылка на использованиеModule
символов в качестве ссылочных типов интересна!Распечатка определений символов системы без добавления контекста
contextFreeDefinition[]
Ниже функция будет пытаться напечатать определение символа без наиболее общего контекста предварённого. Затем определение можно скопировать в Workbench и отформатировать для удобства чтения (выберите его, щелкните правой кнопкой мыши, Source -> Format)справила []
Предостережение: эта функция не локализует переменные таким же образом
With
иModule
делает, что означает, что вложенные конструкции локализации не будут работать должным образом.withRules[{a -> 1, b -> 2}, With[{a=3}, b_ :> b]]
будет заменитьa
иb
в вложенномWith
иRule
, в то время какWith
не делает этого.Это вариант,
With
который использует правила вместо=
и:=
:Я нашел это полезным при очистке кода, написанного во время экспериментов и локализации переменных. Изредка я получаю списки параметров в форме
{par1 -> 1.1, par2 -> 2.2}
. СwithRules
параметром значения легко вводить в код ранее написанного с использованием глобальных переменных.Использование так же, как
With
:Сглаживание 3D-графики
Это очень простая техника для сглаживания 3D-графики, даже если ваше графическое оборудование не поддерживает ее изначально.
Вот пример:
Обратите внимание, что большое значение
n
или большой размер изображения имеет тенденцию выставлять ошибки графического драйвера или вносить артефакты.Функциональность diff ноутбука
Функциональность diff ноутбука доступна в
<<AuthorTools`
пакете и (по крайней мере, в версии 8) в недокументированномNotebookTools`
контексте. Это небольшой графический интерфейс для отображения двух открытых на данный момент ноутбуков:источник
a = 3; b = 4;
перед вызовом примера, а затем вызовwithRules
. Вы можете сохранить его, используя вместо этого следующее:SetAttributes[withRules, HoldAll];withRules[rules_, expr_] := Unevaluated[expr] /. Unevaluated[rules]
. Различия по семантикеWith
: 1. Правила теперь не оцениваются 2.withRules
Не разрешает конфликты имен с внутренними контекстными конструкциями, как этоWith
делается. Последнее довольно серьезно - быть хорошим или плохим в зависимости от случая.With
s. Это также не всегда работает со встроенными конструкциями локализации, напримерWith[{a=1}, Block[{a=2}, a]]
. Как вы думаете, есть ли веская причина, почему вложенныеBlock
не локализуются там, как вложенныеWith
иModule
делают?)Unevaluated[rules]
потому что хотелx -> 1+1
оценить RHS.With
s легко обнаружить и избежать, но паттерны нет:With[{a = 1}, a_ -> a]
локализует внутреннее,a
аwithRules
нет. Знаете ли вы, есть ли способ получить доступ к внутреннему механизму локализации Mathematica и создать новые конструкции (аналогичныеRule
), которые также локализуются? Я, вероятно, удалю этот ответ позже, так как он более опасен, чем полезен, но я хотел бы сначала немного поиграть с ним.InheritedBlock
довольно круто и решаете проблему очень элегантно. Что касается конфликтов областей видимости, обычно привязки для лексической области видимости происходят в «лексическое время привязки», то есть - до времени выполнения, тогда как динамическая область видимости связывается во время выполнения, что может объяснить это. Вы можете сравнить это с аналогичным случаем дляModule
, который позволяет конструктивно использовать (см., Например, здесь stackoverflow.com/questions/7394113/… ). Проблема в том, чтоBlock
нужен какой-то символ ...Чистые рекурсивные функции (
#0
) кажутся одним из самых темных углов языка. Вот пара нетривиальных примеров их использования, где это действительно полезно (не то, что они не могут быть сделаны без него). Ниже приведена довольно краткая и достаточно быстрая функция для поиска связанных компонентов в графе, учитывая список ребер, заданных в виде пар вершин:Здесь происходит то, что мы сначала отображаем фиктивный символ на каждом из номеров вершин, а затем устанавливаем способ, которым, если
{f[5],f[10]}
, скажем, с учетом пары вершин ,f[5]
будет выполняться оценкаf[10]
. В качестве компрессора пути используется рекурсивная чистая функция (для настройки запоминания таким образом, чтобы вместо длинных цепочек, таких какf[1]=f[3],f[3]=f[4],f[4]=f[2], ...
запомненные значения, корректировались при обнаружении нового «корня» компонента. Это дает значительное ускорение. Поскольку мы используем присваивание, нам нужно, чтобы он был HoldAll, что делает эту конструкцию еще более непонятной и привлекательной). Эта функция является результатом дискуссий Mathgroup, в которых участвуют Фред Саймонс, Szabolcs Horvat, DrMajorBob и все остальные. Пример:Это, конечно, намного медленнее, чем встроенный, но по размеру кода, все еще довольно быстрый IMO.
Другой пример: вот рекурсивная реализация
Select
, основанная на связанных списках и рекурсивных чистых функциях:Например,
Однако это не совсем хвостовая рекурсия, и он взорвет стек (сбой ядра) для больших списков. Вот хвосто-рекурсивная версия:
Например,
источник
Это рецепт из книги Стэна Вагона ... используйте его, когда встроенный график ведет себя хаотично из-за отсутствия точности
Я часто использую следующий трюк от Кристьяна Каннике, когда мне нужно «словарное» поведение из понижательных значений Mathematica
Когда результаты оценки сбивают с толку, иногда это помогает сбросить шаги оценки в текстовый файл
источник
Можно запустить MathKernel в пакетном режиме, используя недокументированные параметры командной строки
-batchinput
и-batchoutput
:(где
input.m
файл пакетного ввода, заканчивающийся символом новой строки,outputfile.txt
это файл, в который будет перенаправлен вывод).В Mathematica v.> = 6 MathKernel имеет недокументированный параметр командной строки:
который контролирует, будет ли MathKernel иметь видимый значок на панели задач (по крайней мере, под Windows).
FrontEnd (по крайней мере из v.5) имеет недокументированный параметр командной строки
который отключает заставку и позволяет намного быстрее запускать Mathematica FrontEnd
и вариант
который отключает механизм запуска последней установленной версии Mathematica вместо запуска версии, связанной с файлами .nb в системном реестре.
Другой способ сделать это, вероятно, это :
Удобно сочетать последнюю опцию командной строки с настройкой глобальной опции FrontEnd,
VersionedPreferences->True
которая запрещает совместное использование предпочтений между различными установленными версиями Mathematica :(Выше следует оценить в самой последней установленной версии Mathematica .)
В Mathematica 8 это контролируется в диалоговом окне «Установки» на панели «Система» в разделе «Создание и поддержка предпочтений внешнего интерфейса для конкретной версии» .
Получить неполный список параметров командной строки FrontEnd можно с помощью недокументированного ключа
-h
(код для Windows):дает:
Другие варианты включают в себя:
Существуют ли другие потенциально полезные параметры командной строки MathKernel и FrontEnd? Пожалуйста, поделитесь, если знаете.
Смежный вопрос .
источник
-32
и означает, что битность MathKernel, используемая FrontEnd, будет соответствовать битности операционной системы (64 бит). Похоже, что в других случаях эта опция ничего не изменит.Мои любимые хаки - это небольшие макросы, генерирующие код, которые позволяют заменить набор стандартных шаблонных команд одной короткой. Кроме того, вы можете создавать команды для открытия / создания блокнотов.
Вот то, что я использовал некоторое время в моем повседневном рабочем процессе Mathematica. Я часто выполняю следующее:
Делать все это вручную снова и снова - это боль, поэтому давайте автоматизировать! Сначала немного служебного кода:
Теперь давайте создадим макрос, который поместит следующие ячейки в блокнот:
А вот и макрос:
Теперь, когда я набираю,
MyPrivatize[]
это создает частный контекст и загружает мой стандартный пакет. Теперь давайте создадим команду, которая откроет новую блокнотную записку с собственным закрытым контекстом (так что вы сможете взломать ее с полной непринужденностью без риска испортить определения), но иметь доступ к вашим текущим контекстам.Крутая вещь в этом заключается в том, что из-за того
SelfDestruct
, что при запуске команды она не оставляет следов в текущей записной книжке - это хорошо, потому что в противном случае она просто создала бы беспорядок.Для дополнительных стилевых очков вы можете создать триггеры ключевых слов для этих макросов
InputAutoReplacements
, но я оставлю это как упражнение для читателя.источник
Поместить приложение с PageWidth -> Infinity
В Mathematica использование этой
PutAppend
команды является наиболее простым способом сохранить работающий файл журнала с результатами промежуточных вычислений. Но он используетPageWith->78
настройки по умолчанию при экспорте выражений в файл, и поэтому нет гарантии, что каждый промежуточный вывод займет только одну строку в журнале.PutAppend
сам не имеет никаких опций, но отслеживание его оценок показывает, что оно основано наOpenAppend
функции, которая имеетPageWith
опцию, и позволяет изменять ее значение по умолчанию с помощьюSetOptions
команды:Таким образом, мы можем
PutAppend
добавить только одну строку за раз, установив:ОБНОВИТЬ
В версии 10 появилась ошибка (исправлена в версии 11.3):
SetOptions
больше не влияет на поведениеOpenWrite
иOpenAppend
.Обходной путь должен реализовать вашу собственную версию
PutAppend
с явнойPageWidth -> Infinity
опцией:Обратите внимание, что мы также можем реализовать его через,
WriteString
как показано в этом ответе, но в этом случае необходимо будет предварительно преобразовать выражение в соответствующийInputForm
viaToString[expr, InputForm]
.источник
Я просто смотрю через одну из моих пакетов для включения в это, и нашел некоторые сообщения , которые я определил , что творят чудеса:
Debug::<some name>
. По умолчанию они отключены, поэтому не создают больших накладных расходов. Но я могу засорять свой код ими и включать их, если мне нужно точно выяснить, как немного кода ведет себя.источник
Debug
ниTrace
функции, ни функции; это набор сообщений, которые я создал, чтобы я мог засорять свой код для включения / выключения по желанию. Они предваряются словомDebug
, таким же образом, какusage
и название функции, перед MSG. Он обеспечивает ту же функциональность, что и размещение набораcout
операторов в коде c ++.Одна из вещей, которая беспокоит меня о встроенных ограничивающих конструкциях, заключается в том, что они оценивают все определения локальных переменных одновременно, так что вы не можете написать, например,
Итак, некоторое время назад я придумал макрос под названием WithNest, который позволяет вам сделать это. Я нахожу это удобным, так как он позволяет вам хранить локальные привязки переменных без необходимости делать что-то вроде
В конце концов, лучший способ сделать это - использовать специальный символ, чтобы упростить его повторение по списку привязок, и я поместил определение в его собственный пакет, чтобы этот символ был скрыт. Может быть, у кого-то есть более простое решение этой проблемы?
Если вы хотите попробовать это, поместите следующее в файл с именем
Scoping.m
:источник
Этот был написан Альберто Ди Лулло (который, кажется, не в переполнении стека).
CopyToClipboard
, для Mathematica 7 (в Mathematica 8 он встроен)Оригинальный пост: http://forums.wolfram.com/mathgroup/archive/2010/Jun/msg00148.html
Я нашел эту процедуру полезной для копирования больших действительных чисел в буфер обмена в обычной десятичной форме. Например
CopyToClipboard["123456789.12345"]
Cell[OutputFormData@expr]
аккуратно удаляет цитаты.источник
Этот код создает палитру, которая загружает выделение в Stack Exchange как изображение. В Windows предусмотрена дополнительная кнопка, которая обеспечивает более точную визуализацию выбора.
Скопируйте код в ячейку блокнота и оцените. Затем выведите палитру из вывода и установите ее, используя
Palettes -> Install Palette...
Если у вас есть какие-либо проблемы, оставьте комментарий здесь. Загрузите версию для ноутбука здесь .
источник
Я уверен, что многие люди сталкивались с ситуацией, когда они запускали какие-то вещи, понимая, что они не только зависали в программе, но и не сохраняли последние 10 минут!
РЕДАКТИРОВАТЬ
Потерпев некоторое время от этого, я однажды узнал, что можно создать автосохранение из кода Mathematica . Я думаю, что использование такого автосохранения очень помогло мне в прошлом, и я всегда чувствовал, что сама возможность была чем-то, что не многие люди знают, что они могут сделать.
Оригинальный код, который я использовал, находится внизу. Благодаря комментариям я обнаружил, что это проблематично, и что гораздо лучше сделать это альтернативным способом, используя
ScheduledTask
(который будет работать только в Mathematica 8).Код для этого можно найти в этом ответе от
Sjoerd C. de Vries
(поскольку я не уверен, что можно скопировать его здесь, я оставляю его только как ссылку.)Решение ниже использует
Dynamic
. Он будет сохранять ноутбук каждые 60 секунд, но, видимо, только если его ячейка видна . Я оставляю это здесь только по причинам завершения. (и для пользователей Mathematica 6 и 7)/РЕДАКТИРОВАТЬ
Чтобы решить это, я использую этот код в начале блокнота:
Это сохранит вашу работу каждые 60 секунд.
Я предпочитаю это
NotebookAutoSave[]
потому что он экономит до обработки ввода, и потому что некоторые файлы содержат больше текста, чем ввода.Первоначально я нашел это здесь: http://en.wikipedia.org/wiki/Talk:Mathematica#Criticisms
Обратите внимание, что после запуска этой строки сохранение будет происходить, даже если вы закроете и снова откроете свой файл (если включено динамическое обновление).
Кроме того, поскольку в Mathematica нет отмены , будьте осторожны, чтобы не удалить весь ваш контент, поскольку сохранение сделает его необратимым (в качестве меры предосторожности я удаляю этот код из каждой законченной записной книжки)
источник
NotebookSave[SelectedNotebook[], "work-" <> IntegerString[i] <> ".nb"]; i++
, но я думаю, что любой вид ссылки на текущее имя ноутбука станет рекурсивным.Dynamic
объекты обновляются только тогда, когда они видны, поэтому я не уверен, что этот метод будет работать, если, например, вы прокручиваетеDynamic
объект из видимой области. Опять же, я не пробовал. В любом случае, я просто предложил это как предложение.Dynamic[Refresh[i++, UpdateInterval -> 1, TrackedSymbols -> {}]]
. Прокрутите возрастающее число с поля зрения, подождите минуту, прокрутите назад и увидите, что число не увеличивается на 60. ОUpdateInterval
: обычно это используется, если это возможно, но если ваш код содержит переменные, которые изменяются, это изменение вызывает новое обновление до того, как интервал заканчивается. Попробуйте приведенную выше строку безTrackedSymbols
Помните, что Книга Mathematica также доступна в Интернете по адресу http://reference.wolfram.com/legacy/v5_2/, хотя она заменена текущей документацией по адресу http://reference.wolfram.com.
источник
Я считаю очень полезным при разработке пакетов добавлять этот ярлык клавиатуры в мой
SystemFiles/FrontEnd/TextResources/Windows/KeyEventTranslations.tr
файл.Далее для каждого
Packagename.m
я делаюPackagenameTest.nb
блокнот для тестирования, и первые 2 ячейки тестового блокнота устанавливаются как ячейки инициализации. В первую ячейку я положилзагрузить очень полезную библиотеку PackageManipulations, написанную Леонидом. Вторая ячейка содержит
которые все делают фактическую перезагрузку пакета. Обратите внимание, что первые две строки существуют только для
Remove
всех символов, так как мне нравится сохранять контексты максимально чистыми.Тогда рабочий процесс для написания и тестирования пакета становится примерно таким.
Packagename.m
.PackagenameTest.nb
и делайCTRL + ALT + i
.Это заставляет ячейки инициализации перезагружать пакет, что делает тестирование очень простым.
источник
Следующая функция
format[expr_]
может использоваться для отступа / форматирования неформатированныхmathematica
выражений, которые охватывают страницуссылка: /codegolf/3088/indent-a-string-using-given-parentheses
источник
format@RandomInteger[10,{3,3}]
): pastebin.com/nUT54Emq Поскольку у вас уже есть основы, и вы заинтересованы в этом, можете ли вы улучшить код, чтобы произвести удобочитаемое форматирование? Затем следующим шагом будет создание кнопки вставки, которая создаст ячейку ввода с красиво смещенным кодом Mathematica (желательно с сохранением комментариев !!). См. Также мой связанный вопрос .