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