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
拡張できます。
たとえば、たった 2 行の定義を使用して、Julia Dict を Mathematica に直接渡すことができます。
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 では true)。 Mathematica.jl
Windows 上のmath.exe
も検索します。これはデフォルトの場所にインストールされている Mathematica バージョン 8 または 9 で動作するはずです。問題が解決しない場合は、問題を報告してください (特に Mac でこれがどのように動作するかはわかりません)。