Wolfram mathematica 以文本形式保存Mathematica表达式

Wolfram mathematica 以文本形式保存Mathematica表达式,wolfram-mathematica,Wolfram Mathematica,将Mathematica表达式无损地转换为字符串(保存在内存中的字符串,而不是导出到文件)的正确方法是什么 我正在寻找一个文本表示,即 将保留所有信息,包括保留特殊(可能是原子)对象,如SparseArray、Graph、Dispatch、CompiledFunction等。例如,通过此表示循环使用SparseArray应使其保持稀疏(而不是将其转换为正常列表) 循环速度相对较快(来回转换) ToString[expr,FullForm]是否足以满足此要求?那么ToString[expr,Inp

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

我正在寻找一个文本表示,即

  • 将保留所有信息,包括保留特殊(可能是原子)对象,如
    SparseArray
    Graph
    Dispatch
    CompiledFunction
    等。例如,通过此表示循环使用
    SparseArray
    应使其保持稀疏(而不是将其转换为正常列表)
  • 循环速度相对较快(来回转换)
  • ToString[expr,FullForm]
    是否足以满足此要求?那么
    ToString[expr,InputForm]

    注1:这是在试图解决
    Graph
    中的一些错误时出现的,其中内部表示偶尔会损坏。但我对上述一般问题的答案感兴趣


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

    如果您不打算对生成的字符串执行某些字符串操作,您可以考虑<代码>压缩< /代码>和<代码>未压缩< /代码>作为<代码> toStudio的替代。虽然我不知道
    ToString[expr,InputForm]
    -
    ToExpression
    循环会中断的情况,但我很容易想象它们的存在。
    Compress
    解决方案似乎更加健壮,因为在
    Compress
    -ed字符串上调用的
    Uncompress
    可以保证重建原始表达式。
    Compress
    的另一个优点是它非常节省内存-我曾多次使用它将大量数字数据保存在笔记本电脑中,而不将它们保存到磁盘。

    如果
    Compress
    出现往返问题,
    ExportString
    ImportString
    可能是一个有用的替代方案——特别是,如果它们与Mathematica native
    MX
    格式结合使用:

    string = ExportString[originalExpr, "MX"]
    recoveredExpr = ImportString[string, "MX"]
    
    请注意,
    MX
    格式通常不能在Mathematica实例之间转换,但这对于内存中描述的应用程序可能并不重要


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

    您知道它使用什么压缩方法及其性能吗?(与gzip相同,它非常快。)值得注意的是
    Uncompress@Compress[…]
    还将保留数组的“打包性”。尽管如此,我假设
    Compress
    输出在架构之间是可移植的。不幸的是,我不知道
    Compress
    内部实现的细节-也许这里有更多的知识渊博的人可以对此发表评论。就我而言,这相当快,即使对于大量数据/大型表达式也是如此。关于可移植性,你可能是对的(这很好),但我也不知道。我在Mathematica中实现了大部分压缩函数。它使用“deflate”压缩,与gzip相同。它在Mathematica可用的所有体系结构中都是可移植的。它维护压缩阵列。我不明白你想做什么。您只是想“保存”一个表达式以便以后还原,还是要处理该字符串?只需保存并还原即可。在这种特殊情况下,我们需要解决如下错误。Leonid的解决方案可能是最好的。那个bug看起来很糟糕。保存到另一个符号有效吗<代码>jjHold=jj;IsomorphicGraphQ[jj,…否。这似乎是由损坏的(?)内部表示引起的。显然,
    图形相关功能的实现级别较低,目前存在几个奇怪的错误(例如,无法很好地处理压缩阵列)。期待着8.0.2版本能够解决这些问题。我很高兴我使用了版本7!我担心这会保留导致
    IsomorphicGraphQ
    失败的损坏的表示,但事实上它不会。一般来说,使用字符串处理二进制数据安全吗?@Szabolcs经验上,我会说是的。我对过去成功地编码了图像文件。字符串看起来像一个16位字的数组,我没有观察到任何不良影响。但是,我不能给出更有力的保证。Albert Retey最近发现了Wolfram数据交换(“WDX”)格式的存在,它是“MX”格式的另一种替代品。