我在Mathematica中实现了一个四叉树.我不熟悉像Mathematica这样的函数式编程语言,我想知道我是否可以通过更好地使用模式来改进它或使其更紧凑.
(我知道我可以通过修剪未使用的节点来优化树,并且可能有更好的数据结构,如用于空间分解的kd树.)
此外,每次添加新点时,我仍然不满意复制整个树/表达式的想法.但我的理解是,对整个表达式进行操作而不修改部分是函数式编程方式.我对这方面的任何澄清表示感谢.
MV
代码
ClearAll[qtMakeNode, qtInsert, insideBox, qtDraw, splitBox, isLeaf, qtbb, qtpt];
(* create a quadtree node *)
qtMakeNode[{{xmin_,ymin_}, {xmax_, ymax_}}] :=
{{}, {}, {}, {}, qtbb[{xmin, ymin}, {xmax, ymax}], {}}
(* is pt inside box? *)
insideBox[pt_, bb_] := If[(pt[[1]] <= bb[[2, 1]]) && (pt[[1]] >= bb[[1, 1]]) &&
(pt[[2]] <= bb[[2, 2]]) && (pt[[2]] >= bb[[1, 2]]),
True, False]
(* split bounding box into 4 children *)
splitBox[{{xmin_,ymin_}, {xmax_, ymax_}}] := {
{{xmin, (ymin+ymax)/2}, {(xmin+xmax)/2, …Run Code Online (Sandbox Code Playgroud) 我被搞糊涂了所有内置在声称为防止评价在某种程度上数学函数:Unevaluated,Defer,Hold,以及超过一半的形式的打Hold*.Mathematica文档只是单独解释了每个函数,但没有解释为什么要选择其中一个函数.任何人都可以对所有这些功能提供一致的解释吗?整件事对我来说似乎是一个令人费解的混乱.将它全部与Lisp宏相关可能是一个很好的起点.
大多数Mathematica语言都设计得非常好,但看起来Wolfram真的把自己描绘成了这方面的一个角落.或者我可能会遗漏一些东西.
我想结合两个列表.如果我有以下两个列表:{a,b,c,d}和{1,2,3,4}什么我需要做的,使我得到{{a,1}, {b,2}, {c,3}, {d,4}}?
我的朋友们邀请我回家玩秘密圣诞老人的游戏,在那里我们应该抽出很多东西,并为小组中的朋友扮演'圣诞老人'的角色.
所以,我们写下所有的名字并随机选择一个名字.如果我们中的任何一个人最终选择了自己的名字,那么我们会重新洗牌并重新挑选名字(理由是一个人不能成为自己的圣诞老人).
我们有七个人在玩,所以我认为最后的"圣诞老人分配"是(1:7)对自身的排列,有一些限制.
我想邀请各种想法,关于我们如何使用Mathematica特定的或任何编程语言甚至算法来:
在制定另一个SO问题的答案时,我在Mathematica中遇到了一些关于尾递归的奇怪行为.
在数学文档暗示,尾调用优化的可能被执行.但我自己的实验给出了相互矛盾的结果.对比,例如,以下两个表达式.第一个崩溃7.0.1内核,可能是由于堆栈耗尽:
(* warning: crashes the kernel! *)
Module[{f, n = 0},
f[x_] := (n += 1; f[x + 1]);
TimeConstrained[Block[{$RecursionLimit = Infinity}, f[0]], 300, n]
]
Run Code Online (Sandbox Code Playgroud)
第二个运行完成,似乎利用尾调用优化来返回有意义的结果:
Module[{f, n = 0},
f[x_] := Null /; (n += 1; False);
f[x_] := f[x + 1];
TimeConstrained[Block[{$IterationLimit = Infinity}, f[0]], 300, n]
]
Run Code Online (Sandbox Code Playgroud)
两个表达式都定义了尾递归函数f.在第一个函数的情况下,Mathematica显然认为复合语句的存在足以击败尾调用优化的任何机会.还要注意,第一个表达式由$RecursionLimit第二个表达式控制,第二个表达式由$IterationLimitMathematica以不同方式处理这两个表达式.(注意:上面提到的SO答案有一个较少设法的功能,成功利用尾部调用优化).
所以,问题是:有没有人知道Mathematica对递归函数进行尾调用优化的情况?在Mathematica文档或其他WRI材料中提及最终陈述将是理想的.投机也很受欢迎.
recursion wolfram-mathematica tail-recursion tail-call-optimization
我想描述我一直有一个问题与Plot使用With,以保持定义的参数"本地".我不一定要求解决问题:我遇到的问题是理解问题.
有时候我使用如下的结构来获得一个Plot:
方法1
plot1 = With[{vmax = 10, km = 10},
Plot[Evaluate@((vmax x)/(km + x)), {x, 0, 100},
AxesOrigin -> {0, 0}]]
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方法,即使对于非Mathematica用户来说,它也是相当清楚的.
当要绘制的方程式变得更加复杂时,我喜欢在绘图外部定义它们(使用SetDelayed).例如:
f[x_] := (vmax x)/(km + x)
Run Code Online (Sandbox Code Playgroud)
但是,以下不起作用
方法2
plot2 = With[{vmax = 10, km = 10},
Plot[Evaluate@f[x], {x, 0, 100}, AxesOrigin -> {0, 0}]]
Run Code Online (Sandbox Code Playgroud)
我一直天真地认为它应该.但是,基于Help语句
Plot将变量x视为本地,有效地使用Block
我使用过各种解决方法,大多数情况如下
方法3
plot3 = Plot[With[{vmax = 10, km = 10}, Evaluate@f[x]], {x, 0, 100},
AxesOrigin -> {0, 0}]
Run Code Online (Sandbox Code Playgroud)
这个看起来很尴尬,甚至通常需要对Mathematica用户进一步解释.
绘图输出

但是,最近我发现偶然的机会,取代 …
我有一个名为myUsefulFunctions.m的Mathematica文件,其中包含一个名为mySuperUsefulFunction的函数.假设我在笔记本中调用mySuperUsefulFunction并收到以下错误:
Part::pspec: Part specification #1 is neither an integer nor a list of integers. >>
Run Code Online (Sandbox Code Playgroud)
有没有办法在myUsefulFunctions.m中找到发生此错误的行?
我将开始学习抽象代数组,环等.我有兴趣了解任何编程语言,如果有的话可以帮助我学习/尝试我在理论上学到的概念.
编辑:我并不是在考虑实施我学到的东西.我有兴趣知道任何已经支持它们的语言.
我不知道为什么维基百科将Mathematica列为printf的编程语言.我在Mathematica中找不到相应的东西.
我的具体任务是处理带有填充数字的数据文件列表,我曾经在bash中使用
fn=$(printf "filename_%05d" $n)
Run Code Online (Sandbox Code Playgroud)
我在Mathematica中找到的最接近的函数是PaddedForm.经过一些反复试验,我得到了它
"filename_" <> PaddedForm[ Round@#, 4, NumberPadding -> {"0", ""} ]&
Run Code Online (Sandbox Code Playgroud)
我必须使用数字4来获得与"%05d"相似的结果,这很奇怪.我根本不明白这种行为.有人可以向我解释一下吗?
它是实现我曾经在bash中使用的最佳方式吗?
前几天我想知道StackOverflow是否有我可以从Mathematica访问的API,显然它确实:"保存绘图注释"
从StackOverflow获取数据到Mathematica的最佳方法是什么?Sjoerd利用这些信息制作了一个情节.我有兴趣将SO相关的通知添加到我保存在笔记本中的停靠单元格中,因此我可以在不离开Mathematica的情况下判断何时有更新或响应.