首页 > Mathematica > 我为什么喜欢Mathematica!

我为什么喜欢Mathematica!

2014年4月5日 发表评论 阅读评论

celebrating-25-years-of-mathematica先说为什么要写这么一篇,首先一个原因是我很喜欢把我喜欢的东西(特指无生命的)介绍给别人,比如Latex啊,Python啊,C++啊,印象笔记啊,Github啊,动画啊,漫画啊,B站啊之类的,但是不知道为什么他们总是说我拉他们跳坑。。连最近来的小师妹都说我总是带来各种坑。。。

于是乎呢,我周围很多人都被我拉进了Mathematica的坑,从高中同学,到本科同学,再到研究生同屋,再到同实验室的,然后再到不同实验室的。。其实经常看我博客的人都会有所了解:我对Mathematica是真爱这件事情。。而且有些留言(2条)表示找到我博客都是因为找Mathematica资料找到这里来的。。。orz。。其实我才写了几篇不是么?

喜欢拉人入坑是我的天性,懒惰更是我的根性。。。每次拉一个人入坑,我都会给他演示半天我正在“推销”的这款东西的各种好玩的地方【妈蛋,难道我将来应该去做推销?】,我觉得我以后还是会拉人入坑,我以后还是会这么懒,所以我准备就直接写一篇文章,将来想拉人入坑的时候,直接把这一篇扔给他看就得了。

还有一点初衷就是,其实中国大学生里面Mathematica的普及率远远没有Matlab高,完全没有说Matlab不好的意思,因为我也很爱用这个东西,只是我觉得应该让更多的人了解到Mathematica这东西,所以写下此文。。。好吧,其实这条理由是我刚编出来的。。。


首先,据说Mathematica(下面简称Mma)是世界上最复杂的软件系统,我暂时也是这么认为的。。为什么?后面我会慢慢解释。

其次,我想说的是,我为什么喜欢Mma,不仅因为它强大(因为复杂?),更因为我觉得是交互上最好的一款系统;

友好度(前篇):输入

我觉得很多人是不是都受够了各种语言(C++,Python,Matlab,JS,PHP,好吧,指的基本上是所有的语言)里面的算式输入,比如说你必须写乘号,一个算式里面又乘又加又除又指数的时候你看代码难道不难受么?感受一下。。

(x+2^(3+a/d^i))/sqrt(x^(y+z)*(3+3/d))

这时候你会想,如果写出来像手写那种就好了,是吧~Mma所支持的最让人喜欢的一个特性就是,公式和你手写的差不多!!
1

除号,开n次方,Σ求导,偏微分,积分,相乘,各种希腊字符,没错,这是一门编程语言!!不是Word或者PDF!!【顺便提醒感受一下最后一个例子】

如果有看过之前那篇《Mathematica给图片去水印》的话,就可以体会到另一件事情:图片本身就可以作为参数传进函数里面【别的语言都是先把图片保存在本地,程序设置一个img变量,imgread读取图片,然后再处理】;

再举一个例子,以前的博文《生命游戏&兰顿蚂蚁》中,我从维基娘那里找到一张图片:
2

然后我希望得到一个二维矩阵,大小就是上面这张图的横宽格子数,如果这个格子里面是黑色,那么这个位置的值是1,否则为0,那么我可以把图片本身当做参数传进代码里面,这样就省去了保存到本地,再读取的步骤。
3
这种交互方式你不觉得简直人性化到极点了么?

强大

友好的交互不能体现一款软件的强大!!但是上面计算\(\sum\limits_{i=1}^{\infty}\dfrac{1}{i^2}\)自动算出\(\dfrac{\pi^2}{6}\)不知道让各位体会到Mma的强大没。

再举几个例子,首先是两个简单的例子:
7

6
然后再看看复杂一点的,我以前很喜欢用Mma来做很数学的课的作业是因为它算这种东西毫无压力:
5

再看一个例子体会一下:
4

这就是为什么Mma表达式计算可以完爆Matlab十万光年的原因,Again,还是没有黑Matlab的意思。。因为你不能以己之长,较人之短嘛。。

好,如果你手上有一个很强大的表达式计算工具,你会想到什么?没错,推公式/验证公式!!(某师兄怒躺一枪)第一个例子可以去看看以前的那篇倒立摆的博文的前面部分体会一下~

再随手写些例子,比如验证公式,例子虽然简单,但是强大是不言而喻的:
8

再比如化简公式之类的:9

或者三角恒等式:
10

Mma自带了解大部分恒等式化简规则,但是对于有些Mma无法解读的那些,你可以自己写规则告诉它,然后再用这些规则去推别的公式,比如众所周知的,我们可以把\(sin(cos(x))\)展开成一系列贝塞尔函数的和的这种法则,写下这套规则后你就可以去推那些载波啊什么的相关公式了。【好吧,我知道这一段看懂的人不多。。所以我就不举例子了。。】

Mma的表达式支持的那么好,而且交互那么友善,自然分段函数这种东西应该毫无压力不是么?
11

请问你家Matlab是怎么完成分段函数的?再次重申,没有黑matlab的意思。。不信的话我换一句咯。。请问你家汇编是怎么完成分段函数的?

Mma还有一个很强大的功能,就是带单位的计算,比如说吧:
13

嘿,你说我大Matlab也可以实现啊,只要记住各个单位之间的比例就可以了啊,且看这个例子:
14

请问Matlab先生你懂什么事字符串相除,字符串相乘么?

不过单位支持是9.0版本以后的新特性了,相信装了9.0的对下面这幅图都不陌生吧:
19

最后再关于表达式计算我再讲一个例子,
12

看到没,Mma在推导公式的时候,会计算出公式成立的条件!!相反的,你也可以在输入的时候就告诉它参数的条件,这样可以在某些复杂情况下降低计算时间。

函数式编程

我一直很喜欢Python的一个原因在于它对函数式编程的支持很简洁,每次用起来我都很有成就感,比如map,reduce,filter这几个函数在做Euler Project的时候我简直爱不释手,分别举个例子:

filter:
比如我想找出1~30里面大于2小于8的数,我承认这个例子已经不是弱智可以形容了。。别在意。。。

>>> def f1(x):
...     return 2 < x < 8;
...
>>> x = range(1,31);
>>> print filter(f1,x)
[3, 4, 5, 6, 7]

Mma表示不服:
15

Matlab表示我也可以!

>> x=1:30;
>> x(find(x>2 & x < 8))

ans =

     3     4     5     6     7

但是考虑到Python和Mma都可以使用了2 < x < 8这种连等式,而Matlab做不到,所以我们之后就不举它的例子了吧~

reduce:
reduce可以迭代计算某个函数,并把每次的结果作为下一次的参数,懒得想精彩的应用,就做求和好了【实际应用中应该用sum之类的函数】

>>> def f2(x,y):
...     return x+y
...
>>> x = [1,2,3,4,5];
>>> print reduce(f2,x)
15

Mma版本表示我家Fold可以实现相同功能,其实0是初始值:
16

map:
map是一个超常用的函数,你可以把某个函数作用于一个列表的每一个元素,比如对每个数求平方:

>>> def f3(x):
...     return x*x
...
>>> x = [1,2,3,4];
>>> print map(f3,x)
[1, 4, 9, 16]

Mma的Map函数也可以~
17

后台蹲着的Matlab表示按耐不住了,吼道“我也可以!!”

>> x=1:4;
>> x.^2

ans =

     1     4     9    16

不过亲爱的,你可以一行函数把一个每个元素是一个图片地址的数组的每一个图片读进来,然后做一个旋转,再存到另一个地址里面么?一行哦~

哦,对了,必须要声明的一点是,不要以实现特定功能的代码所花的行数来考虑一门语言的优劣!!比我我刚刚那样调戏Matlab是对的!!

了解Python或者Mma的人都应该知道,我上面的例子全部都写复杂了!!是的,比起上面三个函数的存在,匿名函数lambda更加有价值!!

Python的lambda函数,可以临时定义一个匿名函数,比如说上面Python代码的f3就可以写作lambda x:x*x,语法就是用lambda表示开始声明一个匿名函数,定义传入参数是x,返回x*x,所以上面三个Python代码就可以写成:

x = range(1,31);
print filter(lambda n:2<n<8,x)

x = [1,2,3,4,5];
print reduce(lambda a,b:a+b,x)

x = [1,2,3,4];
print map(lambda n:n*n,x)

所以我很爱Python!!诶?这不是在讲Mma么?好吧,扯回来,Mma也支持匿名函数,而且个人觉得比Python还简洁,因为首先,它不用像上面Python一样定义参数名为x,而是用#来表示传入的参数,如果有多个,那么就是#1,#2,#3,而且,比起Python需要用lambda这样6个字符来声明这是一个匿名函数,Mma语法规定只要在函数后面加上一个&就可以了!!

所以上面三个Mma的例子就可以改写成:
18

代码简直美不胜收,不是么?好啦好啦,别哭了,Matlab,你也有你的优点的,不是么?比如说。。。额。。好吧,我主机好像数据库空间不够了,不能再写废话了,而且我们这是一篇讲Mma的博文,让我们继续~

事实上,Mma中的匿名函数用的场合远远大于Python,毕竟Mma偏向于数学,它里面的Nest函数啊,Sort函数啊【C++ STL表示我也可以支持函数式~】,大半函数都可以传匿名函数,如果要说到这个的渊源的话,那要扯到Mma这门软件的设计思想上去,下次再扯吧。。

有没有感觉到Mma的匿名函数(在Mma里面一般叫纯函数)比Python简洁一点~但是,Mma在匿名函数在另一方面可以比Python强很多很多很多,就是传说中的递归!!

原则上,Python的lambda是可以实现递归的,但是想要理解其中的原理,那是一件非常痛苦的事情,我也相信大部分人就算用了Python的lambda,也没用过Python的lambda递归,用过Python的lambda来实现递归,也不知道为什么可以成立。而想要了解这个原理,我以前看《暗时间》的时候简直看到郁闷。。里面涉及到Y组合子这个神奇的东西,有兴趣的可以去挑战一下:传送门

但是Mma里面,可以用#0来表示纯函数本身,这样一个匿名的求阶乘的函数就可以变成:

 If[#1==1,1,#1 #0[#1-1]]&

解释一下吧,If函数的定义是If[condition,do1,do2],就是如果第一个参数condition所描述的条件成立,那么执行第二个参数do1的内容,否则执行do2的内容。

说白了上面的式子就是:

if #1 == 1:
     return 1
else:
     return #1 #0[#1-1]

其中 #1 #0[#1-1]中间省去了乘号(Mma可以像书写一样省略乘号),其实质是#1 × #0[#1-1],而我们说了#0是函数本身,所以#0[#1-1]就是给函数传进#1-1这个参数。

函数是编程就讲这么多先吧~

绘图

Mma在江湖中两个让人闻风丧胆的武器,一个是表达式的强大支持,上面已经演示过了,另一个是绘图!!Mma在绘图方面的强大,给我10篇博文都讲不完其冰山一角,我就举几个例子吧,画条正弦曲线这种Matlab都可以画的我就不举了。。

比如我们想画出让\(\sqrt{x-y^3}\)为实数的区域:
20

Mma在常用的算式作图上,基本你想要的功能都可以完成,比如直方图啊,等高图啊,密度图啊,3维图啊,矢量场图啊之类的,而且可以设置的参数极其丰富,画图来的图非常精美,这也是它闻名之处!

但是除此之外,它还可以画下面这种抽象的图:

比如说一棵有向树,大家顺便体会一下输入的格式:
21

既然可以,那么也应该可以咯~有向图
22

什么,你觉得这些太简单没意思?别傻了,我只是写博文,讲解一下而已,你真正用的时候画出来的图是这个样子的:

比如说你想分析英文字典中和wol相近的单词:
23

亦或者画个状态机来看看:

24

还有金融方面的绘图,比如可以看看这篇文章:《Graph Theory and Finance in Mathematica》

图片这个一举就举不完了,就此打住吧。。

嘿,Matlab,你在哪呢?别躲了,出来吧,我们好好聊聊,不欺负你了。。

友好度(后篇):代码可读性

如果你觉得某个Mma代码不好读,那么我觉得肯定是写代码的人的问题。【不好意思,这是一句废话,换在任何一门语言都成立,除了汇编。。】

大家不知道听过那个笑话没有,某人冒死偷了NASA的一份源代码的最后一页,然后全部都是"}}}}}}}}}}"。。。。。【Matlab跳出来说,口胡!!明明是end end end end end。。。然后遁走,好吧,其实我真的在知乎上看到有人以为Photoshop是Matlab写的。。】

同样的,在Mma里面你调用函数套函数,再套N层函数的话,很有可能会出现类似的状况:

Floor[Max[Sort[Total[Transpose[ImageData[Rasterize["比特之理"]]]]]]]

或者多个参数,参数也是调用函数那么就算很简短的函数,你也会在一开始那一会儿弄晕:

 Total[Sort[Select[Range[100],PrimeQ]]]

但是Mma表示,我有特殊的函数调用技巧,比如如果你只有一个单参数的话,可以:

Function@para

比如Range[100]就变成Range@100,这样上面的第一个例子就变成了:

Floor @ Max @ Sort @ Total @ Transpose @ ImageData @ Rasterize["比特之理"]

最后一个[]也可以用@,但是现在这样反而好看些~

第二个就变成:

 Total @ Sort @ Select[Range@100,PrimeQ]

只要函数名和变量名起的好,从左往右顺着读马上就可以理解代码的作用了。是不是感觉可读性好了很多~【附注,上面两份代码里面用的函数我都是乱写的。。。所以读完你也不知道它是干嘛的。。】

还有一种调用函数的方法,就是

para // Function

这种方法呢,一般是用于格式化一个东西,比如说:
25

这几个其实本质等于:

Column[{1,2,3,4}]
MatrixForm[{{1,2},{3,4}}]
TableForm[Array[a,{2,2}]]

体会一下这种用法,我们在C++语言里面用//表示注释,经常会用于说明一个东西,Mma将其借鉴过来,并变成一个函数!!美!!

什么时候该用@,什么时候用//,虽然你可以随意,但是还是建议根据函数功能来判断一下,虽然10//Range语法上是对的,但是可读性是不好的!!

那你问两个参数怎么办?

Para1~Function~Para2

比如从1~100中选出质数:
26

比起Select[Range[100],PrimeQ],这个就和读的顺序一样:

“1到100”“选择”“质数”来。 当然的,这种方法要不要用还是取决于函数性质!

如果我们还要找出其中的中位数,然后再转成字符串,比起写成:

 ToString[Median[Select[Range[100],PrimeQ]]]

我个人感觉啊,这样更好:

 Range[100]~Select~PrimeQ//Median//ToString

你只要横着读代码,就知道实现的是什么功能了。

我觉得我上面的例子举得不好,不足以显示出这种用法的优越性,还望各位大大提供好例子。。

其实还有很多很多语法糖,比如上面的Map函数,我们想把一个矩阵每个数加6,可以写成:

Map[#+6 &,{1,2,3}]

但是Mma中语法糖表示,Map函数还可以这么表示:

 #+6 & /@ {1,2,3}

第一次看可能有点微妙的异样感,但是相信我,当你习惯后,你会经常写后者。Mma除了@/@,还有//@等很多其它的语法糖,当你用熟了,你会觉得用Mma编程简直不能更加美妙~

规则:匹配和替换

这一个模块如果真要讲起来,比讲绘图的时间还要长,所以我决定写两句就了事~

Mma里面的匹配,替换等用法是别的语言所难以企及的,比如有一个向量,我想根据规则替换里面的某些元素:比如满足一个矩阵中\(x^n\)找出来,然后替换成\(n f(n)\),再把2乘某个变量找出来,换成4乘这个变量,那么:
mmanew
这方面我也不举例了,因为实在太多神奇的玩法了~Mma有一套非常强大的规则替换和匹配模式系统,甚至可以说Mma的一切都是规则下至变量,上至函数

在这种Rule-Based的系统下,你可以轻易编出其它软件很难完成的事。比如说你想把一个表达式里面的加法全部变成乘法:
28

为什么可以这么实现?因为Mma中加法虽然写作a+b,但是系统理解的是Plus[a,b],而上面说了,函数也是规则【因为函数相当于把规则Plus作用于成员a和b】,那么规则也是可以随意替换掉的~【发挥你的想象力,可以实现更多有趣的玩法】

比如说利用匹配和替换来完成超级简洁的冒泡排序:
29

我并不打算在这里解释上面是怎么一行实现冒泡排序的,因为你需要一点Mma的语法基础,而且你懂了之后这个代码很好懂的~

好,这一节到此结束!!简短吧~

Wolfram|Alpha

或许你不是很清楚Mathamtica的语法规则,但是很多人(爱逛社交网络的理工科大学生)都应该听过Wolfram|Alpha(下文简称W|A)这个东西吧,没听过的你可以在上面输入一下 integrate of x^4 sin xweather in hangzhou todaywater或者gdp of china这些你就会明白这个东西是干什么的了。。

30

31

32

33

很强大不是么?然而这个东西确实Mathematica的一部分,你在Mma软件中只要输入代码之前按一下=,就可以把Mma当做这个引擎来使用;你输入的东西会通过网络传到这个W|A,然后把结果返回来。【所以你需要联网】

这个有个非常之好用的地方在于,假如你忘了或者你根本不知道某个功能的函数是什么,嘿嘿,那你就可以在Mathematica中通过自然语言来描述你这个问题!!比如生成10个1~100的随机整数:

34

你看,不仅返回了结果,而且还告诉你正确的函数是什么!!相信我,虽然我举的是很简单的例子,但是W|A这套引擎比你想象的还要强大。

35

嗯,看到没,即便你的英语没过关,不知道number应该要加s,Mma也会原谅你。。。【这样自我吐槽真的好么。。】

帮助文档

我个人认为,Mma拥有着所有编程软件里面最好的说明文档!!比起C++的MSDN,Matlab的help,Python的官方文档,linux的--help,要强太多太多了。原因有以下几个:

第一,帮助中心里面有全套的,最权威的教程,你,根本,不需要买任何这方面的书,因为任何书都比不上它!!【中文的!!看到没有!!!】
36

第二,对于任何一个函数,你可以直接按F1进入这个函数的说明文档,这个函数说明是最最最友善的东西了;

首先,嗯,它是全中文的!!【应该说,它有全中文的】

其次,它里面说明了每一个参数的意义,中文的;

然后对于每一个参数的用法,都有举至少一个非常经典的例子,基本保证一看就懂;

再其次,它会说明每个函数会在什么情况下会出现问题;

再再再其次,它还会告诉你一些相关的函数;【我经常就是想画一个什么图,然后就先F1一下Plot这个最基本的函数,显然Plot不是我想要的那个函数,但是在下面相关函数里面找一下基本就可以马上找到我想要的东西了~】;

再再再再其次,下面还有某一个专题的教程,没错,专题!!比如你想搞图像处理,比如你想搞音频处理,比如你想搞金融相关的,比如你想搞自动控制相关的。。。你懂得~

37

下图是点进图像处理专题后看到的页面:
38

第三,不好意思,你还记得我现在是在讲为什么Mma说明文档是最好的么?继续,最最最重要的一点事,Mma里面所有你打开的窗口的任何地方,你都可以写代码!运行代码!任何地方!!所以,说明文档里面的所有,所有!!的例子,你都可以随便改,随便运行,随便测试,请问还有比这个更好的教材么?!

文档

Mma它还可以做什么?既然它的任何地方都可以写代码,而不是像Python或者Mat***或者cmd或者linux的shell那样,只能在每一行的后面继续写,那么它不就变得和word差不多了么?没错,你可以用它来写文档!!

39

你可以随心所欲的修改上面的东西,运行上面的东西,我会告诉你Mma甚至可以对公式编号什么的么。。你现在稍微懂了一下为什么说Mma是最复杂的软件系统了么?

Word可以,自然的,PPT也是可以的!!
40

PPT即便是在放映的时候,你也可以改上面的代码重新运行的。另外对于别的展示,Mma也提供了方法让你把代码在PPT里面隐藏起来,只显示运行的结果(比如画的图之类的)。

我有特殊的装逼技巧

教你两个Mma做PPT然后闪瞎全场不认识这个软件的人的眼睛的方法;

第一,在PPT里面用一下Mma里面的动画交互控件,比如用Animate函数或者AnimateList这些函数做一个交互动画,和微软或者Latex做的PPT相比,瞬间高大上了某木有!!

比如某涂姓高中数学老师想给学生讲一下正弦函数的频率的概念,那么:
41

拖动一下Slidebar,下面画出的曲线的频率就会有所变化~记住,这个是可以嵌入PPT里面的,而且再记住,我只是举了一个很简单很简答的例子,你可以做更复杂的~再再再记住,Mma的这方面功能还是比你想象的要强大,比如它可以检测鼠标的位置实时地然后做出交互,这样你就可以做出微信的打飞机在PPT里面,或者做一个扫雷游戏都不是问题~

第二个闪瞎眼的方法就是你在讲PPT的时候卖一下萌说:

“说起来前几天看新闻说中国的GDP已经达到了,哎呀,多少来着?”

然后众目睽睽下,在PPT中间随便一个地方敲一行命令,先按一个=【说过了,什么地方都可以写代码!】,然后输入:

"tell me the gdp of china this year"

自然语言输入系统的正确装逼用法!而且可以顺手忽略一下大小写,或者犯点简单的语法错误,坐等结果。。。

获取研究数据

再说说内置的一些模块,为什么说Mma很适合做各种研究,因为它可以很方便的获取各种数据,上面所说的用自然语言来获取各国的GDP数据这种暂且不说,它可以通过准确的函数来得到各种你想要的信息,比如CountryData来获得各个国家的各种信息,你F1一下这个函数就知道了,可以获得各种信息,只有你想不到,没有你拿不到!【好吧,如果真的拿不到,就当我吹牛好了~】大家可以去这个链接看看,然后点“更多信息”去感受一下~【这个页面就是你在Mma中的帮助文档显示的内容】

然后你还可以获取各种天气的数据,用WeatherData,你想要的城市,你想要的参数,你想要的时间段,都可以获取!不过说明一下的是,近几年的数据你在第一次获取的时候Mma会自己联网去下载。。。要等上一点时间。。

再然后,你还可以获取各种金融的那些数据来分析,股票啊什么的,不好意思这些我不懂,我也就不详细说了,详情请参见FinancialData函数,我想做这方面工作的人对于分析这些数据还是有点兴趣的吧~感受一下请点击这里。。

再再再然后,那些做自然语言处理啊什么的,Mma里面内置了很多很多名著文本,不仅包括英语的,还是中国古文《道德经》那一些,日文的,希腊语的乱七八糟的都有。比如我以前写的某篇参考自Walfram博客的文章就是用了这些数据!

再再再再然后,Mma里面有一个强大的单词词典,例子还是看上面提到的博文。。。

所以,你现在强烈的感受到Mma的强大了么?

收尾

我再瞎举一些例子就算完成这篇博文了吧~

比如我以前写的用Mma来演奏音乐(据说好像跑调了,但是别在意)

或者来做爬虫。。。

再举一些Walfram博客上面那些脑洞大开但是创意无限的玩法:

这篇做了一个类似IOS里面一个叫BluePrint3d的游戏那种

这篇把Mma里面的绘图转换成xkcd风格。。

这篇展示了Mma在设计上的运用。。简直屌!!炸!!天!!

这篇用Mma来做一些logo的设计,可以很方便地调试一些参数

这篇作者根据Stephen Wolfram一篇博客写出来的一个程序,你可以用它来下载导出你邮箱的各种数据来做数据分析;

还有我以前写的某篇Wolfram上面的半翻译性质的博文。。

果壳上的AlephAlpha大大用Mma来转发网漫到微博或者发人人状态之类的【说到人人状态你懂得,模拟登陆然后干各种爬虫的“勾当”简直简单。。虽然速度实在慢。。。】

withparadox2大神以前用Mma来调教过google earth来实现“自动环球旅行”,地址是这个,不过他博客最近崩了。。暂时访问不了。。他以前还用Mma来画过一个栩栩如生的青苹果生成3D姓名【虽然博客访问不了,地址先放这了,搞不好以后哪天就可以访问了~青苹果这个网上很多人转载过他这篇的,我在果壳,百度空间,贴吧等各种地方都见过,你们随便一搜就可以搜得到】

此外,还有果壳的大神做的五子棋AI程序,其简洁程度令人震惊!还比如AlephAlpha大大的博客有很多超级好玩的东西,还还比如这个神一般的玩法这个,还还还比如制作云词。。。

如果还觉得不够,请点击这里!!接近一万种玩法!!

stackexchange上面的一个整合贴,你这辈子都够看的了。。

如果想看一下Mma的可以运用于哪些方面,请点击:http://www.wolfram.com/solutions/


后话(与正文完全无关)

我发现其实我可以写一个“我为什么喜欢XXX”系列了诶。。想了一下,如果真想写的话,顺序估计是这样子的:

  • 我为什么喜欢打日麻
  • 我为什么喜欢Python
  • 我为什么喜欢用印象笔记
  • 我为什么喜欢Latex
  • 我为什么喜欢C++
  • 我为什么喜欢看漫画多于动画
  • 我为什么喜欢下围棋多于象棋
  • 我为什么喜欢日语
  • 我为什么喜欢逛B站
  • 我为什么喜欢棒球
  • 我为什么喜欢算法(伪)
  • 我为什么喜欢黑Matlab

然后可以再写一个“我为什么不喜欢XXX”系列,写的顺序应该是:

  • 我为什么不喜欢Matlab(1)
  • 我为什么不喜欢Matlab(2)
  • 我为什么不喜欢Matlab(3)
  • 我为什么不喜欢Matlab(4)
  • 我为什么不喜欢Matlab(5)
  • 我为什么不喜欢Matlab(6)
  • 我为什么不喜欢Matlab(7)
  • 我为什么不喜欢Matlab(8)
  • 我为什么不喜欢Matlab(9)

写完收工!!

我觉得。。还是应该负责任说一句,虽然这篇里面各种调戏Matlab,但是只是搞笑而已,Matlab很萌的,乃们不要黑它!!虽然它连简单的for运行起来都很慢,它的矩阵运算已不是业界内最快,它的GUI用起来简直一把渣【基本是废的】,它画出来的矢图对一些特殊字符和中文的支持简直不能更烂【大小极不好控制】,画个简单的图都要各种gca,gcf的设置【画条曲线,一半代码花在计算上,一半代码花在画图设置上】。。。。【我真的是在洗白它么?】但是它里面的各种工具箱(神经网络啊,小波啊,射频分析啊,数据挖掘啊)简直是工科生的神器【有这一条就够了,不是么?】,上手简单,而且最新的2013还有代码检测的功能,还可以轻易支持调用GPU并行计算等。。。【好吧,我只能编这么多了。。】


【完】

本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com

  • 你为何这么屌。。

  • 你的博客内容真是超级丰富啊。。可是为什么不写些你专业上的东西呢

    • 写作丰富读作杂乱么。。。其实我有写过几篇的。。微波光子学这个专业好像偏得不是一点点,不是这个专业的基本都读不懂。。。虽然我最近是计划写一篇我工作的科普文,但是有几幅示意图好像很难画的样子,所以就一直搁着。。

      • EnguangZ

        你好,你是杭州人吗?在哪里读书?

        • 不是杭州的,不过在浙大读书

          • EnguangZ

            我在浙工大读书,机械电子工程,机器人一块。以后可以交流吗?

            • 嘛~当然,交流这种事情,绝对是来者不拒的嘛~

  • 很有意思,看来要比 SciPy 人性化多了,后者的文档很难查。

    • 很好的一个玩具~

  • Mathematica notebook的undo几乎不存在,不太适合长一点的项目。不知你用过他的IDE没,我没找到linux版的下载?

    • 据说下一个版本10可以支持无限次撤销操作。linux的我前两天刚下了个1.74G的Mathematica_9.0.0_LINUX.sh,但是还没装,不知道用不用得了。

      • 我说的是mathematica workbench, linux版的mathematica是可以用的。

        • 这玩意儿没用过诶。。找了一下,linux版本的确实不好找。。现在是2.0.0版本么?找到一个WORKBENCH_2.0.0_LINUX.SH,但是看文件大小不对劲,没敢下。。

      • 那个Linux版本能用吗?我现在还是在vbox里面装了个XP用Mma的。我以前在海盗湾下过这个Mathematica_9.0.0_LINUX.sh,但是好像附带的注册机是exe格式的,据说要用wine运行或者在开个虚拟机运行那个注册机才行。

        • 注册机是exe的。。。都是启动后把那个机器码拷到注册机里面生成另一个什么码才行。。纯linux下要怎么破解我也不清楚。。

          • Thanks,我有空了再去试下用wine

          • 注册机制都一样……直接开虚拟机用 MATH-ID 算结果。

    • AAA

      Mathematica 10以后终于有了好的undo..

  • 关于 Y 组合子我还是推荐我这篇文章(或者其中的参考资料):http://blog.likelikeslike.com/posts/2013-12-30/how-i-find-y-combinator.htmlMathematica 以前下载过 8.0 正版,然后用网上搜索的方法破解了 → → 然后很快就消失了。有 Mac 破解版嘛?不过很怕像 Windows 一样中病毒,同时正版货买多了就突然不忍心找盗版了 →_→ 我快要入坑了……图好多,卡死了……其实最喜欢的是画图功能,以前一直想画个状态机啥的,网上找的工具都不满意……Orz

    • 很快消失是什么意思。。Mma每次我都比较追求最新版本,因为新增的那些函数都是很实用的。【不像某些Matlab,每次更新的东西你都用不上。。】首先。。。我要有一台Mac。。。40+张图。。。而且放本机,没弄CDN,所以自然卡。。

      • 因为数学不太行,很少用到 Mma 就扔角落里去了,而且它本身安装后就占好几 G 空间……刚刚到官方发现正版还是可以免费下载,依然是用在线或离线注册的方法,注册机网上也有,只是不确定有没有木马啥的……Mma 假如只是 100 美元我肯定出钱买了。那价格高得让人害怕……QAQ

        • Mma数学上的使用我反而用的不多。。拿来画神奇宝贝图鉴啊,玩玩作曲什么的233333学生版会便宜很多。不然的话,比正版Office都贵。。。

          • 学生版貌似有什么期限的,搞不懂,刚刚直接在虚拟机运行注册机破解了……非法注册之后可以在 Mma 里安心登录个人帐户么?

            • 个人账户你是指什么?模拟登陆?

            • 看来我傻呆了……点了一下,跳到浏览器了……→ →

          • 那个 CDF 基本上和 PowerPoint/Word/Excel 有得一比了,卖得比 Office 贵都正常了……

            • CDF还有个好处,插入博客!不过要读者装有Mma或者其CDF解释器。。

              • 这个暂时只向 Mma 用户提供就好了……Mma 还是比较小众。明天拿 Mma 给数学练习册开开挂,哈

                • 当年我统计作业里面那些超复杂的Σ,化简不出来就Mathematica,然后直接写结论。。。欢迎入坑

  • jingtian

    博主写的很好,尤其是黑Matlab简直大快我心(过两天我们楼下图书馆有个Matlab的培训,我准备用Mathematica去砸场子的说)。PS:最后一个stackexchange的整合贴地址贴错了。

    • 高能所的大大你好!本来写之前真没想Matlab的事,写着写着就。。。。真情流露了。。。这样做是不好的。。。虽然我支持你!!!233333已修复,多谢提醒

      • jingtian

        额,大大这个称呼有点汗呀,说不定我还没你大,不过楼主Mathematica水平应该甩我几条街了,嘿嘿。我对Matlab的鄙视来自于我同学在Matlab中数值解微分方程,然后各种搞不定,最后我用Mathematica几行代码搞好了。加上平时习惯了Mathematica后就对Matlab各种限制很不爽,然后一些讲座培训之类的都是说各种数值初始条件要考虑,要有各种方法控制误差,blahblah,他们从未想过要反抗,这些琐碎的工作是偏离了科研的主题,他们却理所应当的样子,不去看看Mathematica的世界,替他们捉急呀!PS:我从知乎翻过来看你的博客的,已关注^_^

        • 我就是看到知乎才知道你是高能所的,虽然我最近知乎玩得极少。。可以体会。我就是因为觉得Mma这种东西太美妙了,以至于我常想在我活着的这个时代有Mma这种东西真是太好了。。TAT。。所以才有强烈的欲望去推荐给别人,拉人入坑的。。。Matlab虽然工程上有些时候很好使,而且上手曲线平坦,但是没有美感啊!!

          • jingtian

            我还以为是博客的IP地址追踪什么的呢。。。(^_^A;)。是的,有Mathematica真的太好了,期待它下一个版本快快到来,也祝你的博客越来越好。

            • 10好像确实多了很多好玩的函数。而且我比较期待Wolfram Language这个东西。。嘛,博客什么的就随他去吧。。写着来只是交朋友和做笔记用的。。

  • 触触好久不见

    • 成语接龙·伪 后好久不见233333

  • 其实我想知道它和最新的wolframe(好像是这个名字?)language的区别。。。。

    • 我感觉WL用的还是Mathematica和W|A里面的东西,之所以“改名”有可能是考虑到以后的市场需求【移植拓展到别的东西上去,比如硬件】,还有就是有可能变成一个真正的基于知识库的云,说不定以后就不需要再装Mma软件在本地了。

      • 感觉“知识库”这种东西单由一个group做不太靠谱呢。。。。

        • 现阶段离最终理想当然还是有一定距离的,但是就目前而言,已经做得很好了,完成度已经远远超出用户的预期了。

          • 好贵的云……无法支付

            • 这是一个很严峻的问题。。。如果真的完全云化的话,就没法享用破解了,而且很快我要连学生版都用不了了。。

  • yuki

    擦,最近又要做数值工作了不知用matlab还是mathematica好,看了你的安利文干脆就mathematica吧。。。不过窝不会这么炫酷的语句。。。

    • 额,其实我黑Matlab基本上是口舌之快,内心深处倒也没那么排斥。你的那些工作还是三思一下的好,最好都简单尝试一下,Matlab喜欢在数值方面对Mma说:那里已经不是你的领域了!!【好吧,其实Mma数值分析也很强大,但是速度就不好说了。。看你喜好吧

  • 渣渣表示第一次知道Mathematica,感觉我单纯是来看黑Matlab的,正好之前被Matlab折磨了一下。

    • Matlab的话上手难度和使用难度都不是很大(相反Mma更难一点),只是感觉这门语言没有美感所以不喜欢。。

      • 说起语言美感啥的就很喜欢Python而比较讨厌PHP

        • 此观点万分赞同

  • 好久没来看你博客了,一来就怒躺枪是什么道理

    • 随手黑,别在意

  • 为嘛喜欢呢

  • xxx

  • XXX

    个人觉得笔者还是有很强烈的个人倾向。首先从普适角度来说,为什么Mma这么好用,用的人却如此之少,我想笔者的回答必然是因为"大部分人都是没有见过世面的小果果",其实我会告诉你,我用一个卡西欧计算器电脑版,连代码都不用输,就可以实现计算哦~亲爱的。其次matlab支持模块仿真,你有么,matlab强大的库函数支持Mma有么?说到底,Mma就是一款强大的计算器,只能说你用Matlab很少,或者只局限于画图和计算的功能,而其真正强大的功能却并不是你那个领域所涉及的,我个人也用这两款软件,计算什么的很方便,但是涉及到很多仿真的,甚至是交互界面的处理我只能说还是matlab用的好。

    • 哈哈,被你发现了,写完都被楼上某基友说成是安利文了23333,其实写此文初衷只是给想拉实验室的学弟学妹们入坑,所以。。。论推销员的自我修养。。【为什么要拉人入坑?就是因为没人知道Mma而都是用Matlab的缘故其实本文打稿的时候也没写Matlab什么事,最后突然想卖个萌,就黑了他几句。。。【我上面评论也说了,黑它纯属口舌之快,内心并不排斥,拉人入坑的时候如果不过不黑Matlab来体现Mma的优越性,那怎么算优秀的传道士呢?所以如果伤到Matlab粉的心真是万分抱歉。。:-D事实上我现在学习研究的话,用Matlab和Mma差不多对半开了,而且我知道Mma之前也已经用了三年Matlab了,我当然知道他的强大,之所以黑它只是因为真心觉得这门语言语法设计上不美。。【Matlab对我而言是个工具,而Mma是个玩具。。。不过对于您的评论,第一,那个卡西欧有那么厉害?第二,Matlab的simulink和那些工具箱什么的确实很强大,不过交互界面(特指GUI)我就不敢恭维了。。。

    • 想拉人入坑的原因也不是因为想比较Mma和Matlab谁强,只是觉得一个人懂的工具多了,那么在遇到问题的时候武器可以多一些。之前实验室有人遇到一个计算一个大规模行列式的det,里面每个元素又是一个很复杂的有很多参数的表达式,最后需要算令这个det等于0的那个参数。。。像这种问题我觉得知道Mma的人还是会倾向于用Mma来解决【符号计算】,但是完全没听过Mma的人只能用Matlab来解上N个小时。。。。【然后还解错了23333333

    • “Mma就是一款强大的计算器”,呃,你能用卡西欧写一个2048游戏吗?

    • youke

      你的卡西欧计算器电脑版,连代码都不用输,就可以实现计算,我用windows自带的计算器连下载都免了,运行calc.exe即可哦;Wolfram SystemModeler支持仿真的哟,mma没有matlab强大的库函数支持?算积分、解微分方程我已经受够matlab了,不是慢的要死就是直接算不了,这也好意思说强大的库函数支持

  • 为啥 xxy 和 x^2y 分开了……

  • 只會PHP的渣給跪了

    • 我也想会这个。。。

  • 回访中,留个脚印。今天是2014/4/17

  • 我叉叉叉……寻找 N 篇教程才知道「无法覆盖原有快捷键配置」,于是只能够直接修改加载的配置文件,去掉原有的快捷键绑定语句……叉叉叉……

    • 是的,我设置的唯一一个快捷键就是ctrl+[就可以输入[[,ctrl+]就是]]一般要“ESC+[[+ESC”才可以输入的那个

      • 我也改成这样了……变成 Ctrl+; 模拟 ESC 了,Ctrl+' 退出子表达式。这篇文章的评论数增长得挺快啊……

        • 这个改法我以前是看withparadox2大大的博客改的。我记得有好几条很有用的。比如系统自带的函数可以进行参数个数检测【Sin[x,t]的时候x后面的逗号和t都会被标红】,改一下某些东西你自己也可以实现这个功能。。

          • Mathematica9.0.1 貌似已经有提示参数不够了啊。

        • 哪里快啊。平均一天一条【你今天贡献了两条】。。目前为止60+条评论,我自己的一半多,然后你的好多条留言,剩下就没几个人留言了。。

          • 是耶,我也发现了 → →

      • 另外发现定制适合中文的样式表真是让人头疼的事,基本定制完了才发现自己写用它的文章烂尾了 → →

        • 额。。以后有需要了我直接找你要好了~总感觉一直以来中文就是被各种嫌弃的东西,Latex啊,python的编码啊什么的。。

          • 我只是针对 title, subtitle, section ,item, itemnumbered 四个优化了一下 Default.nb ,而且还没有弄适合打印的样式。谁叫中文字符不适合用来当高效的编程语言字符啊……ASCII 总是优先考虑了。

            • 啊,还有 text, code, input, output 。

            • Mma敲出来的公式确实看着挺舒服的,但是title和section的字体是不是太骚了。。个人觉得工整一点的好。。而且正文字体是不是要再选一下,像“函”,“受”,“灵”这些好像不怎么好看。。

              • 正文使用的是我比较喜欢的偏向明体风格的字体,QAQsection 的字体一开始以为会完全嵌套字体文件让 PDF 很大,就尽量让用的字体少一些了,没想到是取字体文件的子集来优化文件大小的……我也不觉得我用的字体 Windows 系统会自带啊~ Mma 的公式有自动字符间隔,于是我就修改 code 的样式让 code 也支持自动间隔了,行内的嵌入公式貌似弄不了自动间隔。

                • 说错了,行内公式貌似无法添加高亮。text 倒是没想到自动间隔的办法,看到那个 λ 字符在缩在那里又不想手动加空格真是纠结。

                  • 其实也不要太纠结这个东西了,因为你设置这么多,可以给别人看到效果的也就pdf了,但是pdf不能给别人运行或者修改啊。而cdf文件别人下载下来,看到的样式字体都是别人的。

  • 又一宏篇巨作。在Mma和Matlab上,我和你的想法差不多。本来也是有打算写一篇类似的文章来着,但你写了,而且又写得这么好,我就不写。

    • 巨作称不上,纯粹吐槽+卖萌,顺便布布教

  • 沸騰的液氮

    "x^n_ -> nf " 希望博主加上空格“x^n_ -> n*f

    • 哇,不好意思,之前写的时候手滑少了个空格一直没发现。。多谢指正,已修改。

  • 计算器的话我觉得Microsoft Mathematics就很好了~高深的用不上,不过写作业倒是可以应付。只不过现在没作业写了……

    • 如果是作为工具用的话,Matlab啊Microsoft Mathematics也好,都可以。不过我个人认为Mma更像是个玩具。。

  • 你上面那些爱好不坑啊,我也喜欢

    • 额,其实是我们这边习惯把带来一个什么新东西/项目都叫做挖/开坑

      • 那些叫新东西?难道不算必须掌握的东西么

        • 诶?所以你原本说的“爱好”是指什么?我理解错了?

          • 比如Latex啊,Python啊,C++啊,印象笔记啊,Github啊,动画啊,漫画啊,B站啊之类的,

            • 我们实验室写代码的就只有我一个,所以前面几个对他们来说就是新东西。。。动漫B战如果可以成为“必须掌握”的东西那就世界和平了!!

              • 偶也不是计算机的,照样写代码……然后B是指的动漫B战啊,我理解错了

  • 博主,每次用mathematica推导公式的时候总感觉输入效率好低啊,不得已又用回了matlab+maple工具箱的,不知博主有没有好的建议啊。

    • 效率低除了问题本身比较复杂以外,还有可能就是对Mma的一些底层机制的了解上不够;举个例子,比如说有些人就不知道Mma中Exp[Log ]等于n的,但是Log[Exp ]的话Mma不会返回n,而需要PowerExpand一下才可以;有些人做加法喜欢用Sum,但是有时候如果问题允许的话,你用点乘Dot会更快;在某些函数里面你参数用1.0会比用1快很多。。上面说的不一定是推公式的问题,其他用途也会出现比较慢的情况,但是很多都是对Mma了解不够或者函数用的不准确造成的。诶?matlab+maple可以推Mma不好推的公式?是主要用maple么?我没用过maple,推公式上matlab不可能比得过mma的吧。。【again,还是没有黑matlab的意思233

      • 我也没用过纯粹的maple,每次都是在matlab环境下作为符号计算工具箱用。可能自己还不太熟悉mathematica的输入方式吧,输入效率低主要是觉得大矩阵的输入比较不方便,比如100*100的矩阵(matlab下可从Excel导入)。另外,感觉mathematica的编程语言非常灵活,自己也常遇到算出的结果看不懂的时候,其实非常想直接用mathematica,代替matlab+maple。看了博主的回复,痛感自己花的时间太少了。

        • matlab那个符号计算很慢的,而且可以算的实在太弱,随便加工复杂一点他就傻了。。Mma的读入功能很好用的,不说excel,我经常用它读一些仪器采集的数据,那些数据前面有很多仪器的款式说明等没用的信息,每条信息前面还有采集的时间什么的,但是我只要他采得数据啊,然后用mma读进来文本,StringCase模板匹配/替换一下,马上就得到我想要的数据,甚至一条函数就可以把不同的轴啊,不同日期采的数据马上分离开成一个一个变量。

          • 大神,还有没有这个的示例代码啊,如何读取仪器采集的数据?如何得到数据?如何把不同的轴啊,不同日期采的数据马上分离开成一个一个变量?

      • bruno

        这个是复变量多值函数的问题,默认变量是复数,所以LOGEXP返回不是单值,必须assupmtion填上变量类型属于实形

  • 这个软件真心太贵了。。。。买不起

    • 如果要算性价比的话,这个钱其实算便宜的;【其实也有破解的】

      • 你是用的学生版吗?还是ZJU有MMA的授权?

  • 请问一下怎么把默认的显示格式设置成traditional呢,找了半天都没找到。

    • 你是指编辑-》偏好设置-》计算-》新输出单元格式?

      • 哇,是这个呢。谢谢啦~~~~~

        • $PrePrint = Replace[#, mat_?MatrixQ :> MatrixForm[mat]] &还可以默认输出MatrixForm

  • Keep W

    看看

  • 手动点赞!

  • jifei

    请教,在mathematica中画的图,有他自己的字体,在另一台没有这个软件的机器上如何正确显示图形中的注释(例如omiga)

    • 没有这个软件的机子?你指那个机子装了cdf player?

      • jifei

        和cdf无关。我一台机器上装了mathemmatica,设为A;另一台机器没装,设为B。在A机器上程序计算、画图,图形中的注释、label等有omiga这样的字符。到B机器上,拉丁字母能显示,但omiga这类字符就显示不出来。

        • jifei

          补充一下,A机器中的图形,直接另存为矢量格式,在B机器中插入word文档。A机器中的mathematica版本是7.0

  • Kirchhoff

    你同时装了Matlab和Mathematica?

  • 的确wolframe对于一般的用户更易用,基本不需要学习,使用习惯更符合人类。我现在数学和电路课都用。

  • AprilSong

    楼主, 为什么从mma粘贴到word就失去清晰度了,写论文怎么办啊

    • 你说图片么?最好Export一下吧。。

  • 唐艺桓

    wow 好厉害呀 新手刚刚开始学习mma,希望可以互相交流呀 方便留个邮箱什么的联系方式么? 谢谢啦 有些问题想要请教一下呢

  • 我想问一下,你研究过把Mathematica代码转换成c吗?他的帮助文档只是简单地表达式,如果是将图像处理的代码或复杂的代码进行转化要怎么做呢?新手不太懂,求教

    • 你可以参考这个:https://reference.wolfram.com/language/guide/CLanguageInterface.html

      • 不是所有的程序都能转成c语言的是吗?

  • the wolf totem

    楼主,wolframalpha可以理解成为mathematica的在线版吗?除了这个,还有其他的区别吗?

  • nv

    mathematica 11.0 如何破解?

  • (^o^)/~

    >> f = @(x)(x<0).*sin(x)./x + (x==0) + (x>0).*(1-x.^2/100);>> fplot(f,[-10 10])>> mkdir @char>> dlmwrite('@char/mtimes.m','function f=mtimes(a,b),f=[a b];','')>> '12'*'3'ans =123x(x>2 & x < fn = {'1.jpg','2.png'};I = cellfun(@(f)imrotate(imread(f)),fn,'un',0);http://www.mathworks.com/help/matlab/graph-and-network-algorithms.htmlhttp://cn.mathworks.com/help/bioinfo/examples/working-with-graph-theory-functions.html?searchHighlight=shortestpath

  • 写得还可以,

  • Pingback: Mathematica的资料整理 – 饱蠹阁baoduge()