5

Мне нужно отправить много файлов из Mathematica в Octave. Я нашел Lisp Mathematica parser from ~1991, но я не очень хорошо знаком с Lisp, поэтому мне было интересно, есть ли у кого-нибудь опыт портирования в этом направлении. После исследования и отправки письма WolframAlpha и никаких реальных результатов мне пришлось бы использовать Lex и Yacc для создания кросс-компилятора. Для меня это кажется немного чрезмерным.Портирование Mathematica в Octave

Любые советы или указатели будут очень признательны.

Разъяснение:

Я начинаю с большим количеством файлов Mathematica и их функциональность должна быть перенесена на октаву. Я просто хочу достичь этой цели как можно меньше времени, поскольку это задача, которую мой босс дал мне сделать во время праздников. Спасибо за вашу помощь, я посмотрю на FullForm и просмотрю файл Mathematica для непортативного контента. Если вы можете просто конвертировать определенное количество файлов, мне придется делать все остальное вручную, что займет некоторое время. Так что это в основном одно время, чтобы перейти от одной программы к другой.

Как упоминалось в сообщении Леонида, задача кажется чрезмерной, но я ассистент по изучению студентов, и это именно то, что я должен выполнить в своем отделе.

+1

Mathematica и Octave отличаются друг от друга, и я уверен, что автоматическое преобразование невозможно. Можете ли вы более подробно описать, что вам нужно? Анализатор Mathematica в C? Парсер для выражений [FullForm] (http://reference.wolfram.com/mathematica/ref/FullForm.html) относительно прост в написании, и вы можете использовать Mathematica для преобразования всего в FullForm. Но я думаю, что сначала вы должны сделать свой вопрос более ясным. – Szabolcs

+1

Почему это кажется чрезмерным? Если файлы содержат просто простые выражения, они должны быть простыми, иначе это может привести к эффективному повторному внедрению математики в октаве. – acl

ответ

11

Вам не нужен парсер Mathematica для порта. Вам нужно написать свою программу портирования в Mathematica и повторно использовать собственный парсер Mathematica. Это в том же направлении, что и SymbolicC. Если бы я был вами, я бы построил некоторый суб-язык Mathematica (назовите его SymbolicOctave), с полностью инертными головами, а затем напишите функцию, называемую «ToOctaveCodeString». Вы можете проконсультироваться с реализацией SymbolicC, чтобы узнать, как это было сделано для C - доступно в дистрибутиве Mathematica.

Вторая, и самая сложная часть - написать переводчик из подмножества кода Mathematica на это инертное представление SymbolicOctave. Эта часть действительно нетривиальна, потому что (предположительно) язык Mathematica имеет множество функций, которые язык октавы не поддерживает, и вам придется реализовать их в Octave. Здесь вам также понадобится использовать определенные методы для генерации кода Mathematica с помощью Mathematica, один из которых я описал в this answer. Все это предполагает, что у вас есть доступ к Mathematica.

Сказав все это, я бы отказался от общей задачи и просто использовал Mathematica, если есть такой вариант. Задача представляется практически осуществимой только для очень узкого и специального подмножества Mathematica, и даже тогда будет нетривиальной. Если есть возможность связать Mathematica и использовать ее из Octave вместо того, чтобы портировать все на Octave, я бы пошел таким образом (технически это должно быть легко сделать). В то время как стоимость стандартной коммерческой лицензии для полной Mathematica в наши дни довольно низкая (по сравнению с конкурирующими продуктами, особенно имея в виду продукты, похожие на Octave), это может быть лучшим вариантом также в финансовом отношении, учитывая затраты на разработку для создания конвертера что было бы хорошо.

+1

@ Mr.Wizard Спасибо, исправлено. Спасибо также за upvote. –

18

Я работаю как с MATLAB (версия Octave), так и с Mathematica довольно регулярно, и я уверен, что невозможно реализовать парсер/портер, который автоматически преобразуется из Mathematica в другую. Во-первых, MATLAB/Octave не поддерживает сопоставление шаблонов или переписывание терминов или функциональное программирование, все из которых являются наиболее распространенными и оптимальными стилями кодирования в Mathematica.

Для примера рассмотрим чистую функцию (Mathematica)

f = #^2&; 

Там на самом деле не является эквивалентом этого в MATLAB/Octave. Анонимные функции приходят достаточно близко, и вы могли бы написать как (MATLAB/октава)

[email protected](x)x.^2; 

Однако Mathematica будет символически квадрат ничего вы передаете функции, в то время как MATLAB будет работать только на скаляры/векторов/матриц. Поэтому, даже если вы сталкиваетесь с чистой функцией, вы не можете автоматически переписать ее в анонимную функцию, не понимая, что передается чистой функции.

Еще одна концепция, которая отсутствует в MATLAB/Octave, - это ленивая оценка/SetDelayed или := в математике. Так что, если ваша чистая функция была

f := a #^2 &; 

то, f использует значение a в то время, когда f называется. Тем не менее, писать его в качестве анонимной функции:

g = @(x)a*x.^2; 

захватит значение a в момент определения, образуя замыкание. Я обеспечить лучший пример в this answer of mine

Если у вас есть базовый код, написанный в основном в процедурном стиле в Mathematica, то может быть возможным, в теории, чтобы перевести на октаву. Однако мне трудно представить серьезный проект Mathematica, написанный полностью процедурно. Короче говоря, он принимает человек, чтобы перевести логику таким образом, идиоматическое каждому языку


Наконец, если вы пытаетесь просто преобразовать выражения из Mathematica в MATLAB/октаву, то вы можете взять посмотрите на пакет ToMatlab. Я использую это довольно часто, чтобы преобразовать выражения из вычислений в Mathematica для использования в другой базе кода в MATLAB. Простой пример был бы:

expr = Sin[x + x^3] + ArcSin[y]; 
ToMatlab[expr] 
Out[1]= sin(x + x.^3) + asin(y) 
2

Идиоматическим способ генерации коды для менее умелой системы из Mathematica не использовать инструмент третьей стороной (которая должна быть столь же мощной, как ядра системы Mathematica), но использовать Mathematica сам.

Некоторые из генераторов кода такого типа уже доступны из коробки (для C и Fortran), посмотрите, как они реализованы, а затем перенастройте их для Octave/Matlab.

+0

Я согласен в принципе, но для тех, кто еще не знает mma и должен делать это в праздники, это кажется амбициозным, и некоторые вещи просто не могут быть переводимыми (рассмотрите NDSolve). Но я мог ошибаться, я никогда не пробовал. – acl

+0

Я выберу вариант и попытаюсь преобразовать некоторый код, чтобы увидеть, сколько работы было бы для преобразования всего. Затем я вижу, возможно ли это, и может предоставить обратную связь моему боссу. – wikke

+0

@acl, при таком подходе Mathematica не будет преобразовывать все (это абсолютно и явно невозможно), но он может символически решить, что можно решить и создать цифровой алгоритм, подходящий для исполнения с языком низкого уровня (например, C или Matlab). Конечно, вы не можете превратить все вслепую, это должен быть ручной процесс. –