2011-05-11 6 views
5

¿Cuál es la forma correcta de convertir las expresiones de Mathematica sin pérdidas en una cadena (una cadena guardada en la memoria, no exportada a un archivo)?Preservar expresiones de Mathematica en una forma textual

Busco a una representación textual que

  1. preservará toda la información, incluyendo el mantenimiento de los objetos especiales (y posiblemente atómicas), como SparseArray, Graph, Dispatch, CompiledFunction, etc. intacta. P.ej. ciclar un SparseArray a través de esta representación debe mantenerlo disperso (y no convertirlo a una lista normal).
  2. es relativamente rápido para pasar de un ciclo a otro (convertir de ida y vuelta).

¿Es ToString[expr, FullForm] suficiente para esto? ¿Qué hay de ToString[expr, InputForm]?

Nota 1: Esto surgió al intentar solucionar algunos errores en Graph donde la representación interna se corrompe ocasionalmente. Pero estoy interesado en una respuesta a la pregunta general anterior.

Nota 2: Save seguramente hará esto, pero escribe en los archivos (probablemente sea posible resolver esto usando flujos), y solo escribe definiciones asociadas con símbolos.

+0

No entiendo lo que estás tratando de hacer. ¿Simplemente desea "guardar" una expresión para restaurarla más tarde, o va a procesar la cadena? –

+0

Solo guarde y restaure. En este caso particular, solucione los errores como https://groups.google.com/d/topic/comp.soft-sys.math.mathematica/RRsfrHCjwRM/discussion. La solución de Leonid es probablemente la mejor. – Szabolcs

+0

Ese error se ve mal. ¿Funciona el guardar en otro símbolo? 'jjHold = jj; IsomorphicGraphQ [jj, ... ' –

Respuesta

8

Si no se va a realizar algunas manipulaciones de cadena en la cadena resultante, puede considerar Compress y Uncompress como una alternativa a ToString. Si bien no sé sobre los casos en que se romperían los ciclos ToString[expr,InputForm] - , puedo imaginar fácilmente que existen. La solución Compress parece más robusta, ya que Uncompress invocado en Compress -ed cadena garantiza la reconstrucción de la expresión original. Una ventaja adicional de Compress es que es bastante eficiente en cuanto a la memoria: la usé varias veces para guardar grandes cantidades de datos numéricos en el notebook, sin guardarlos en el disco.

+0

¿Sabe qué método de compresión usa y su rendimiento? (Igual que gzip? Que es muy rápido). Es interesante observar que 'Descomprimir @ Comprimir [...]' también preservará el "empaquetamiento" de las matrices. Supongo que la salida 'Compress' es portátil entre las arquitecturas, a pesar de esto. – Szabolcs

+0

Desafortunadamente, no conozco los detalles sobre la implementación interna de 'Compress'; quizás personas más conocedoras de este tema puedan comentar sobre eso. Para mis propósitos, esto fue bastante rápido, incluso para grandes cantidades de datos/expresiones grandes. En cuanto a la portabilidad, es posible que tengas razón (esto sería bueno), pero de nuevo, no sé. –

+9

Implementé la mayor parte de la función de compresión en Mathematica. Utiliza la compresión "desinflar", al igual que gzip. Es portátil en todas las arquitecturas en las que Mathematica está disponible. Mantiene matrices empaquetadas. – ragfield

5

En caso de presentar problemas de Compress ida y vuelta de, ExportString y ImportString podrían presentar una alternativa útil - especialmente, si se utilizan en conjunción con el Mathematica nativo MX formato:

string = ExportString[originalExpr, "MX"] 
recoveredExpr = ImportString[string, "MX"] 

Tenga en cuenta que el formato MX no es generalmente transferible entre las instancias de Mathematica, pero eso puede no importar para la aplicación en memoria descrita.

ExpressionML es otro formato de exportación relacionados con Mathematica, pero es claramente no un formato compacto.

+0

+1 - estos parecen útiles, nunca los han usado antes. –

+0

Me preocupaba que esto preservara la representación rota que hacía que 'IsomorphicGraphQ' fallara, pero de hecho no es así. @WReach, en general, ¿es seguro usar cadenas para datos binarios? – Szabolcs

+0

@Szabolcs Empíricamente, diría que sí. He utilizado una estrategia similar con archivos de imagen codificados con éxito en el pasado. Las cuerdas parecen actuar como una matriz de palabras de 16 bits y no he observado efectos negativos. Sin embargo, no puedo dar una garantía más fuerte. – WReach

Cuestiones relacionadas