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 上會如何表現)。