截至目前,我使用3笔记本:
我拥有我创建的所有功能,并在其他笔记本中调用。
根据原始数据,我计算转换并添加列/列表
当数据是我的原始数据时,我会调用:
t1data:第一次转换的结果
t2data:第二次转换的结果
等等, 我还没到.20。
使用上述两种方法,我创建了Manipulate对象,使我能够分析数据。
是否可以保存转换笔记本的结果,例如t13data可用于Display&分析笔记本没有运行所有以前的计算(t1,t2,t3 ... t12)它基于?
有没有办法在不打开相应笔记本的情况下使用我的函数或转换数据?
我的分离策略是否有意义?
到目前为止,我系统地打开了3并且必须在能够做任何事情之前运行它们,并且由于我的计算能力差而且代码效率低下需要一段时间。
答案 0 :(得分:8)
DumpSave
,Save
或Put
完成。使用Get或<< 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" ;
除了Put
和Save
,或在文本编辑器中手动创建外,还可以自动生成.m文件。这可以通过创建Notebook并在包含函数定义的单元格上设置Cell > Cell Properties > Initialization Cell
来完成。第一次保存Notebook时, Mathematica 将询问您是否要创建自动保存包。这样做, Mathematica 将生成一个与.nb文件并行的.m文件,其中包含Notebook中所有初始化单元格的内容。此外,每次保存笔记本时,它都会更新此.m文件,因此您无需手动更新它。
正弦所有初始化单元格将保存到并行.m文件中,我建议仅将Notebook用于生成此包,而不是用于其余计算。
管理功能时,必须考虑context。并非所有功能都应始终是全局的。一系列相关函数通常应保存在自己的上下文中,然后可以很容易地将其暴露给$ContextPath
或从Begin
中删除。此外,一系列功能通常依赖于不需要在主要功能之外调用的子功能,因此这些子功能不应该是全局的。所有这些都与包创建有关。顺便提一下,它还涉及代码的格式化,因为知道并非所有子功能都必须作为全局公开,这使得人们可以自由地将许多子功能移动到代码的“顶层”,即在Module
之外或其他范围构造,不与全局符号冲突。
包创建是一个复杂的主题。您应该熟悉BeginPackage
,End
,EndPackage
和Needs
以更好地理解它,但这是一个简单的框架,可以帮助您入门。您可以暂时将其作为模板。
这是我在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}}的功能,但在我看来这有点先进,所以我会停在这里。