组织笔记本电脑和在Mathematica中保存结果

时间:2011-06-13 17:32:51

标签: function wolfram-mathematica

截至目前,我使用3笔记本:

  • 功能

我拥有我创建的所有功能,并在其他笔记本中调用。

  • 转化

根据原始数据,我计算转换并添加列/列表

当数据是我的原始数据时,我会调用:

t1data:第一次转换的结果

t2data:第二次转换的结果

等等, 我还没到.20。

  • 显示&分析

使用上述两种方法,我创建了Manipulate对象,使我能够分析数据。

问题

  • 是否可以保存转换笔记本的结果,例如t13data可用于Display&分析笔记本没有运行所有以前的计算(t1,t2,t3 ... t12)它基于?

  • 有没有办法在不打开相应笔记本的情况下使用我的函数或转换数据?

  • 我的分离策略是否有意义?

到目前为止,我系统地打开了3并且必须在能够做任何事情之前运行它们,并且由于我的计算能力差而且代码效率低下需要一段时间。

2 个答案:

答案 0 :(得分:8)

  • 保存变量状态:可以使用DumpSaveSavePut完成。使用Get或<<
  • 进行回读
  • 您可以make a package从您的函数中使用Needs或<<
  • 阅读这些内容
  • 这不是我通常做的事情。我选择一个单片笔记本包含所有东西(很好地分层与部分和子部分,以便您可以折叠打开或关闭)或一个包+稍微更精简的分析笔记本取决于天气和一些其他隐藏的变量。

答案 1 :(得分:6)

保存中间结果

Mathematica表达式的本机文件格式是.m文件。这是人类可读的文本格式,如果您怀疑或未保存文件,您可以在文本编辑器中查看该文件。您可以使用Get加载这些文件。 Get的简写形式是:

<< "filename.m"

使用Get将替换或刷新在.m文件中明确生成的任何现有分配。


保存简单分配的中间结果(dat = ...)可以使用Put完成。 Put的简写形式是:

dat >> "dat.m"

这只保存指定的表达式本身;要恢复必须使用的定义:

dat = << "dat.m"

另请参阅PutAppend,以便在创建新结果时将数据附加到.m文件。

使用Save保存复杂分配的结果和函数定义。此类指配的示例包括:

  • f[x_] := subfunc[x, 2]
    
  • g[1] = "cat"
    g[2] = "dog"
    
  • nCr = #!/(#2! (# - #2)!) &;
    nPr = nCr[##] #2! &;
    

对于最后一个示例,复杂性是nPr取决于nCr。使用Save只需保存nPr即可获得nPr的完整定义:nCr的定义也会自动保存。语法是:

Save["nPr.m", nPr]

使用Save保存作业本身;恢复定义使用:

<< "nPr.m" ;

将功能移动到包

除了PutSave,或在文本编辑器中手动创建外,还可以自动生成.m文件。这可以通过创建Notebook并在包含函数定义的单元格上设置Cell > Cell Properties > Initialization Cell来完成。第一次保存Notebook时, Mathematica 将询问您是否要创建自动保存包。这样做, Mathematica 将生成一个与.nb文件并行的.m文件,其中包含Notebook中所有初始化单元格的内容。此外,每次保存笔记本时,它都会更新此.m文件,因此您无需手动更新它。

正弦所有初始化单元格将保存到并行.m文件中,我建议仅将Notebook用于生成此包,而不是用于其余计算。

管理功能时,必须考虑context。并非所有功能都应始终是全局的。一系列相关函数通常应保存在自己的上下文中,然后可以很容易地将其暴露给$ContextPath或从Begin中删除。此外,一系列功能通​​常依赖于不需要在主要功能之外调用的子功能,因此这些子功能不应该是全局的。所有这些都与包创建有关。顺便提一下,它还涉及代码的格式化,因为知道并非所有子功能都必须作为全局公开,这使得人们可以自由地将许多子功能移动到代码的“顶层”,即在Module之外或其他范围构造,不与全局符号冲突。

包创建是一个复杂的主题。您应该熟悉BeginPackageEndEndPackageNeeds以更好地理解它,但这是一个简单的框架,可以帮助您入门。您可以暂时将其作为模板。

这是我在DeleteDuplicates存在之前使用的旧定义:

BeginPackage["UU`"]

UnsortedUnion::usage = "UnsortedUnion works like Union, but doesn't \
return a sorted list.  \nThis function is considerably slower than \
Union though."

Begin["`Private`"]

UnsortedUnion = 
  Module[{f}, f[y_] := (f[y] = Sequence[]; y); f /@ Join@##] &

End[]

EndPackage[]

以上所有内容都在初始化单元格中。您可以在不损害生成的包的情况下插入文本单元格,节或甚至其他输入单元格:仅导出初始化单元格的内容。

BeginPackage定义您的函数所属的Context,并禁用所有非System`定义,以防止冲突。 (有很多方法可以从你的包中调用其他函数,但这对另一个问题更好。)

按照惯例,为每个函数定义::usage消息,使其可以在包本身之外访问。这不是多余的!虽然还有其他方法,但如果没有这个方法,您将不会在可见的上下文中公开您的函数。

接下来,您Begin一个仅用于包的上下文,通常为"`Private`"。在此之后,您定义的任何符号(在Begin / End块之外未使用)将在加载Package后不会全局公开,因此不会与Global`冲突符号。

在您的函数定义之后,使用End[]关闭块。您可以根据需要使用尽可能多的Begin / End块,并且我通常会为每个函数使用单独的块,但不是必需的。

最后,使用EndPackage[]关闭以将环境恢复到使用BeginPackage之前的状态。

保存Notebook并生成.m包后(假设为“mypackage.m”),您可以使用Get加载它:

<< "mypackage.m"

现在,上下文UnsortedUnion中会有一个函数UU`,它可以在全局访问。

您还应该查看{{3}}的功能,但在我看来这有点先进,所以我会停在这里。