5 Stimmen

Portierung von Mathematica nach Octave

Ich muss eine Menge von Dateien von Mathematica nach Octave portieren. Ich habe ein Lisp-Mathematica-Parser aus ~1991 aber ich bin nicht wirklich vertraut mit Lisp, so dass ich mich frage, ob jemand Erfahrung mit der Portierung in diese Richtung hat. Nachdem ich recherchiert und eine E-Mail an WolframAlpha geschickt habe und keine wirklichen Ergebnisse erhalten habe, müsste ich Lex und Yacc verwenden, um einen Cross-Compiler zu erstellen. Das erscheint mir ein wenig übertrieben.

Für Tipps und Hinweise wären wir Ihnen sehr dankbar.

Klarstellung:

Ich beginne mit einer Reihe von Mathematica-Dateien, deren Funktionalität nach Octave portiert werden muss. Ich möchte dieses Ziel in möglichst kurzer Zeit erreichen, da mein Chef mir diese Aufgabe über die Feiertage übertragen hat. Danke für Ihre Hilfe, ich werde mir FullForm ansehen und die Mathematica-Datei auf nicht portierbare Inhalte untersuchen. Wenn es nur möglich ist, eine bestimmte Menge der Dateien zu konvertieren, müsste ich den Rest von Hand machen, was einige Zeit in Anspruch nehmen würde. Es handelt sich also im Grunde um eine einmalige Sache, um von einem Programm zum anderen zu wechseln.

Wie in Leonids Beitrag erwähnt, scheint die Aufgabe übertrieben zu sein, aber ich bin eine studentische Hilfskraft und das ist genau die Aufgabe, die ich in meiner Abteilung zu erledigen habe.

18voto

abcd Punkte 41265

Ich arbeite regelmäßig sowohl mit MATLAB (der $$$$ Version von Octave) als auch mit Mathematica, und ich bin mir ziemlich sicher, dass es unmöglich ist, einen Parser/Porter zu implementieren, der automatisch von Mathematica in das jeweils andere Programm konvertiert. Zunächst einmal unterstützt MATLAB/Octave kein Pattern-Matching, kein Umschreiben von Begriffen und keine funktionale Programmierung - allesamt die gängigsten und besten Codierungsstile in Mathematica.

Betrachten wir zum Beispiel die reine Funktion (Mathematica)

f = #^2&;

In MATLAB/Octave gibt es dafür keine Entsprechung. Anonyme Funktionen kommen dem nahe genug, und man könnte sie schreiben als (MATLAB/Octave)

g=@(x)x.^2;

Mathematica wird jedoch symbolisch quadrieren alles die Sie an die Funktion übergeben, während MATLAB nur mit Skalaren/Vektoren/Matrizen arbeitet. Selbst wenn Sie also auf eine reine Funktion stoßen, können Sie sie nicht automatisch in eine anonyme Funktion umschreiben, ohne zu verstehen, was an die reine Funktion übergeben wird.

Ein weiteres Konzept, das in MATLAB/Octave fehlt, ist das der lazy evaluation/ SetDelayed o := in Mathematica. Wenn Ihre reine Funktion also wäre

f := a #^2 &;

dann, f verwendet den Wert von a zu dem Zeitpunkt, als f genannt wird. Wenn man sie jedoch als anonyme Funktion schreibt:

g = @(x)a*x.^2;

erfasst den Wert von a zum Zeitpunkt der Definition und bilden einen Abschluss. Ein besseres Beispiel finde ich in Diese Antwort von mir

Wenn Sie eine Code-Basis haben, die hauptsächlich in einem prozeduralen Stil in Mathematica geschrieben ist, dann ist es könnte theoretisch möglich sein, in die Oktave zu übersetzen. Es fällt mir jedoch schwer, mir ein ernsthaftes Mathematica-Projekt vorzustellen, das vollständig prozedural geschrieben ist. Kurz gesagt, es braucht einen Menschen, um die Logik in einer für jede Sprache idiomatischen Weise zu übersetzen


Wenn Sie nur Ausdrücke von Mathematica nach MATLAB/Octave konvertieren möchten, sollten Sie sich die Funktion ToMatlab Paket. Ich verwende es recht häufig, um Ausdrücke aus Berechnungen in Mathematica für die Verwendung in einer anderen Codebasis in MATLAB zu konvertieren. Ein einfaches Beispiel wäre:

expr = Sin[x + x^3] + ArcSin[y];
ToMatlab[expr]
Out[1]= sin(x + x.^3) + asin(y)

11voto

Leonid Shifrin Punkte 22309

Für die Portierung benötigen Sie keinen Mathematica-Parser. Sie müssen Ihr Portierungsprogramm in Mathematica schreiben und den Mathematica-eigenen Parser wiederverwenden. Dies geht in dieselbe Richtung wie SymbolicC . Wenn ich an Ihrer Stelle wäre, würde ich eine Untersprache für Mathematica entwickeln (nennen Sie sie SymbolicOctave ), mit völlig inerten Köpfen, und schreiben Sie dann eine Funktion namens ToOctaveCodeString . Sie können die Implementierung von SymbolicC um zu sehen, wie dies für C gemacht wurde - es ist in der Mathematica-Distribution verfügbar.

Der zweite und komplizierteste Teil besteht darin, einen Übersetzer für die Teilmenge des Mathematica-Codes zu schreiben, der diesen inerten SymbolicOctave Vertretung. Dieser Teil ist wirklich nicht trivial, da die Sprache Mathematica (vermutlich) viele Funktionen hat, die Octave nicht von Haus aus unterstützt, und Sie müssen diese in Octave implementieren. Hier müssen Sie auch bestimmte Techniken anwenden, um Mathematica-Code mit Mathematica zu erzeugen, von denen ich eine in 本答 . Dies alles setzt voraus, dass Sie Zugang zu Mathematica haben.

Nach all dem würde ich die allgemeine Aufgabe aufgeben und einfach Mathematica verwenden, wenn es eine solche Möglichkeit gibt. Die Aufgabe scheint nur für eine sehr enge und spezifische Teilmenge von Mathematica überhaupt machbar zu sein, und selbst dann wäre sie nicht trivial. Wenn es eine Möglichkeit gibt, Mathematica zu verknüpfen und von Octave aus zu benutzen, anstatt alles nach Octave zu portieren, würde ich diesen Weg gehen (technisch sollte das einfach zu machen sein). Da selbst die Kosten für eine kommerzielle Lizenz für Mathematica heutzutage recht niedrig sind (im Vergleich zu den Konkurrenzprodukten, insbesondere mit Blick auf ähnliche Produkte wie Octave), könnte dies auch finanziell die bessere Option sein, wenn man die Entwicklungskosten für einen guten Konverter berücksichtigt.

2voto

SK-logic Punkte 9388

Ein idiomatischer Weg, einen Code für ein weniger leistungsfähiges System aus Mathematica zu generieren, besteht nicht darin, ein Werkzeug eines Drittanbieters zu verwenden (das genauso leistungsfähig sein sollte wie der Mathematica-Kern), sondern Mathematica selbst zu verwenden.

Einige der Codegeneratoren dieser Art sind bereits verfügbar (für C und Fortran). Schauen Sie sich an, wie sie implementiert sind, und richten Sie sie dann auf Octave/Matlab aus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X