我必须将很多文件从Mathematica移植到Octave。 我找到了Lisp Mathematica parser from ~1991,但我对Lisp并不熟悉,所以我想知道是否有人有任何移植方向的经验。 在研究并向WolframAlpha发送电子邮件并且没有实际结果之后,我将不得不使用Lex和Yacc来生成交叉编译器。这对我来说似乎有些过分。
任何提示或指示都将不胜感激。
澄清:
我从很多Mathematica文件开始,他们的功能必须移植到Octave。我只想在尽可能短的时间内实现这一目标,因为这是我老板在节假日期间给我做的一项任务。 感谢您的帮助,我将查看FullForm并检查Mathematica文件中的非便携式内容。 如果只能转换一定数量的文件,我将不得不手工完成其余的工作,这需要一些时间。因此,从一个程序转移到另一个程序基本上是一次性的事情。
正如Leonid的帖子所述,任务似乎过多,但我是学生研究助理,这正是我必须在我的部门完成的任务。
答案 0 :(得分:18)
我经常使用MATLAB(Octave的$$$$版本)和Mathematica,我非常有信心不可能实现自动从Mathematica转换到另一个的解析器/移植器。对于初学者,MATLAB / Octave不支持模式匹配或术语重写或函数编程,所有这些都是Mathematica中最常见和最优的编码风格。
例如,考虑纯函数(Mathematica)
f = #^2&;
在MATLAB / Octave中确实没有相应的东西。匿名函数足够接近你可以把它写成(MATLAB / Octave)
g=@(x)x.^2;
但是,Mathematica将象征性地将任何传递给函数,而MATLAB只能用于标量/向量/矩阵。因此,即使您遇到纯函数,也无法在不了解传递给纯函数的内容的情况下自动将其重写为匿名函数。
MATLAB / Octave中缺少的另一个概念是mathematica中的延迟评估/ SetDelayed
或:=
。所以如果你的纯函数是
f := a #^2 &;
然后,f
在调用a
时使用f
的值。但是,将其写为匿名函数:
g = @(x)a*x.^2;
将在定义时捕获a
的值,形成闭包。我在this answer of mine
如果您的代码库主要以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)
答案 1 :(得分:11)
您不需要Mathematica解析器来移植。您需要在Mathematica中编写移植程序并重用Mathematica自己的解析器。这与SymbolicC
的方向相同。如果我是你,我将构建一些Mathematica子语言(称之为SymbolicOctave
),使用完全惰性的头,然后编写一个名为say ToOctaveCodeString
的函数。您可以参考SymbolicC
的实现来了解如何为C完成此操作 - 它可以在Mathematica发行版中使用。
第二个也是最复杂的部分是将Mathematica代码子集中的翻译器写入这个惰性SymbolicOctave
表示。这部分非常简单,因为(大概)Mathematica语言有许多Octave语言本身不支持的功能,你必须在Octave中实现它们。在这里,您还需要使用某些技术来生成Mathematica Mathematica代码,其中一个我在this answer中描述过。这一切都假设您可以访问Mathematica。
说了这么多,如果有这样的选择,我会放弃一般任务,只使用Mathematica。这项任务似乎只适用于Mathematica的一个非常狭窄和特定的子集,即使这样也是非平凡的。如果有一个选项链接Mathematica并使用Octave而不是将所有内容移植到Octave,我就会这样(技术上这应该很容易)。鉴于现在Mathematica的商业许可证成本相当低(与竞争产品相比,特别是考虑到与Octave类似的产品),考虑到开发转换器的开发成本,它在财务上也可能是更好的选择。这将是任何好事。
答案 2 :(得分:2)
从Mathematica为功能较弱的系统生成代码的惯用方法不是使用第三方工具(应该像Mathematica核心一样强大),而是使用Mathematica本身。
这种代码生成器已经开箱即用(对于C和Fortran),看看它们是如何实现的,然后重新定位它们用于Octave / Matlab。