我将开始学习抽象代数组,环等.我有兴趣了解任何编程语言,如果有的话可以帮助我学习/尝试我在理论上学到的概念.
编辑:我并不是在考虑实施我学到的东西.我有兴趣知道任何已经支持它们的语言.
前几天我想知道StackOverflow是否有我可以从Mathematica访问的API,显然它确实:"保存绘图注释"
从StackOverflow获取数据到Mathematica的最佳方法是什么?Sjoerd利用这些信息制作了一个情节.我有兴趣将SO相关的通知添加到我保存在笔记本中的停靠单元格中,因此我可以在不离开Mathematica的情况下判断何时有更新或响应.
在Mathematica中,如何在给定数字处绘制水平线?如何在给定数字处绘制垂直线?
在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)
使用paircons单元格的符号具有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秒到nestLength0.055秒.但是,偶尔whileLength需要约4秒钟.我认为可能存在一些缓存行为,所以我开始生成新的随机列表来检查,并且whileLength在第一次运行时使用新列表不一定会很慢; 可能需要几十次才能看到减速,但之后它不会再发生(至少不是我在每个列表中尝试的200次运行).
可能会发生什么?
作为参考,我用于测试的功能是这样的: …
我在mathematica中主要是一个Table函数用户.但是我注意到在几个使用Array而不是Table来表示相同结果的例子中,它运行速度明显更快,尤其是随着表的维度变大.
所以我的问题是:当执行速度是主要问题时,何时最适合使用表?
是什么解释了这种差异
我的猜测是因为Arrays假设列表中的项目之间存在功能关系,它会更有效地存储它们,因此使用更少的内存,从而便于存储和后续处理?
它是怎么回事?
老习惯很难,我意识到我一直在使用opts___Rule模式匹配和构造,就像thisoption /. {opts} /. Options[myfunction]我正在开发的非常大的包中一样.Sal Manango的"Mathematica Cookbook"让我想起,版本6后的做法是opts:OptionsPattern[]和OptionValue[thisoption].无论如何,该软件包需要版本8,但我从未改变过多年来编写此类代码的方式.
是否值得从我的pre-version-6做事方式重构所有这些?是否有表现或其他好处?
问候
维尔比亚
编辑:摘要
为回答这个问题,我们提出了很多好处,所以谢谢你们(当然还有一个).总结一下,是的,我应该重构使用OptionsPattern和OptionValue.(注意:OptionsPattern不像OptionPattern以前那样!)原因有很多:
HoldForm(@Leonid)OptionsPattern自动检查您是否将有效选项传递给该函数(FilterRules如果要传递给其他函数,仍然需要它(@Leonid)RuleDelayed(:>)更好(@rcollyer)Flatten(@Andrew)OptionValue /@ list而不是多次调用来分配多个局部变量更容易一些someoptions /. {opts} /. Options[thisfunction](在@rcollyer和我之间的评论中提出)编辑:7月25日我最初认为使用/.语法的一次可能仍然有意义,如果你故意从另一个函数中提取默认选项,而不是实际调用的那个.事实证明,这是通过使用其中OptionsPattern[]包含头部列表的形式来处理的,例如:( OptionsPattern[{myLineGraph, DateListPlot, myDateTicks, GraphNotesGrid}]请参阅文档中的"更多信息"部分).我最近才解决这个问题.
对我来说,g /: f[g[x_]] := h[x]只是冗长等同于f[g[x_]] := h[x].你能提出一个你必须使用的例子/:吗?
我正在构建一个基于网络的编程语言,部分受到Prolog和Haskell的启发(不要笑).
它已经具有相当多的功能,您可以在http://www.lastcalc.com/上查看原型.您可以在此处查看源代码并在此处阅读有关架构的信息.记住它是原型.
目前,LastCalc无法简化表达式或求解方程式.我不想在Java中对其进行硬编码,而是希望增强基本语言,以便可以使用语言本身来扩展它来执行这些操作(与Prolog一样).与Prolog不同,LastCalc具有更强大的搜索算法,Prolog是"具有回溯的深度优先搜索",LastCalc目前使用启发式最佳优先搜索.
在深入研究之前,我想更多地了解其他系统如何解决这个问题,特别是Mathematica/Wolfram Alpha.
我认为这个想法,至少在一般情况下,是你给系统一套规则来操纵方程(比如a*(b+c) = a*b + a+c)指定目标(例如,隔离变量x),然后让它松散.
所以,我的问题是:
我还要感谢任何其他的建议(除了"放弃" - 我经常忽略这条建议,这样做对我有好处;).
algorithm wolfram-mathematica artificial-intelligence algebra
我认为Mathematica偏向于行而不是列.
给定一个矩阵,插入一行似乎很容易,只需使用 Insert[]
(a = {{1, 2, 3}, {4, 0, 8}, {7 , 8, 0}}) // MatrixForm
1 2 3
4 0 8
7 8 0
row = {97, 98, 99};
(newa = Insert[a, row, 2]) // MatrixForm
1 2 3
97 98 99
4 0 8
7 8 0
Run Code Online (Sandbox Code Playgroud)
但是为了插入一个专栏,经过一番努力之后,我找到了两种方法,我在下面展示,如果他们看到更短更直接的方式,我想问问专家(Mathematica有这么多命令,我可能忽略了一个这种事情以非常直接的方式完成),因为我认为我现在拥有的方法对于这样的基本操作来说仍然过于复杂.
必须做双转置:
a = {{1, 2, 3}, {4, 0, 8}, {7 , 8, 0}}
column = {97, 98, 99}
newa = Transpose[Insert[Transpose[a], column, 2]]
1 97 2 3
4 …Run Code Online (Sandbox Code Playgroud)