标签: wolfram-mathematica

Mathematica中函数和模式匹配之间的性能差异

所以Mathematica与lisp的其他方言不同,因为它模糊了函数和宏之间的界限.在Mathematica中,如果用户想要编写数学函数,他们可能会使用模式匹配,f[x_]:= x*x而不是f=Function[{x},x*x]两者都会在调用时返回相同的结果f[x].我的理解是第一种方法相当于一个lisp宏,并且由于语法更简洁,我的经验受到青睐.

所以我有两个问题,执行函数与模式匹配/宏方法之间是否存在性能差异?虽然函数实际上转换为某些版本的宏以允许实现的功能,但我的一部分不会感到惊讶Listable.

我关心这个问题的原因是因为最近关于试图在大型程序中捕获Mathematica错误的问题(1) (2).如果大多数计算是根据函数定义的,那么在我看来,跟踪评估的顺序和错误发生的位置比在连续应用宏来重写输入后尝试捕获错误更容易/模式.

lisp wolfram-mathematica

20
推荐指数
3
解决办法
2473
查看次数

使用字符串而不是符号:好还是坏?

通常情况下,我发现自己处理表单的功能选项列表(或更常见的替换列表){foo->value,...}.当foo已经在$ Context中有一个值时,这会导致错误.一种显而易见的方法是使用字符串"foo"而不是符号:{"foo"->value,...}.这很有效,但似乎让我知道的一些经验丰富的LISPers感到愤怒,他们惩罚我混淆符号和字符串并告诉我使用内置的引用结构.

虽然这绝对有可能写的是避免冲突,而不使用字符串代码,它往往显得更麻烦比它的价值.另一方面,我没有看到太多{"string"->value}类型替换规则的例子.所以问题是 - 这是一种可以接受的使用模式吗?..是否有特别合适的情况?......应该避免哪里?

wolfram-mathematica

20
推荐指数
1
解决办法
659
查看次数

数学未知的Mathematica中的符号矩阵

有没有办法在Mathematica中对尺寸未知的矩阵进行符号矩阵代数?例如,如果我有一个MxL矩阵A和一个LxN矩阵B,我希望能够输入

A.B
Run Code Online (Sandbox Code Playgroud)

并给它一个矩阵,其元素ab[i,j]由.给出

Sum[a[i,l]*b[l,j],{l,1,L}]
Run Code Online (Sandbox Code Playgroud)

我正在研究的问题就像这个问题,但涉及12个矩阵的乘积,包括重复几次相同的矩阵(和它的转置).可能有可能简化得到的矩阵的值,但是在我进行代数之后,这是否可行是不可能的.这可能是我必须手工解决的问题,但如果Mathematica可以在简化代数方面提供一些帮助,那将会容易得多.

wolfram-mathematica

20
推荐指数
2
解决办法
9182
查看次数

SaveDefinitions被认为是危险的

SaveDefinitions是一个不错的选择Manipulate.它导致Manipulate在Manipulate面板中存储用于创建的任何定义.以这种方式制作的Manipulate可以复制到空白笔记本中,并且仍然可以单独使用.此外,包含许多此类操作的工作笔记本也不会变成粉红色的盒子,打开时会在其下方打印错误消息.大!

然而,所有这些善良都有它的黑暗面,如果你不知道它,它会让你真的很难受.我已经在我已经工作了几天的笔记本中使用了这个,但是我向您展示了一个重新创建问题的分步玩具示例场景.

在这种情况下,你想创建一个Manipulate漂亮的波浪函数的图,所以你定义这个(请创建一个像这样的窗口大小,这很重要):

在此输入图像描述

定义很好,所以我们下次保留它并使其成为初始化单元.接下来我们添加Manipulate,并执行它.

f[x_] := x^2

Manipulate[
 Plot[n f[x], {x, -3, 3}],
 {n, 1, 4},
 SaveDefinitions -> True
 ]
Run Code Online (Sandbox Code Playgroud)

一切都很棒,Manipulate真的很闪耀,这是美好的一天.

在此输入图像描述

只是做你的偏执自我,检查定义是否正常:

在此输入图像描述

是的,一切仍然检查出来.精细.但现在你想到一个更好的波浪函数是正弦,所以你改变定义,执行和偏执,检查:

在此输入图像描述

一切都还好.你已经准备好从一天的努力中挽救你的工作并退出.[退出内核]

明天.你重新开始工作了.您评估笔记本中的初始化单元格.定义还好吗?校验.

在此输入图像描述

现在,您向下滚动到Manipulate框(不需要重新执行SaveDefinitions),使用滑块稍微玩一下.并向上滚动.

在此输入图像描述

作为你的偏执狂,你再次检查f的定义:

在此输入图像描述

瞧,有人改变了你背后的定义!Information根据In []数字(In[1]:def为f,In[2]第一个?,In[3]第二个?),在第一个和第二个(?)检查之间没有执行任何操作.

发生了什么?嗯,这Manipulate当然是.A FullForm揭示其内部结构:

Manipulate[Plot[n*f[x],{x, -3, 3}],{{n, 2.44}, 1, 4},Initialization:>{f[x_] := x^2}]
Run Code Online (Sandbox Code Playgroud)

你有罪魁祸首.框的初始化部分再次定义f,但它是旧版本,因为我们Manipulate在修改其定义后没有重新评估.一旦操纵盒出现在屏幕上,它就会被评估,并且您已经恢复了原来的定义.在全球范围内!

当然,在这个玩具示例中,很明显发生了一些奇怪的事情.在我的情况下,我在一个更大的笔记本中有一个更大的模块,在经过一些调试后,我改变了一小部分.它似乎工作,但第二天,同样的错误,在再次击中之前曾经惹过我.我花了几个小时才意识到我用来研究各方面问题的几个操作中的一个是这样做的.

显然,我很想说,这是不受欢迎的行为.现在,对于强制性问题:除了在每次更改可能由他们使用的定义时重新执行笔记本中的每个操作之外,我们还能做些什么来防止这种背后行为Manipulate发生Manipulate

wolfram-mathematica mathematica-frontend

20
推荐指数
2
解决办法
1003
查看次数

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

如何使用Mathematica绘制经典状态图?

Mathematica绘制这样的东西(由Graphviz创建)是否可行且实用:

在此输入图像描述

这是我能得到的最好的(但形状和风格并不令人满意):

在此输入图像描述

码:

GraphPlot[{{A -> C, "go"}, {C -> B, "gone"}, {C -> D, 
   "went"}, {C -> C, "loop"}}, VertexLabeling -> True, 
 DirectedEdges -> True]
Run Code Online (Sandbox Code Playgroud)

drawing wolfram-mathematica state-diagram

20
推荐指数
2
解决办法
1828
查看次数

在Mathematica中快速实现Position2D

我正在寻找以下快速实现,我会称之为Position2D缺乏一个更好的术语:

Position2D[ matrix, sub_matrix ]
Run Code Online (Sandbox Code Playgroud)

它找到sub_matrix内部的位置matrix并返回匹配的左上角和右下角/列.

例如,这个:

Position2D[{
 {0, 1, 2, 3},
 {1, 2, 3, 4},
 {2, 3, 4, 5},
 {3, 4, 5, 6}
}, {
 {2, 3},
 {3, 4}
}]
Run Code Online (Sandbox Code Playgroud)

应该归还:

{
 {{1, 3}, {2, 4}},
 {{2, 2}, {3, 3}},
 {{3, 1}, {4, 2}} 
}
Run Code Online (Sandbox Code Playgroud)

它应该足够快,可以快速处理3000x2000具有100x100子矩阵的矩阵.为简单起见,仅考虑整数矩阵就足够了.

wolfram-mathematica

20
推荐指数
4
解决办法
1490
查看次数

从n维单位单形中随机均匀地采样

从n维单位单形中随机均匀地采样是一种奇特的方式,可以说你需要n个随机数

  • 他们都是非负面的,
  • 他们总结为一个,和
  • n个非负数的每个可能的矢量总和为1是可能的.

在n = 2的情况下,您希望从正象限中的线x + y = 1(即,y = 1-x)的线段均匀地采样.在n = 3的情况下,你是从平面的三角形部分采样x + y + z = 1,它位于R3的正八分圆中:

(图片来自http://en.wikipedia.org/wiki/Simplex.)

请注意,选择n个统一的随机数,然后将它们归一化,使它们总和为1不起作用.你最终倾向于不那么极端的数字.

类似地,选择n-1个均匀随机数然后将第n个减去它们的总和也会引入偏差.

维基百科提供了两种算法来正确地做到这一点:http: //en.wikipedia.org/wiki/Simplex#Random_sampling (虽然第二个目前声称只在实践中是正确的,不是理论上的.我希望能够清理它或者当我更好地理解这一点时澄清它.我最初在维基百科页面上发表了"警告:这样的论文声称以下是错误的",并且其他人将其变成了"仅在实践中作品"的警告.)

最后,问题是:您认为Mathematica中单纯形采样的最佳实现是什么(最好用经验证实它是正确的)?

相关问题

random math wolfram-mathematica

19
推荐指数
4
解决办法
5023
查看次数

有效地使用(和生成)大型文本文件

作为我工作的一部分,我正在处理非常大的文本文件,并在一定程度上分析它们的单词和短语频率.我遇到了计算时间,内存限制和提取相关信息的困难.

对于这个程序,我正在处理一个已经清理过的大文本文件(比如50MB),变成小写.但除此之外它只是非结构化的文本.我试图生成'bigrams','trigrams,'quadgrams'和'fivegrams'的列表 - 分别是经常出现的两个,三个,四个和五个单词短语的组合(即"我是"是一个二重奏,"我是自由的"是一个三元组,"我自由总是"是一个四元组".

我现在在做什么?

这是我当前的代码,其中inputlower是一个全小写字符串(使用Mathematica抓取的Web数据).

inputlower=Import["/directory/allTextLowered.txt"];
bigrams = 
  Sort[Tally[Partition[inputlower, 2, 1]], #1[[2]] > #2[[2]] &];
Export["/directory/bigrams.txt", bigrams];    
Clear[bigrams];
trigrams = 
  Sort[Tally[Partition[inputlower, 3, 1]], #1[[2]] > #2[[2]] &];
Export["/directory/trigrams.txt", trigrams];
Clear[trigrams];    
quadgrams = 
  Sort[Tally[Partition[inputlower, 4, 1]], #1[[2]] > #2[[2]] &];
Export["/directory/quadrams.txt", quadgrams];
Clear[quadgrams];
fivegrams = 
  Sort[Tally[Partition[inputlower, 5, 1]], #1[[2]] > #2[[2]] &];
Export["/directory/fivegrams.txt", fivegrams];
Run Code Online (Sandbox Code Playgroud)

在某种程度上,它运作良好:我确实得到了生成的信息,并且在较小的尺度上,我发现这个代码工作得足够快,我可以得到一些近似于可行Manipulate[]程序的东西.但是,当我们处理大量投入时......

使用大文件时有什么问题?

最重要的是,我的输出文件太大而无法使用.有没有办法在代码中指定一个断点:例如,我不想要任何只出现一次的'bigrams'?如果证明仍然留下太多信息,是否有办法指明我不希望文件中有任何"bigrams",除非它们出现的次数超过10次?即如果"我的奶酪"出现20次,我想知道它,但如果"我垫"只出现一次,也许失去它会使文件更易于管理?

其次,这些过程需要很长时间:单独生成二元输出需要两到三个小时.我是否以有效的方式解决这个问题?

第三,如果我确实有一个包含所有信息的大型bigram文件(~650MB +),Mathematica是否有办法访问信息而不将其全部加载到内存中 - 即获取名为bigrams.txt的文件,了解它包含{{"i","am"},55}没有阻塞系统?

编辑

[截至12月7日,我删除了我提出的示例文件 - 再次感谢所有人]

wolfram-mathematica

19
推荐指数
4
解决办法
3357
查看次数

在更高的抽象级别上进行概率计算

对于downvoters:这不是关于数学的问题,而是关于编程语言Mathematica的问题.

Mathematica的主要特征之一是它可以象征性地处理许多事情.但是如果你想一想,许多象征性的特征实际上只是象征性的一半.

以矢量为例.我们可以有像{X,Y,Z}符号载体,做一个矩阵乘法用满符号矩阵,并用象征性的结果结束了,所以我们可能会考虑的是象征性的向量代数.但我们都知道,开箱即用,Mathematica不允许你说符号x是一个向量,并给出一个矩阵A, A.x也是一个向量.这是一个更高级别的抽象,Mathematica(目前)并没有很好地处理.

类似地,Mathematica知道如何找到一个函数的五阶导数,这个函数是用符号来定义的,但是它并不适合于找到r阶导数(参见" 当r在Mathematica中是符号时如何找到函数的导数") ? "问题).

此外,Mathematica具有广泛的布尔代数能力,有些是古老的,但最近很多都是在版本7中获得的.在版本8中,我们得到了概率和朋友(例如条件),它允许我们推断具有给定分布的随机变量的概率.这是一个非常壮观的补充,这有助于我熟悉这个领域,我非常喜欢与它合作.然而,...

我和同事讨论了一些像熟悉的概率逻辑规则

在此输入图像描述

即,给定事件/状态/结果A的事件/状态/结果C的条件概率为真.

具体来说,我们正在考虑这个:

在此输入图像描述

虽然Probability在我意识到我不知道如何使用Mathematica立即解决这个问题之前我已经高度评价了Mathematica.同样,就像抽象向量和矩阵以及符号导数一样,这似乎是一个过高的抽象层次.或者是吗?我的问题是:

您能找到一种方法,使用Mathematica程序在上述和类似的方程中找到真或假吗?

wolfram-mathematica mathematica-8

19
推荐指数
1
解决办法
639
查看次数