Я работаю с MATLAB (версия Octave для $$$$) и Mathematica довольно регулярно, и я чертовски уверен, что невозможно реализовать парсер / переносчик, который автоматически конвертирует Mathematica в другой.Для начала, MATLAB / Octave не поддерживает сопоставление с образцом, переписывание терминов или функциональное программирование, все из которых являются наиболее распространенными и оптимальными стилями кодирования в Mathematica.
Например, рассмотрим чистую функцию (Mathematica)
f = #^2&;
Этого нет в MATLAB / Octave.Анонимные функции достаточно близки, и вы можете написать это как (MATLAB / Octave)
g=@(x)x.^2;
Однако Mathematica будет символически квадратировать все, что вы передадите в функцию, тогда как MATLAB будет работать только наскаляры / векторы / матрицы.Поэтому, даже если вы сталкиваетесь с чистой функцией, вы не можете автоматически переписать ее в анонимную функцию, не понимая, что передается чистой функции.
Другая концепция, которая отсутствует в MATLAB / Octave, - это концепция lazy.оценка / SetDelayed
или :=
в Mathematica.Поэтому, если ваша чистая функция была
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)