500*_*500 8 wolfram-mathematica function
截至目前我使用3笔记本:
我拥有我创建的所有功能,并在其他笔记本中调用.
根据原始数据,我计算转换并添加列/列表
当数据是我的原始数据时,我然后调用:
t1data:第一次转换的结果
t2data:第二次转换的结果
等等,我还在t20.
使用上面的两个我创建Manipulate对象,使我能够分析数据.
是否可以保存转换笔记本的结果,例如t13data可用于显示和分析笔记本,而无需运行它基于的所有先前计算(t1,t2,t3 ... t12)?
有没有办法在不打开相应笔记本的情况下使用我的函数或转换数据?
我的分离策略是否有意义?
到目前为止,我系统地打开3并且必须在能够做任何事情之前运行它们,并且由于我的计算能力差而且代码效率低下需要一段时间.
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
.此类指配的示例包括:
f[x_] := subfunc[x, 2]
Run Code Online (Sandbox Code Playgroud)g[1] = "cat"
g[2] = "dog"
Run Code Online (Sandbox Code Playgroud)nCr = #!/(#2! (# - #2)!) &;
nPr = nCr[##] #2! &;
Run Code Online (Sandbox Code Playgroud)对于最后一个例子,复杂性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)
除了Put
和Save
/或在文本编辑器中手动创建外,还可以自动生成.m文件.这是通过创建Notebook并Cell > Cell Properties > Initialization Cell
在包含函数定义的单元格上设置来完成的.当您第一次保存笔记本时,Mathematica将询问您是否要创建自动保存包.这样做,Mathematica将生成一个与.nb文件并行的.m文件,其中包含Notebook中所有初始化单元格的内容.此外,它会在每次保存Notebook时更新此.m文件,因此您无需手动更新它.
正弦所有初始化单元格将保存到并行.m文件中,我建议仅将Notebook用于生成此包,而不是用于其余的计算.
在管理功能时,必须考虑上下文.并非所有功能都应始终是全局的.一系列相关的功能通常应该保存在自己的环境中,然后可以很容易地暴露或移除$ContextPath
.此外,一系列功能通常依赖于不需要在主要功能之外调用的子功能,因此这些子功能不应该是全局的.所有这些都与包创建有关.顺便提一下,它还涉及代码的格式化,因为知道并非所有子功能都必须作为全局公开,这使得人们可以自由地将许多子功能移动到代码的"顶层",即在Module
其他范围构造之外,没有与全局符号冲突.
包创建是一个复杂的主题.你应该熟悉Begin
,BeginPackage
,End
并EndPackage
更好地理解它,但这里是一个简单的框架,让你开始.您可以暂时将其作为模板.
这是我之前使用的旧定义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)
现在,UnsortedUnion
Context 中将有一个函数,UU`
它将在全局访问.
你也应该研究一下它的功能Needs
,但在我看来这有点先进,所以我会停在这里.