以文本形式保留Mathematica表达式

Sza*_*lcs 5 wolfram-mathematica

无损地将Mathematica表达式转换为字符串(保存在内存中的字符串,而不是导出到文件)的正确方法是什么?

我正在寻找一个文字表示

  1. 将保留所有信息,包括保持特殊(和可能的原子)的对象,例如SparseArray,Graph,Dispatch,CompiledFunction,等完好.例如,循环SparseArray通过此表示应该保持稀疏(并且不将其转换为正常列表).
  2. 循环相对较快(来回转换).

ToString[expr, FullForm]足够吗?怎么样ToString[expr, InputForm]

注1:这是在试图解决Graph内部表示偶尔被破坏的一些错误时出现的.但是我对上面一般问题的答案感兴趣.

注2:Save肯定会这样做,但它会写入文件(可能使用流来解决这个问题),并且它只编写与符号相关的定义.

Leo*_*rin 8

如果您不打算对结果字符串执行某些字符串操作,您可以考虑CompressUncompress作为替代ToString.虽然我不知道ToString[expr,InputForm]- ToExpression周期会破坏的情况,但我很容易想象它们存在.该Compress解决方案似乎更健壮,因为Uncompress调用上Compress-ed串是保证重构原始的表达.另一个优点Compress是它具有相当高的内存效率 - 我使用它几次就可以在笔记本中保存大量的数字数据,而无需将它们保存到磁盘上.

  • 我在Mathematica中实现了大部分的Compress功能.它使用"deflate"压缩,与gzip相同.它可以在Mathematica可用的所有架构上移植.它维护打包数组. (9认同)

WRe*_*ach 5

应该Compress表现出往返问题,ExportString并且ImportString可能提供一个有用的替代方案 - 特别是,如果它们与Mathematica原生MX格式一起使用:

string = ExportString[originalExpr, "MX"]
recoveredExpr = ImportString[string, "MX"]
Run Code Online (Sandbox Code Playgroud)

请注意,这种MX格式通常不能在Mathematica实例之间转换,但这对于所描述的内存中应用程序可能无关紧要.

ExpressionML是另一种与Mathematica相关的导出格式,但它显然不是一种紧凑的格式.