Das Mathematica.jl
-Paket bietet eine Schnittstelle für die Verwendung von Wolfram Mathematica™ aus der Julia-Sprache. Sie können Mathematica.jl
nicht verwenden, ohne eine Kopie von Mathematica™ von Wolfram Research gekauft und installiert zu haben. Dieses Paket ist kostenlos erhältlich und ersetzt oder verändert in keiner Weise die Funktionalität von Wolframs Mathematica-Produkt.
Das Paket bietet eine unkomplizierte Julia-Schnittstelle zu Mathematica. Ziel ist es, Julias Philosophie zu folgen, Ausdruckskraft auf hohem Niveau zu kombinieren, ohne auf Optimierung auf niedrigem Niveau zu verzichten.
Pkg . add ( " Mathematica " )
Vorausgesetzt, Mathematica ist installiert, ist die Verwendung so einfach wie:
using Mathematica
Fibonacci ( 1000 )
#= > 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
Alle Funktionen von Mathematica sind sowohl als Funktionen als auch als Makros verfügbar, und das Splicing ( $
) funktioniert wie erwartet:
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
Einschließlich derjenigen, die Mathematica-Daten zurückgeben:
@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, ...}]
Mathematische Daten können direkt an Julia-Funktionen beteiligt sein, ohne dass ein Umbruch erforderlich ist. Zum Beispiel -
using MathLink
d = BinomialDistribution ( 10 , 0.2 ) #= > BinomialDistribution[10, 0.2]
probability(b::MExpr{:BinomialDistribution}) = b.args[2]
probability(d) #= > 0.2
Julia-kompatible Daten (z. B. Listen, komplexe Zahlen usw.) werden alle automatisch konvertiert, und Sie können die Konvertierung auf andere Typen erweitern.
Beachten Sie, dass Mathematica-Ausdrücke standardmäßig nicht in Julia-Ausdrücke konvertiert werden. Funktionen/Makros mit dem ::Expr
Hinweis (siehe unten) konvertieren ihr Ergebnis, für andere müssen Sie jedoch convert
oder MathLink.to_expr
verwenden.
Log ( - 1 ) #= > Times[0 + 1im, :Pi]
convert(Expr, ans) #= > :(*(0 + 1im,Pi))
N(Log(-1)) #= > 0.0 + 3.141592653589793im
Drucken und Warnungen werden ebenfalls unterstützt:
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]
Abschließend natürlich:
WolframAlpha ( " hi " ) #= >
2-element Array{Any,1}:
{{"Input",1},"Plaintext"}->"Hello."
{{"Result",1},"Plaintext"}->"Hello, human."
In der Datei Mathematica.jl
sehen Sie eine Liste von Funktions- und Makrospezifikationen, jeweils in einem dieser Formate:
Function :: ReturnType # or
Function (Arg1Type, Arg2Type, ... ) :: ReturnType # (functions only)
Zum Beispiel:
Integrate :: Expr
RandomReal (Number) :: Float64
RandomReal (Number, Integer) :: Vector{Float64}
Der Rückgabetyphinweis hier ist eine Optimierung; Es ermöglicht MathLink.jl
den Wert von Mathematica abzurufen, ohne zuerst eine Typprüfung durchzuführen, und macht den Funktionstyp stabil – zum Beispiel würde RandomReal(10, 5)
ohne diese Definition ein Any
Array zurückgeben. Die Argumenttypen ermöglichen eine Typprüfung und mehrere Definitionen.
Da noch nicht viele Funktionen über Typsignaturen verfügen, ist die Bereitstellung dieser für die Funktionen, die Sie verwenden möchten, eine einfache Möglichkeit, einen Beitrag zu leisten.
Der Mathematica-Datenausdruck Head[x,y,z,...]
wird in Julia als MExpr{:Head}(args = {x,y,z,...})
dargestellt. Wir können Mathematica.jl
erweitern, um benutzerdefinierte Typen zu unterstützen, indem wir MathLink.to_mma
und MathLink.from_mma
überladen.
Zum Beispiel können wir ein Julia Dict mit nur zwei Definitionszeilen direkt durch Mathematica weiterleiten:
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
Dies sollte funktionieren, solange eine der beiden math
auf dem Pfad vorhanden ist (normalerweise unter Linux). Mathematica.jl
sucht auch unter Windows nach math.exe
, was für Mathematica-Versionen 8 oder 9 funktionieren sollte, die an Standardspeicherorten installiert sind. Wenn es bei Ihnen nicht funktioniert, öffnen Sie ein Problem (insbesondere weiß ich nicht, wie sich das auf Macs verhält).