Портирование Mathematica в Октаву
Я должен перенести много файлов из Mathematica в Octave. Я нашел парсер Lisp Mathematica с 1991 года, но я не очень знаком с Lisp, поэтому мне было интересно, есть ли у кого-нибудь опыт работы с портированием в этом направлении. После исследования и отправки электронного письма в WolframAlpha, но без реальных результатов, мне пришлось бы использовать Lex и Yacc для создания кросс-компилятора. Это кажется немного чрезмерным для меня.
Любые намеки или указатели будут с благодарностью.
Разъяснение:
Я начинаю со многих файлов Mathematica, и их функциональность должна быть перенесена в Octave. Я просто хочу достичь этой цели в кратчайшие сроки, так как это задача, которую мой босс дал мне выполнить в праздничные дни. Спасибо за вашу помощь, я посмотрю на FullForm и проверю файл Mathematica на непереносимый контент. Если возможно просто преобразовать определенное количество файлов, я бы сделал все остальное вручную, что займет некоторое время. Так что это в основном разовая вещь для перехода от одной программы к другой.
Как упоминалось в сообщении Леонида, задача кажется чрезмерной, но я студент-исследователь, и это именно та задача, которую я должен выполнить на своем факультете.
3 ответа
Я довольно регулярно работаю как с MATLAB (версия Octave для $$$$), так и с Mathematica, и я чертовски уверен, что невозможно реализовать парсер / переносчик, который автоматически конвертирует Mathematica в другой. Для начала, MATLAB/Octave не поддерживает сопоставление с образцом, переписывание терминов или функциональное программирование, которые являются наиболее распространенными и оптимальными стилями кодирования в Mathematica.
Например, рассмотрим чистую функцию (Mathematica)
f = #^2&;
Этого нет в MATLAB/Octave. Анонимные функции достаточно близки, и вы могли бы написать это как (MATLAB/Octave)
g=@(x)x.^2;
Тем не менее, Mathematica будет символически возводить в квадрат все, что вы передадите в функцию, тогда как MATLAB будет работать только со скалярами / векторами / матрицами. Поэтому, даже если вы встретите чистую функцию, вы не сможете автоматически переписать ее в анонимную функцию, не понимая, что передается чистой функции.
Еще одна концепция, которая отсутствует в MATLAB/Octave, - это ленивая оценка / SetDelayed
или же :=
в математике. Так что если ваша чистая функция была
f := a #^2 &;
затем, f
использует значение a
в то время, когда f
называется. Однако, записав это как анонимную функцию:
g = @(x)a*x.^2;
будет захватывать значение a
во время определения, образуя замыкание. Я приведу лучший пример в этом моем ответе
Если у вас есть кодовая база, которая написана в Mathematica в процедурном стиле, то теоретически можно перевести на октаву. Однако мне трудно представить серьезный проект Mathematica, написанный полностью процедурным образом. Короче говоря, человеку нужно перевести логику идиоматически для каждого языка.
Наконец, если вы пытаетесь просто преобразовать выражения из Mathematica в MATLAB/Octave, то вы можете взглянуть на ToMatlab
пакет. Я использую это довольно часто для преобразования выражений из вычислений в Mathematica для использования в другой кодовой базе в MATLAB. Простой пример будет:
expr = Sin[x + x^3] + ArcSin[y];
ToMatlab[expr]
Out[1]= sin(x + x.^3) + asin(y)
Вам не нужен Mathematica парсер для переноса. Вам нужно написать свою программу переноса в Mathematica и повторно использовать собственный анализатор Mathematica. Это в том же направлении, что и SymbolicC
, Если бы я был тобой, я бы построил некоторый подъязык Mathematica (назови его SymbolicOctave
), с полностью инертными головами, а затем написать функцию под названием скажем ToOctaveCodeString
, Вы можете проконсультироваться о реализации SymbolicC
чтобы увидеть, как это было сделано для C - он доступен в дистрибутиве Mathematica.
Вторая и самая сложная часть заключается в написании переводчика из подмножества кода Mathematica в этот инертный SymbolicOctave
представление. Эта часть действительно нетривиальна, потому что (по-видимому) язык Mathematica имеет много функций, которые язык Octave не поддерживает изначально, и вам придется реализовать их в Octave. Здесь вам также понадобится использовать определенные методы для генерации кода Mathematica с помощью Mathematica, один из которых я описал в этом ответе. Все это предполагает, что у вас есть доступ к Mathematica.
Сказав все это, я бы отказался от общей задачи и просто использовал Mathematica, если есть такая возможность. Задача кажется где-либо выполнимой только для очень узкого и специфического подмножества Mathematica, и даже тогда она была бы нетривиальной. Если есть возможность связать Mathematica и использовать его из Octave вместо того, чтобы переносить все в Octave, я бы пошел по этому пути (технически это должно быть легко сделать). Учитывая, что стоимость даже коммерческой лицензии на полную версию Mathematica в настоящее время довольно низкая (по сравнению с конкурирующими продуктами, особенно с учетом продуктов, подобных Octave), этот вариант вполне может быть финансово лучшим вариантом, учитывая затраты на разработку для создания конвертера. что было бы хорошо.
Идиоматический способ генерации кода для менее способной системы из Mathematica состоит не в использовании стороннего инструмента (который должен быть столь же мощным, как ядро Mathematica), а в использовании самой Mathematica.
Некоторые из генераторов кода такого рода уже доступны из коробки (для C и Fortran), посмотрите, как они реализованы, а затем перенастройте их для Octave/Matlab.