如何将Mathematica二进制转储文件转换为定义列表?

时间:2011-08-05 09:02:15

标签: wolfram-mathematica dump binaryfiles binary-data

正如文档所说,“DumpSave以二进制格式写出定义,该格式针对 Mathematica 的输入进行了优化。”有没有办法将 Mathematica 二进制转储文件转换回定义列表而不评估它们? Import["file.mx","HeldExpression"]不起作用......

2 个答案:

答案 0 :(得分:6)

DumpSave存储与该符号相关联的值,即OwnValuesDownValuesUpValuesSubValuesDefaultValues,{{1} },NValues

所有评估都在Mathematica的会话中完成,然后FormatValues保存了它的结果。

这些值存储在内部正式中。读取MX文件只会创建符号,并通过读取此内部格式来绕过评估者来填充这些值。

也许你可以分享促使你提出这个问题的问题。

<小时/> [编辑] 澄清Alexey提出的问题。 MX文件保存符号定义的内部表示。 Mathematica似乎在内部跟踪:

DumpSave

然后,可以使用f[x_Real] := x^2 + 1 DumpSave[FileNameJoin[{$HomeDirectory, "Desktop", "set_delayed.mx"}], f]; Remove[f] f[x_Real] = x^2 + 1; DumpSave[FileNameJoin[{$HomeDirectory, "Desktop", "set.mx"}], f]; setBytes = Import[FileNameJoin[{$HomeDirectory, "Desktop", "set.mx"}], "Byte"]; setDelayedBytes = Import[FileNameJoin[{$HomeDirectory, "Desktop", "set_delayed.mx"}], "Byte"]; 来查看差异。我不知道为什么这样做,但我的观点是立场。使用SequenceAlignment[setBytes, setDelayedBytes]构建的值的所有评估都已在Mathematica会话中完成,然后由Set保存。读取MX文件时,内部表示将被读回到Mathematica会话中,并且实际上不会对已加载的定义进行评估。

答案 1 :(得分:1)

您可以将Rule而不是RuleDelayed分配给DownValues,这相当于直接定义。赋值的右侧保持未评估状态并按字面复制,因此命令对应

Clear[f]; 
f[x_Real] = x^2 + 1;
DumpSave["f.mx", f];
Clear[f];
f = a;
<< f.mx;
Definition[f]

将是

Clear[f];
f = a;
DownValues[f] := {f[x_Real] -> x^2 + 1}
Definition[f]
  

f = a

     

f [x_Real] = x ^ 2 + 1

(参与您的Clear[f]; f = a; f[x_Real] = x^2 + 1; Definition[f]示例不起作用,而是为a[x_Real]分配规则。这对先前分配给x也很有用。

编辑:右侧的副作用并不健全,如下面评论中的示例所示。要分配一个避免任何评估的下限值,可以使用未记录的System`Private`ValueList,如下所示:

Clear[f];
f := Print["f is evaluated!"];
DownValues[f] := System`Private`ValueList[f[x_Real] -> Print["definition is evaluated!"]];
  

(无输出)

请注意,分配看似转换为延迟规则:

DownValues[f]
  

{HoldPattern [f [x_Real]]:&gt; x ^ 2 + 1}

Definition(和Save)表明与:=的区别在内部得到了保留。我不知道为什么DownValues没有表现出真相。

要回答原始问题,您可能最好导入转储文件并使用Save导出相关符号,然后,如果希望将其加载到受先前定义污染的内核中,则转换分配以编程方式进行DownValues的分配。但是,在导出之前将变量放在私有上下文中可能更容易,这是系统文件为防止冲突所做的事情。