2011-05-11 27 views
5

什麼是將Mathematica表達式無損地轉換爲字符串(保存在內存中的字符串,不會導出到文件中)的正確方法?以文本形式保留Mathematica表達式

我要尋找一個文字表述的是

  1. 將保留所有信息,包括保持特殊的(也可能是原子)的物體,如SparseArrayGraphDispatchCompiledFunction等完好。例如。通過這種表示循環一個SparseArray應該保持稀疏(而不是將其轉換爲正常列表)。
  2. 是比較快的循環(來回轉換)。

ToString[expr, FullForm]夠了嗎?那麼ToString[expr, InputForm]

注1:在嘗試解決Graph中偶爾發生內部表示損壞的一些錯誤時出現此問題。但我有興趣回答上面的一般問題。

注2:Save肯定會這樣做,但它會寫入文件(可能可以使用流來解決此問題),並且它只寫入與符號關聯的定義。

+0

我不明白你在做什麼。你只是想「保存」一個表達式來恢復,或者你要處理的字符串? – 2011-05-11 13:08:44

+0

只需保存並恢復。在這個特殊情況下,可以解決像https://groups.google.com/d/topic/comp.soft-sys.math.mathematica/RRsfrHCjwRM/discussion這樣的錯誤。列昂尼德的解決方案可能是最好的。 – Szabolcs 2011-05-11 13:11:58

+0

該錯誤看起來很糟糕。保存到另一個符號是否工作? 'jjHold = jj; IsomorphicGraphQ [jj,...' – 2011-05-11 13:16:29

回答

8

如果您不打算對結果字符串執行一些字符串操作,則可以考慮使用CompressUncompress作爲ToString的替代方法。雖然我不知道哪些情況會破裂,但我很容易想象它們的存在。 Compress解決方案似乎更加強大,因爲Uncompress調用Compress -ed字符串保證重建原始表達式。 Compress的一個額外優點是它具有很高的內存效率 - 我使用它幾次將大量數字數據保存在筆記本中,而不用將它們保存到磁盤。

+0

你知道它使用什麼壓縮方法,它的性能如何? (與gzip相同,速度非常快)。有趣的是,'Uncompress @ Compress [']'還將保留數組的「封裝性」。我假設'Compress'輸出在架構之間是可移植的,儘管如此。 – Szabolcs 2011-05-11 13:01:58

+0

不幸的是,我不知道'Compress'的內部實現細節 - 也許更有知識的人可以對此發表評論。就我的目的而言,即使對於大量的數據/大型表達式,這也是非常快的。關於便攜性,你可能是對的(這很好),但是我不知道。 – 2011-05-11 13:08:59

+9

我在Mathematica中實現了大部分Compress功能。它使用「deflate」壓縮,與gzip相同。它可移植到Mathematica可用的所有體系結構中。它維護打包數組。 – ragfield 2011-05-11 14:57:54

5

應該Compress表現出往返問題,ExportStringImportString可以呈現一種有用的替代 - 特別是,如果他們在與Mathematica的天然MX格式一起使用:

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

注意,MX格式通常在Mathematica實例之間不可轉移,但這對於所描述的內存中應用程序可能並不重要。

ExpressionML是另一個與Mathematica相關的輸出格式,但它明顯是而不是的一種緊湊格式。

+0

+1 - 這些看起來很有用,以前從未使用過。 – 2011-05-12 07:36:28

+0

我擔心這會保留使'IsomorphicGraphQ'失敗的破壞表示,但事實上並非如此。通常,@WReach對二進制數據使用字符串是否安全? – Szabolcs 2011-05-12 08:29:41

+0

@Szabolcs經驗上說,我會說是。過去我成功地使用了類似的編碼圖像文件策略。字符串看起來像一個16位字的數組,我沒有觀察到任何不良影響。但是,我無法給予更強有力的保證。 – WReach 2011-05-12 14:09:54