Mathematica CForm output in C++ Programm verwenden



  • Hi,
    also zunaechst moechte ich mich erst einmal hier im Forum als Neuer vorstellen!:)
    Und wie gelingt so etwas besser, als mit einer ersten Nachfrage. Da ich bisher eher mit C als mit C++ zu tun hatte, hab ich mich fuer mein aktuelles Programmiervorhaben zunaechste ein wenig ueber das Klassen- und Vererbungssystem schlau gemacht etc.! ...Ich spar mal die restliche Vorgeschichte!:)

    Nun zum Problem: Zum loesen der Geodaetengleichung (gewoehnliche DGL 2. Ordnung - gekoppelt auf 2 DGL 1. Ordnung umschreibbar) habe ich zunaechst via Mathematica die Christoffelsymbole (siehe, bei Fragen: Allgemeine Relativitaetstheorie (bzw. mathematisch: Diff.geometrie auf Mannigfaltigkeiten) >> Riemannscher Kruemmungstensor oder kovalente Ableitungen) fuer eine normale statische radialsymmetrische Loesung im aeusseren eines schwarzen Loches (in Schwarzschildkoordinaten) bestimmt. Nun wollte ich dieses Ergebnis in C++ uebertragen, also verwendete ich den Befehl "CForm" von Mathematica. Hier entstand nun das Problem. Da ich meine bisherige Routine fuer die Integration der DGL auf die Verwendung einer Matrix ausgelegt habe, kann ich mit der Ausgabe seitens Mathematica gerade nix anfangen. Ich kenne zwar einfach und doppelt verknuepfte Listen, jedoch habe ich die bisher immer (via structures in C) selber programmiert. Ich kenne also den command "List" bzw. was dazu gehoert nicht und bisher nichts wirklich brauchbares gefunden! Deswegen meine bitte an euch: Wie kann ich die folgende Ausgabe von Mathematica in eine Matrix in C++ uebertragen und welche Umgebungen benoetige ich dafuer?
    (PS: der Quellcode fuer die Metric ist dermassen umfangreich, dass ich nur die Struktur angebe! PPS: Ich schreibe gerade auf ner US-Tasta, also nich wundern!:) )

    Out[71]//Cform=
     List(List(List(0,0,0,0),List(0,(2*M*(-Power(r,9)...,0,0),List(...),List(...)),List(...),List(...),List(...))
    

  • Mod

    List ist auch nicht C++, sondern irgendwas von Mathematica. Ich habe (wie du wahrscheinlich selber auch) mal in der mdefs.h von Mathematica geguckt und sinnigerweise wird List dort nicht definiert 😃 .

    Man muss sich also selber etwas schreiben, um den Ausdruck auszuwerten. Ich schätze mal, du willst den Ausdruck hinterher als double-Array haben? Ich schlage dafür einen Präprozessortrick vor:

    #define List(A,B) {A,B}
      double foo[2][2][2]=List(List(List(1,2),List(3,4)),List(List(5,6),List(7,8)));
    
      // wird zu:
      double foo[2][2][2]={{{1,2},{3,4}},{{5,6},{7,8}}};
    

    Probleme:
    a) Du müsstest die Dimensionen des Arrays von Hand anpassen
    b) Womöglich willst du die Matrix in einem anderen Format, beispielsweise als 1D-Array? Bevor ich spekuliere, warte ich aber erstmal auf eine Antwort dazu.



  • Na das sieht doch schon sehr vielversprechend aus! Die Dimensionen anzupassen ist kein problem, da ich stets eine 4x4x4 - Matrix habe! Ich brauche sie auch explizit in der Form, weswegen keine weiteren Formmodulationen stattfinden werden!:)
    Ich werde deinen Vorschlag gleich nachher testen! Im Voraus schonmal vielen Dank!!!:)

    MFG Renscher

    Edit:

    Meine Uebergabe sieht damit wie folgt aus:

    double (*Christoffel[4][4][4])(double x,double y,double z, double r)=List(List(List(0,0,0,
    ...)
    

    Dabei ist die Matrix Christoffel sogleich noch eine Funktion der Variablen x,y,z,r! Dies liegt daran, dass ich sie zu verschiedenen Zeiten t auswerte und natuerlich dabei meine beobachteten Wellen propagieren!
    Soweit so gut?



  • Renscher schrieb:

    Wie kann ich die folgende Ausgabe von Mathematica in eine Matrix in C++ uebertragen und welche Umgebungen benoetige ich dafuer?

    Hallo Renscher,

    ich stand eines Tages auch vor solchen Problemen weil ich auch gerne noch aus dem Studium Mathematica genutzt habe. Mathematica ist in der Hinsicht (C-Code) noch in Kinderschuhen. CForm selbst arbeitet mit den grundlegenden Befehlen. Selbst diese werden manchmal falsch angegeben. Damals habe ich eine weile gesucht und bin auf folgenden drei Sachen gestoßen die ich heute immer noch verwende:

    LAPACK (http://www.netlib.org/lapack/)
    Ist zwar FORTRAN Code, lässt sich dennoch fast ohne Umwege in C nutzen. Kostenlos, zu finden sind auch C ports.. würde ich jedoch nicht verwenden.

    Intel MKL (http://software.intel.com/en-us/intel-mkl/)
    In Kombination mit dem Intel Compiler ist es meiner Meinung nach wohl das zweitbeste und das mit Abstand schnellste Werkzeugpaket für das wissenschaftliche Rechnen. Hat ein internes C-Wrapper für LAPACK. Außerdem hat es sehr bequeme Werkzeuge wie PARDISO/FFT Bibliotheken.. etc...

    MATLAB (http://www.mathworks.de/)
    Ist meiner Meinung nach das einfachste und das beste Programm zum Rechnen. Kann beliebige C Bibliotheken exportieren.

    Mein Tipp: Löse dich von Mathematica wenn du C/C++ nutzt. Schade eigentlich dass man in dieser Hinsicht schläft, es ist ein absolut klasse Programm.



  • Ersma danke an alle fuer die guten Informationen!:)
    @Darkfate: Das war mir auch schon bewusst und habe auch schon einiges mit MATLAB programmiert (und die schon vorhandenen Metaroutinen sind wirklich toll), aber wollte halt nen bissl mich mal mit C++ beschaeftigen!:)

    Es hat alles wie erklaert geklappt und damit gilt das Problem als geloest!

    DANKE!


Anmelden zum Antworten