Mathematica.jl
包提供了使用 Julia 语言的 Wolfram Mathematica™ 的接口。如果没有从 Wolfram Research 购买并安装 Mathematica™ 副本,则无法使用Mathematica.jl
。该软件包免费提供,并且绝不会取代或改变 Wolfram Mathematica 产品的任何功能。
该软件包提供了一个无障碍的 Mathematica Julia 接口。它旨在遵循 Julia 的理念,即在不牺牲低级优化的情况下结合高级表达能力。
Pkg . add ( " Mathematica " )
如果安装了 Mathematica,它的用法就很简单:
using Mathematica
Fibonacci ( 1000 )
#= > 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
Mathematica 的所有函数都可以作为函数和宏使用,并且拼接 ( $
) 可以按照您的预期工作:
Integrate (:(x ^ 2 ), :x ) # or
@Integrate (x ^ 2 , x)
#= > :(*(1//3,^(x,3)))
@Integrate(log(x), {x,0,2})
#= > :(+(-2,log(4)))
eval(ans) # or
@N($ans) # or
N(ans) # or
@N(Integrate(log(x), {x,0,2}))
#= > -0.6137056388801094
包括那些返回 Mathematica 数据的:
@Plot (x ^ 2 , {x, 0 , 2 })
#= > Graphics[{{{},{},{Hue[0.67, 0.6, 0.6],Line[{{4.081632653061224e-8,1.6659725114535607e-15},...}]}}}, {:AspectRatio->Power[:GoldenRatio, -1],:Axes->true, ...}]
数学数据可以直接参与 Julia 函数,无需包装。例如 -
using MathLink
d = BinomialDistribution ( 10 , 0.2 ) #= > BinomialDistribution[10, 0.2]
probability(b::MExpr{:BinomialDistribution}) = b.args[2]
probability(d) #= > 0.2
Julia 兼容的数据(例如列表、复数等)都会自动转换,并且您可以将转换扩展到其他类型。
请注意,默认情况下,Mathematica 表达式不会转换为 Julia 表达式。带有::Expr
提示的函数/宏(见下文)将转换其结果,但对于其他函数/宏,您必须使用convert
或MathLink.to_expr
。
Log ( - 1 ) #= > Times[0 + 1im, :Pi]
convert(Expr, ans) #= > :(*(0 + 1im,Pi))
N(Log(-1)) #= > 0.0 + 3.141592653589793im
还支持打印和警告:
Print ( " hi " )
#= > hi
@Print(x^2/3)
#= > 2
# x
# --
# 3
Binomial(10)
#= > WARNING: Binomial::argr: Binomial called with 1 argument; 2 arguments are expected.
#= > Binomial[10]
最后,当然:
WolframAlpha ( " hi " ) #= >
2-element Array{Any,1}:
{{"Input",1},"Plaintext"}->"Hello."
{{"Result",1},"Plaintext"}->"Hello, human."
在文件Mathematica.jl
中,您将看到函数和宏规范的列表,每个规范都采用以下格式之一:
Function :: ReturnType # or
Function (Arg1Type, Arg2Type, ... ) :: ReturnType # (functions only)
例如:
Integrate :: Expr
RandomReal (Number) :: Float64
RandomReal (Number, Integer) :: Vector{Float64}
这里的返回类型提示是一种优化;它允许MathLink.jl
从 Mathematica 获取值,而无需先进行类型检查,并使函数类型稳定 - 例如,如果没有此定义, RandomReal(10, 5)
将返回Any
数组。参数类型允许类型检查和多重定义。
目前还没有多少函数具有类型签名,因此为您想要使用的函数提供类型签名是一种简单的贡献方法。
Mathematica 数据表达式Head[x,y,z,...]
在 Julia 中表示为MExpr{:Head}(args = {x,y,z,...})
。我们可以通过重载MathLink.to_mma
和MathLink.from_mma
来扩展Mathematica.jl
以支持自定义类型。
例如,我们可以直接通过 Mathematica 传递 Julia Dict,只需两行定义:
using MathLink; import MathLink : to_mma, from_mma
d = [ :a => 1 , :b => 2 ]
to_mma (d :: Dict ) = MExpr {:Dict} ( map (x -> MExpr ( :Rule , x[ 1 ], x[ 2 ]),d))
Identity (d) #= > Dict[:b->2, :a->1]
from_mma(d::MExpr{:Dict}) = Dict(map(x->x.args[1], d.args), map(x->x.args[2], d.args))
Identity(d) #= > {:b=>2,:a=>1}
using Mathematica
只要任一math
在路径上(在 Linux 上通常如此),这应该有效。 Mathematica.jl
还将在 Windows 上查找math.exe
,这应该适用于安装在默认位置的 Mathematica 版本 8 或 9。如果它不适合你,请提出一个问题(特别是我不知道这在 Mac 上会如何表现)。