5

Devo portare un sacco di file da Mathematica a Octave. Ho trovato un Lisp Mathematica parser from ~1991 ma non ho molta familiarità con Lisp, quindi mi chiedevo se qualcuno avesse qualche esperienza con il porting in questa direzione. Dopo aver ricercato e inviato una mail a WolframAlpha e nessun risultato reale avrei dovuto usare Lex e Yacc per produrre un cross-compilatore. Questo mi sembra un po 'eccessivo.Porting Mathematica to Octave

Qualsiasi suggerimento o suggerimento sarebbe molto apprezzato.

Chiarimento:

sto iniziando con un sacco di file di Mathematica e la loro funzionalità deve essere portato su Octave. Voglio solo raggiungere questo obiettivo nel minor tempo possibile, dato che questo è un compito che il mio capo mi ha affidato durante le vacanze. Grazie per il vostro aiuto, esaminerò FullForm ed esaminerò il file Mathematica per contenuti non portatili. Se è solo possibile convertire una certa quantità di file, dovrei fare il resto a mano, il che richiederebbe un po 'di tempo. Quindi questa è fondamentalmente una cosa una tantum per passare da un programma all'altro.

Come menzionato nel post di Leonid, il compito sembra eccessivo ma sono un assistente di ricerca studentesco e questo è esattamente il compito che devo completare nel mio dipartimento.

+1

Mathematica e Octave sono abbastanza diversi da essere sicuro che la conversione automatica è impossibile. Puoi descrivere più in dettaglio di cosa hai bisogno? Un parser Mathematica in C? Un parser per le espressioni [FullForm] (http://reference.wolfram.com/mathematica/ref/FullForm.html) è relativamente facile da scrivere e puoi usare Mathematica per convertire tutto in FullForm. Ma penso che dovresti chiarire prima la tua domanda. – Szabolcs

+1

Perché sembra eccessivo? Se i file contengono solo espressioni semplici, dovrebbe essere semplice, altrimenti potrebbe essere necessario implementare in modo efficace la matematica in ottava. – acl

risposta

11

Non è necessario il parser Mathematica su porta. Devi scrivere il tuo programma di porting in Mathematica e riutilizzare il parser di Mathematica. Questo è nella stessa direzione di SymbolicC. Se fossi in te, costruirò una sotto-lingua Mathematica (chiamiamola SymbolicOctave), con teste completamente inerte, e poi scriverò una funzione chiamata say ToOctaveCodeString. È possibile consultare l'implementazione di SymbolicC per vedere come è stato fatto per C - è disponibile all'interno della distribuzione Mathematica.

La seconda, e la parte più complicata, sarebbe quella di scrivere un traduttore dal sottoinsieme del codice Mathematica a questa rappresentazione inerte SymbolicOctave. Questa parte è davvero non banale, perché (presumibilmente) il linguaggio Mathematica ha molte caratteristiche che il linguaggio Octave non supporta nativamente, e dovrai implementarle in Octave. Qui dovrai anche utilizzare determinate tecniche per generare codice Mathematica con Mathematica, una delle quali ho descritto in this answer. Tutto questo presuppone che tu abbia accesso a Mathematica.

Detto questo, rinuncerei all'attività generale e userei semplicemente Mathematica, se esiste tale opzione. Il compito sembra ovunque fattibile solo per un sottogruppo di Mathematica molto ristretto e specifico, e anche in questo caso non sarebbe banale. Se esiste un'opzione per collegare Mathematica e usarla da Octave invece di eseguire il porting di tutto su Octave, andrei in quel modo (tecnicamente sarebbe facile farlo). Con il costo della licenza commerciale anche per Mathematica completa che è piuttosto bassa in questi giorni (rispetto ai prodotti concorrenti, in particolare avendo in mente prodotti simili a Octave), potrebbe essere un'opzione migliore anche finanziariamente, dati i costi di sviluppo per creare un convertitore quale sarebbe un bene.

+1

@ Mr.Wizard Grazie, corretto. Grazie anche per un upvote. –

18

Io lavoro con MATLAB (la versione $$$$ di Octave) e Mathematica abbastanza regolarmente, e sono abbastanza sicuro che sia impossibile implementare un parser/porter che converta automaticamente da Mathematica all'altra. Per i principianti, MATLAB/Octave non supporta la corrispondenza dei pattern o la riscrittura dei termini o la programmazione funzionale, che sono tutti gli stili di codifica più comuni e ottimali in Mathematica.

Ad esempio, si consideri la funzione puro (Mathematica)

f = #^2&; 

In realtà non è un equivalente di questo in MATLAB/Octave. funzioni anonime arrivano abbastanza vicino e si potrebbe scrivere come (MATLAB/Octave)

[email protected](x)x.^2; 

Tuttavia, Mathematica sarà simbolicamente piazza nulla si passa alla funzione, mentre MATLAB funziona solo su scalari/vettori/matrici. Quindi, anche se ti imbatti in una funzione pura, non puoi automaticamente riscriverla in una funzione anonima senza capire cosa viene passato alla funzione pura.

Un altro concetto che manca in MATLAB/Octave è quello di valutazione lazy/SetDelayed o := in matematica. Quindi, se la vostra funzione pura era

f := a #^2 &; 

poi, f utilizza il valore della a nel momento in cui f si chiama. Tuttavia, la scrittura come una funzione anonima:

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

catturerà il valore della a al momento della definizione, formando una chiusura. I fornire un esempio migliore in this answer of mine

Se si dispone di una base di codice che è scritto principalmente in un procedurale Mathematica, allora potrebbe essere possibile, in teoria, per tradurre in ottava. Tuttavia, ho difficoltà a immaginare un serio progetto Mathematica scritto interamente in modo procedurale. Insomma, ci vuole un essere umano di tradurre la logica in modo idiomatico per ogni lingua


Infine, se si sta cercando di convertire solo le espressioni da Mathematica a MATLAB/Octave, allora si potrebbe desiderare di prendere una guarda il pacchetto ToMatlab. Lo uso abbastanza spesso, per convertire espressioni da calcoli in Mathematica per l'uso in una base di codice diversa in MATLAB. Un semplice esempio potrebbe essere:

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

Un modo idiomatica di generare un codice per un sistema meno capace di Mathematica non è quello di utilizzare uno strumento di terzi (che dovrebbe essere potente come nucleo Mathematica), ma di utilizzare Mathematica si.

Alcuni dei generatori di codice di questo tipo sono già disponibili fuori dalla scatola (per C e Fortran), dare un'occhiata a come sono implementati e quindi retargetarli per Octave/Matlab.

+0

Sono d'accordo in linea di principio, ma per qualcuno che non conosce già mma e deve farlo durante le vacanze questo sembra troppo ambizioso, e alcune cose potrebbero semplicemente non essere traducibili (si consideri NDSolve). Ma potrei sbagliarmi, non ho mai provato. – acl

+0

Sceglierò un'opzione e proveremo a convertire del codice per vedere quanto lavoro sarebbe necessario per convertire tutto. Quindi posso vedere se è persino possibile e posso fornire feedback al mio capo. – wikke

+0

@acl, con questo approccio Mathematica non converte tutto (è assolutamente e chiaramente impossibile), ma può risolvere simbolicamente ciò che è possibile risolvere e produrre un algoritmo numerico adatto per l'esecuzione con un linguaggio di basso livello (come C o Matlab). Ovviamente non è possibile convertire tutto ciecamente, dovrebbe essere un processo assistito manualmente. –