我们都知道Mathematica很棒,但它也经常缺乏关键功能.您在Mathematica中使用哪种外部包/工具/资源?
我将编辑(并邀请任何其他人也这样做)这个主要帖子包括专注于科学研究的一般适用性的资源,并且尽可能多的人会觉得有用.随意贡献任何东西,甚至是小代码片段(正如我在下面做的时间例程).
此外,在Mathematica 7及其他您发现自己,或从一些纸张/网站挖出的无证和有用的功能是非常受欢迎的.
请提供简短描述或评论为什么有什么好东西或它提供的实用程序.如果您使用会员链接链接到亚马逊上的书籍,请提及它,例如,在链接后面加上您的姓名.
包:
LevelScheme
是一个大大扩展Mathematica生产美观图的能力的软件包.我使用它,如果没有其他任何东西,那么对框架/轴刻度的大大改进控制.它的最新版本称为SciDraw,它将在今年的某个时候发布.Presentation Package
(50美元 - 免费更新)grassmannOps
软件包提供了使用Grassmann变量和具有非平凡换向关系的算子进行代数和微积分的资源.GrassmannAlgebra
与格拉斯曼(Grassmann)和克利福德代数(Clifford algebras)合作的包和书.工具:
MASH
是Daniel Reeves出色的Perl脚本,主要为Mathematica v7提供脚本支持.(现在-script
可以选择使用Mathematica 8制作.)alternate Mathematica shell
与GNU的readline输入(使用python,*nix中只)资源:
MathSource
对于各种应用程序,Wolfram自己的存储库有很多有用的缩小笔记本.另请参阅其他部分,例如
Current Documentation
, Courseware
讲座, Demos
为了演示.在数学维基教科书.
图书:
在Mathematica中,我创建了单链表,如下所示:
toLinkedList[x_List] := Fold[pair[#2, #1] &, pair[], Reverse[x]];
fromLinkedList[ll_pair] := List @@ Flatten[ll];
emptyQ[pair[]] := True;
emptyQ[_pair] := False;
Run Code Online (Sandbox Code Playgroud)
使用pair
cons单元格的符号具有Flatten
安全工作的优点,即使列表包含Mathematica样式List
,并允许您使用MakeExpression
/ 定义自定义表示法MakeBoxes
,这使得一切都更加愉快.为了避免不得不捣乱$IterationLimit
,我编写了使用While
循环或NestWhile
使用递归来处理这些列表的函数.当然,我想看看哪种方法会更快,所以我写了两个候选人,所以我可以看到他们的战斗:
nestLength[ll_pair] :=
With[{step = {#[[1, -1]], #[[-1]] + 1} &},
Last@NestWhile[step, {ll, 0}, ! emptyQ@First@# &]];
whileLength[ll_pair] :=
Module[{result = 0, current = ll},
While[! emptyQ@current,
current = current[[2]];
++result];
result];
Run Code Online (Sandbox Code Playgroud)
结果很奇怪.我测试了长度为10000的链表上的函数,whileLength
通常快了大约50%,大约0.035秒到nestLength
0.055秒.但是,偶尔whileLength
需要约4秒钟.我认为可能存在一些缓存行为,所以我开始生成新的随机列表来检查,并且whileLength
在第一次运行时使用新列表不一定会很慢; 可能需要几十次才能看到减速,但之后它不会再发生(至少不是我在每个列表中尝试的200次运行).
可能会发生什么?
作为参考,我用于测试的功能是这样的: …
IntegerPartitions[n, {3, 10}, Prime ~Array~ 10]
Run Code Online (Sandbox Code Playgroud)
在Mathematica中,这将列出所有方法,将n作为前十个素数中三到十的总和,允许根据需要重复.
如何有效地找到等于n的总和,允许每个元素只使用一次?
使用前十个素数只是一个玩具的例子.我寻求一个对任意参数有效的解决方案.在实际情况下,即使使用多项式系数,生成所有可能的和也会占用太多内存.
我忘了包括我正在使用Mathematica 7.
我想知道如何一般地做到这一点,最好的策略是什么等等.我已经看到了一些解决方案,其中一些看起来非常难/乏味.我工作的那个使用纯函数来实现对象函数和头像OBJECT [].在类编码方面使用起来非常困难.在定义函数和构造函数时(特别是继承部分很难),我感到头晕目眩.
因此,我的问题的编码是关于类的编码部分的优点.理想情况下,我正在寻找可以如下工作的东西.首先,我们定义一个类,例如汽车如下:
beginClass["vehicle"];
public startTheEngine;
private fuel;
vehicle[args_]:=Block[{},...];
startTheEngine[thrust_]:=Block[{}...];
endClass
beginClass["car", "vehicle"];
public TurnTheRadioOn;
private frequency;
car[args_] := Block[{...},];
TurnTheRadioOn[]:=
Block[{},
use private variable frequency
]
endClass;
Run Code Online (Sandbox Code Playgroud)
请注意,私有/公共函数的定义几乎与"普通"mathematica代码一样非常重要.这就是主要要求.
该课程将被用作
car1 = newObject["car", args];
car1.StartTheEngine[];
car1.TurnOnTheRadio[];
Run Code Online (Sandbox Code Playgroud)
我很好奇那个人要考虑什么?为了构建像上面这样的东西可能涉及Mathematica的许多方面,例如如何修复".".语法等.如果您建议现有的软件包,我将不胜感激,如果您可以原则上评论它是如何工作的.
我天真的期望是封装部分可以通过BeginPackage结构修复.所有对象都可以存储在专门为每个类设计的名称空间中.我认为对象看起来像
car1 = OBJECT["car"][fuel$1,frequency$1,....];
car2 = OBJECT["car"][fuel$2,frequency$2,....];
Run Code Online (Sandbox Code Playgroud)
我认为必须构建类似编译器的东西,将上面的类定义代码转换为类.m文件.此外,在某种程度上,第二个主要问题是如何构建这样的编译器.
关心佐兰
ps我之所以问这个问题,是因为我真的需要多次这样的东西.
我正在制作10 ^ 6到10 ^ 7实数的平面列表,其中一些正在重复.
我需要删除重复的实例,只保留第一次出现,而不修改列表顺序.
这里的关键是效率,因为我有很多要处理的清单.
示例(假):
输入:
{.8, .3 , .8, .5, .3, .6}
Run Code Online (Sandbox Code Playgroud)
期望的输出
{.8, .3, .5, .6}
Run Code Online (Sandbox Code Playgroud)
除了注意
用Union删除重复元素(不保留顺序)给我的穷人的笔记本电脑:
DiscretePlot[a = RandomReal[10, i]; First@Timing@Union@a, {i, 10^6 Range@10}]
Run Code Online (Sandbox Code Playgroud)
这个问题让我思考一种编辑代码的交互方法.我想知道是否有可能在Mathematica的动态功能下实现这样的东西.
考虑一个表达式:
Text[Row[{PaddedForm[currentTime, {6, 3}, NumberSigns -> {"", ""}, NumberPadding -> {"0", "0"}]}]]
Run Code Online (Sandbox Code Playgroud)
它的TreeForm
:
我希望能够直接编辑该树,然后将结果转换回Mathematica代码.至少应该能够:
我相信有些语言或环境专门用于这种操作,我觉得这并不具有吸引力,但我有兴趣为特殊目的进行这种交互式树编辑.
关于在Mathematica中创建记录的问题已在少数几个地方讨论过,例如Mathematica中的Struct数据类型?.
所有这些方法的问题在于,人们似乎失去了对每个参数进行特定额外检查的能力,就像人们做的那样x_?NumericQ
.
我的问题是:在Mathematica中有没有办法制作记录或结构,但是能够在各个元素上使用上述检查?
我试图找到一种方法来使用,因为我厌倦了在它们上面调用10个参数的函数(有时候一个人无法避免这种情况),即使我试图使每个函数都非常具体,最小化数量参数,一些功能只需要很多参数来完成特定的工作.
首先,我展示了我所知道的三种方法.
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
foo[p]
Run Code Online (Sandbox Code Playgroud)
优点:安全,好像我将符号'从'更改为其他东西,它仍然有效.如下例所示.
foo[p_]:=Module[{},
Plot[Sin[x],{x,from/.p,to/.p}]
]
p={from->-Pi,to->Pi};
from=-1; (* By accident the symbol from was set somewhere. It will work*)
foo[p]
Run Code Online (Sandbox Code Playgroud)
Clear[p,foo];
foo[p_]:=Module[{},
Print[p];
Plot[Sin[x],{x,p["from"],p["to"]}]
]
p["from"] = -Pi;
p["to"] = Pi;
foo[p]
Run Code Online (Sandbox Code Playgroud)
优点:也是安全的,字符串是不可变的.不必担心"从"值的变化.但到处都有字符串不太可读?
Clear[p,to,from];
foo[p_]:=Module[{},
Plot[Sin[x],{x,p[from],p[to]}]
]
p[from] = -Pi;
p[to] = Pi;
foo[p]
Run Code Online (Sandbox Code Playgroud)
缺点:如果任何符号'从'或'到'某处被覆盖,将导致问题,如
from=-4; (*accidentally the symbol from is assigned a value*)
foo[p]
Run Code Online (Sandbox Code Playgroud)
所以.我认为方法(1)是最安全的.但现在我失去了这样做的能力:
foo[from_?NumericQ, to_?NumericQ] := Module[{},
Plot[Sin[x], {x, from, to}] …
Run Code Online (Sandbox Code Playgroud)