就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果你觉得这个问题可以改进并可能重新打开,visit the help center 寻求指导。
9年前关闭。
我们都知道 Mathematica 很棒,但它也经常缺乏关键功能。您在 Mathematica 中使用什么样的外部包/工具/资源?
我将编辑(并邀请其他任何人也这样做)这篇主要文章,以包含专注于科学研究中的普遍适用性以及尽可能多的人会觉得有用的资源。随意贡献任何东西,甚至是小的代码片段(就像我在下面的计时例程中所做的那样)。
此外,最欢迎您在 Mathematica 7 及更高版本中发现或从某些论文/站点中挖掘出的未记录和有用的功能。
请附上简短的描述或评论,说明为什么某物很棒或它提供了什么实用程序。如果您通过附属链接链接到亚马逊上的书籍,请提及它,例如,将您的名字放在链接后。
包:
LevelScheme
是一个包,它极大地扩展了 Mathematica 生成漂亮绘图的能力。如果不是为了其他任何事情,我会使用它,然后是为了对帧/轴刻度进行大量改进的控制。其最新版本称为 SciDraw,将于今年某个时候发布。 Presentation Package
(50 美元 - 更新不收费)grassmannOps
包提供了使用具有非平凡交换关系的 Grassmann 变量和运算符进行代数和微积分的资源。 GrassmannAlgebra
软件包和书籍,用于处理 Grassmann 和 Clifford 代数。 工具:
MASH
是 Daniel Reeves 出色的 Perl 脚本,主要为 Mathematica v7 提供脚本支持。 (现在内置于 Mathematica 8 中,带有 -script
选项。)alternate Mathematica shell
(仅使用 python,*nix) 资源:
MathSource
有很多适用于各种应用的狭窄笔记本。还可以查看其他部分,例如Current Documentation
Courseware
讲座,Demos
用于演示。 书籍:
web
, pdf
) 的高级介绍如果您想在 Mathematica 中执行 For 循环以外的任何事情,则必须阅读。我们很高兴有 Leonid
本人在这里回答问题。 web
) Demonstrations Page
) - 对您需要了解的有关 Mathematica 编程的大部分内容的简洁介绍。 作者:Martha L. Abell、James P. Braselton - 893 页 对于初学者,可以同时学习求解 DE 和 Mathematica。
未记录(或几乎没有记录)的特性:
pdf
。 this question
this answer
。 this question
。 最佳答案
我之前提到过 this,但我发现最有用的工具是 Reap
和 Sow
的应用程序,它模仿/扩展了 0x251812231343 的行为
SelectEquivalents[x_List,f_:Identity, g_:Identity, h_:(#2&)]:=
Reap[Sow[g[#],{f[#]}]&/@x, _, h][[2]];
这使我可以按任何标准对列表进行分组并在此过程中对其进行转换。它的工作方式是一个标准函数(
GatherBy
)标记列表中的每个项目,然后每个项目由第二个提供的函数( f
)转换,并且特定输出由第三个函数( g
)控制。函数 h
接受两个参数:一个标签和一个收集到的具有该标签的项目的列表。这些项目保留其原始顺序,因此如果您设置 h
那么您会得到一个未排序的 h = #1&
,就像 examples 中的 Union
一样。但是,它可以用于二次加工。作为其效用的一个示例,我一直在使用 Wannier90,它将空间相关的哈密顿量输出到一个文件中,其中每一行都是矩阵中的不同元素,如下所示
rx ry rz i j Re[Hij] Im[Hij]
为了将该列表转换为一组矩阵,我收集了所有包含相同坐标的子列表,将元素信息转换为规则(即 {i,j}-> Re[Hij]+I Im[Hij]),然后然后将收集到的规则转换为
Reap
全部带有一个类轮:SelectEquivalents[hamlst,
#[[;; 3]] &,
#[[{4, 5}]] -> (Complex @@ #[[6 ;;]]) &,
{#1, SparseArray[#2]} &]
老实说,这是我的瑞士军刀,它使复杂的事情变得非常简单。我的大多数其他工具都是特定于领域的,所以我可能不会发布它们。但是,大多数(如果不是全部)引用
SparseArray
。编辑 :它不能完全模仿
SelectEquivalents
,因为它不能像 GatherBy
那样简单地对表达式的多个级别进行分组。但是, GatherBy
对我需要的大部分内容都很好。示例 :@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}}
我们想通过一组对称操作来减少点的数量。 (出于好奇,我们正在生成每个点的 little group。)对于这个例子,让我们使用围绕 z 轴的四倍旋转轴
In[2] := rots = RotationTransform[#, {0, 0, 1}] & /@ (Pi/2 Range[0, 3]);
使用
Map
我们可以将在这些操作下产生相同图像集的点进行分组,即它们是等效的,使用以下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 个包含等效点的子列表。 (注意,
SelectEquivalents
在这里绝对重要,因为它确保每个点产生相同的图像。最初,我使用 Union
,但如果一个点位于对称轴上,它在围绕该轴旋转的情况下是不变的,从而提供额外的图像本身。因此,Sort
消除了这些额外的图像。此外,Union
会产生相同的结果。)在这种情况下,这些点已经采用我将使用的形式,但我只需要每个分组中的一个代表点,然后我' d 喜欢等价点的计数。因为我不需要变换每个点,所以我在第二个位置使用了 GatherBy
函数。对于第三个功能,我们需要小心。传递给它的第一个参数将是旋转下的点的图像,对于点 Identity
是四个相同元素的列表,使用它会丢弃计数。但是,第二个参数只是具有该标记的所有元素的列表,因此它将仅包含 {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]
但是,通过这个和上面不太完整的例子很容易看出用最少的代码可以实现非常复杂的转换。
关于resources - 您的 Mathematica 工具包中有什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4198961/