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

500*_*500 8 wolfram-mathematica function

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

  • 功能

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

  • 转型

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

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

t1data:第一次转换的结果

t2data:第二次转换的结果

等等,我还在t20.

  • 显示和分析

使用上面的两个我创建Manipulate对象,使我能够分析数据.

问题

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

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

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

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

Sjo*_*ies 8

  • 保存变量的状态:可以做到用DumpSave,SavePut.使用Get或<<回读
  • 您可以从函数中创建一个包,然后使用Needs<<或者读取它们
  • 这不是我通常做的事情.我选择一个单片笔记本包含所有东西(很好地分层与部分和子部分,以便您可以折叠打开或关闭)或一个包+略微更精简的分析笔记本取决于天气和一些其他隐藏的变量.


Mr.*_*ard 6

保存中间结果

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

<< "filename.m"
Run Code Online (Sandbox Code Playgroud)

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


保存简单赋值(dat = ...)的中间结果可以完成Put.简写形式为Put:

dat >> "dat.m"
Run Code Online (Sandbox Code Playgroud)

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

dat = << "dat.m"
Run Code Online (Sandbox Code Playgroud)

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

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

对于最后一个例子,复杂性nPr取决于nCr.使用Save它就足以保存nPr以获得完全有效的定义nPr:nCr将自动保存定义.语法是:

Save["nPr.m", nPr]
Run Code Online (Sandbox Code Playgroud)

Save保存使用分配本身; 恢复定义使用:

<< "nPr.m" ;
Run Code Online (Sandbox Code Playgroud)

将函数移动到包

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

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

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

包创建是一个复杂的主题.你应该熟悉Begin,BeginPackage,EndEndPackage更好地理解它,但这里是一个简单的框架,让你开始.您可以暂时将其作为模板.

这是我之前使用的旧定义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[]
Run Code Online (Sandbox Code Playgroud)

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

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

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

接下来,您Begin将按照传统方式单独使用该包"`Private`".在此之后,您定义的任何符号(在此Begin/ End块之外未使用)将在加载Package后不会全局公开,因此不会与Global`符号冲突.

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

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

保存Notebook并生成.m软件包(假设为"mypackage.m")后,可以使用以下命令加载Get:

<< "mypackage.m"
Run Code Online (Sandbox Code Playgroud)

现在,UnsortedUnionContext 中将有一个函数,UU`它将在全局访问.

你也应该研究一下它的功能Needs,但在我看来这有点先进,所以我会停在这里.