你的Mathematica工具包里有什么?
我们都知道Mathematica很棒,但它也经常缺乏关键功能。 Mathematica使用什么样的外部包/工具/资源?
我将编辑(并邀请其他人也这样做)这篇文章,其中包括侧重于科学研究普遍适用性的资源,尽可能多的人会发现有用的资源。 随意贡献任何东西,甚至是小代码片段(正如我在下面做的定时例程)。
此外,在Mathematica 7及更高版本中,您发现自己或从某些纸张/网站挖出的无证和实用功能是非常受欢迎的。
请包括一个简短的描述或评论为什么伟大或它提供的实用程序。 如果您通过会员链接链接到亚马逊书籍,请提及它,例如,在链接后面加上您的名字。
包:
LevelScheme
是一个可以大大扩展Mathematica制作好看图的能力的软件包。 如果不用于其他任何东西,那么我会使用它来改善对帧/轴刻度的控制。 它的最新版本被称为SciDraw,它将在今年的某个时候发布。 Presentation Package
(50美元 - 免费更新) grassmannOps
软件包提供了用Grassmann变量和运算符进行代数和微积分的资源,这些变量和运算符具有不重要的换向关系。 GrassmannAlgebra
代数包以及与Grassmann和Clifford代数一起工作的书。 工具:
MASH
是Daniel Reeves出色的Perl脚本,主要为Mathematica v7提供脚本支持。 (现在使用-script
选项内置于Mathematica 8中。) alternate Mathematica shell
(仅使用python,* nix) 资源:
Wolfram自己的存储库MathSource
有很多有用的功能,适用于各种应用的窄型笔记本电脑。 另请查看其他部分,如
Current Documentation
, Courseware
, Demos
,以及演示。 Mathematica Wikibook。
图书:
web
, pdf
)的高级介绍。 我们很高兴让Leonid
本人在这里回答问题。 web
) Demonstrations Page
上看到其中的一些。 pdf
) - 一个很好的简要介绍你需要了解的大部分Mathematica编程知识。 未记录(或几乎没有记录)的功能:
this question
。 this answer
this question
。 this question
。 我之前提到过,但我发现最有用的工具是Reap
和Sow
一个应用,它模仿/扩展了GatherBy
的行为:
SelectEquivalents[x_List,f_:Identity, g_:Identity, h_:(#2&)]:=
Reap[Sow[g[#],{f[#]}]&/@x, _, h][[2]];
这使我可以按照任何标准对列表进行分组,并在过程中进行转换。 它的工作方式是标准函数( f
)标记列表中的每个项目,然后每个项目由第二个提供的函数( g
)转换,并且特定的输出由第三个函数( h
)控制。 函数h
接受两个参数:标签和具有该标签的收集项目的列表。 这些项目保留原来的顺序,所以如果你设置h = #1&
那么你会得到一个未分类的Union
,就像Reap
的例子。 但是,它可以用于二次加工。
作为它的实用程序的一个例子,我一直在与Wannier90一起工作,它将空间依赖的哈密尔顿算子输出到文件中,其中每行是矩阵中的不同元素,如下所示
rx ry rz i j Re[Hij] Im[Hij]
为了将该列表转换为一组矩阵,我收集了包含相同坐标的所有子列表,将元素信息转换为规则(即{i,j} - > Re [Hij] + I Im [Hij]),然后然后将收集的规则转换为一个SparseArray
所有这些都与一行内容相符:
SelectEquivalents[hamlst,
#[[;; 3]] &,
#[[{4, 5}]] -> (Complex @@ #[[6 ;;]]) &,
{#1, SparseArray[#2]} &]
老实说,这是我的瑞士军刀,它使复杂的事情变得非常简单。 我的其他大多数工具都有些特定于域,所以我可能不会发布它们。 但是,大多数(如果不是全部的话)引用SelectEquivalents
。
编辑 :它不完全模仿GatherBy
,因为它不能像GatherBy
那样简单地对表达式的多个层次进行GatherBy
。 但是,对于我所需要的大部分内容, Map
都能正常工作。
例如 :@Yaroslav Bulatov要求提供一个独立的示例。 这里有一个来自我的研究已经大大简化了。 所以,假设我们在飞机上有一组点
In[1] := pts = {{-1, -1, 0}, {-1, 0, 0}, {-1, 1, 0}, {0, -1, 0}, {0, 0, 0},
{0, 1, 0}, {1, -1, 0}, {1, 0, 0}, {1, 1, 0}}
我们希望通过一系列对称操作来减少点数。 (为了好奇,我们正在生成每个点的小组。)对于这个示例,让我们使用围绕z轴的四倍旋转轴
In[2] := rots = RotationTransform[#, {0, 0, 1}] & /@ (Pi/2 Range[0, 3]);
使用SelectEquivalents
我们可以将在这些操作下产生相同图像集的点分组,即它们是等价的,使用以下
In[3] := SelectEquivalents[ pts, Union[Through[rots[#] ] ]& ] (*<-- Note Union*)
Out[3]:= {{{-1, -1, 0}, {-1, 1, 0}, {1, -1, 0}, {1, 1, 0}},
{{-1, 0, 0}, {0, -1, 0}, {0, 1, 0}, {1, 0, 0}},
{{0,0,0}}}
这产生了3个包含等价点的子列表。 (注意, Union
在这里是绝对重要的,因为它确保每个点产生相同的图像。原来,我使用了Sort
,但是如果一个点位于对称轴上,它在关于该轴的旋转下是不变的,给出额外的图像因此, Union
消除了这些额外的图像,而且, GatherBy
会产生相同的结果。)在这种情况下,点已经在我将使用的形式,但我只需要每个分组的代表点, d喜欢等同点数。 因为我不需要转换每个点,所以我在第二个位置使用Identity
函数。 对于第三个功能,我们需要小心。 传递给它的第一个参数将是旋转点下的点的图像,对于点{0,0,0}
是包含四个相同元素的列表,使用它将抛出计数。 但是,第二个参数仅仅是包含该标签的所有元素的列表,因此它只包含{0,0,0}
。 在代码中,
In[4] := SelectEquivalents[pts,
Union[Through[rots[#]]]&, #&, {#2[[1]], Length[#2]}& ]
Out[4]:= {{{-1, -1, 0}, 4}, {{-1, 0, 0}, 4}, {{0, 0, 0}, 1}}
请注意,最后一步可以轻松地通过
In[5] := {#[[1]], Length[#]}& /@ Out[3]
但是,使用这个和上面不太完整的例子很容易看出,使用最少的代码可以实现非常复杂的转换。
托德盖利(沃尔夫勒姆研究)只是给我一个很好的黑客,它允许用任意代码“包装”内置函数。 我觉得我必须分享这个有用的工具。 以下是托德对我的question
的回答。
一些有趣的(?)历史:“包装”内置函数的这种破解方式是由Robby Villegas和I在1994年左右发明的,具有讽刺意味的是函数Message在我为Mathematica Journal编写的名为ErrorHelp的包中发明那时候。 自那以后,它被许多人使用过很多次。 这是一个内幕人士的诡计,但我认为可以说它已经成为将自己的代码注入到内置函数定义中的规范方式。 它很好地完成了工作。 当然,您可以将$ inMsg变量放到您希望的任何私有上下文中。
Unprotect[Message];
Message[args___] := Block[{$inMsg = True, result},
"some code here";
result = Message[args];
"some code here";
result] /; ! TrueQ[$inMsg]
Protect[Message];
链接地址: http://www.djcxy.com/p/6041.html