标签: wolfram-mathematica

在Mathematica中实现四叉树

我在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)

wolfram-mathematica quadtree

30
推荐指数
2
解决办法
3370
查看次数

Mathematica:Unevaluated vs Defer vs Hold vs HoldForm vs HoldAllComplete vs etc等

我被搞糊涂了所有内置在声称为防止评价在某种程度上数学函数:Unevaluated,Defer,Hold,以及超过一半的形式的打Hold*.Mathematica文档只是单独解释了每个函数,但没有解释为什么要选择其中一个函数.任何人都可以对所有这些功能提供一致的解释吗?整件事对我来说似乎是一个令人费解的混乱.将它全部与Lisp宏相关可能是一个很好的起点.

大多数Mathematica语言都设计得非常好,但看起来Wolfram真的把自己描绘成了这方面的一个角落.或者我可能会遗漏一些东西.

lisp macros wolfram-mathematica language-design

29
推荐指数
1
解决办法
1999
查看次数

对列表按顺序创建元组

我想结合两个列表.如果我有以下两个列表:{a,b,c,d}{1,2,3,4}什么我需要做的,使我得到{{a,1}, {b,2}, {c,3}, {d,4}}

wolfram-mathematica tuples list

29
推荐指数
3
解决办法
2万
查看次数

秘密圣诞老人 - 生成"有效"排列

我的朋友们邀请我回家玩秘密圣诞老人的游戏,在那里我们应该抽出很多东西,并为小组中的朋友扮演'圣诞老人'的角色.

所以,我们写下所有的名字并随机选择一个名字.如果我们中的任何一个人最终选择了自己的名字,那么我们会重新洗牌并重新挑选名字(理由是一个人不能成为自己的圣诞老人).

我们有七个人在玩,所以我认为最后的"圣诞老人分配"是(1:7)对自身的排列,有一些限制.

我想邀请各种想法,关于我们如何使用Mathematica特定的或任何编程语言甚至算法来:

  • 列出/打印出所有"有效"的圣诞老人分配
  • 随着玩"秘密圣诞老人"的朋友数量增加,可扩展性

algorithm wolfram-mathematica permutation combinatorics

29
推荐指数
4
解决办法
2579
查看次数

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

28
推荐指数
1
解决办法
2705
查看次数

使用With对比绘图使用Block(Mathematica)绘图

我想描述我一直有一个问题与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用户进一步解释.

绘图输出

在此输入图像描述

但是,最近我发现偶然的机会,取代 …

wolfram-mathematica

28
推荐指数
1
解决办法
3679
查看次数

如何找到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中找到发生此错误的行?

debugging wolfram-mathematica

28
推荐指数
4
解决办法
6867
查看次数

抽象代数与编程

我将开始学习抽象代数组,环等.我有兴趣了解任何编程语言,如果有的话可以帮助我学习/尝试我在理论上学到的概念.

编辑:我并不是在考虑实施我学到的东西.我有兴趣知道任何已经支持它们的语言.

computer-science wolfram-mathematica algebra

26
推荐指数
4
解决办法
1万
查看次数

Sprintf相当于Mathematica?

我不知道为什么维基百科将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中使用的最佳方式吗?

wolfram-mathematica

26
推荐指数
3
解决办法
5331
查看次数

如何从Mathematica访问StackOverflow API

前几天我想知道StackOverflow是否有我可以从Mathematica访问的API,显然它确实:"保存绘图注释"

从StackOverflow获取数据到Mathematica的最佳方法是什么?Sjoerd利用这些信息制作了一个情节.我有兴趣将SO相关的通知添加到我保存在笔记本中的停靠单元格中,因此我可以在不离开Mathematica的情况下判断何时有更新或响应.

wolfram-mathematica

26
推荐指数
2
解决办法
1703
查看次数