title: 比特之理 » 我为什么喜欢Mathematica!|とある東雲研究所の分所
url: http://www.kylen314.com/archives/5814
created_at: 2020-06-02 00:14:59
category: default
tags:
- www.kylen314.com
比特之理 » 我为什么喜欢Mathematica!|とある東雲研究所の分所
首页 > Mathematica > 我为什么喜欢Mathematica!
2014年4月5日 Vespa
先说为什么要写这么一篇,首先一个原因是我很喜欢把我喜欢的东西(特指无生命的)介绍给别人,比如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))
除号,开n次方,Σ求导,偏微分,积分,相乘,各种希腊字符,没错,这是一门编程语言!!不是Word或者PDF!!【顺便提醒感受一下最后一个例子】
如果有看过之前那篇《Mathematica给图片去水印》的话,就可以体会到另一件事情:图片本身就可以作为参数传进函数里面【别的语言都是先把图片保存在本地,程序设置一个img变量,imgread读取图片,然后再处理】;
再举一个例子,以前的博文《生命游戏&兰顿蚂蚁》中,我从维基娘那里找到一张图片:
友好的交互不能体现一款软件的强大!!但是上面计算∑i=1∞1i2自动算出π26不知道让各位体会到Mma的强大没。
这就是为什么Mma表达式计算可以完爆Matlab十万光年的原因,Again,还是没有黑Matlab的意思。。因为你不能以己之长,较人之短嘛。。
好,如果你手上有一个很强大的表达式计算工具,你会想到什么?没错,推公式/验证公式!!(某师兄怒躺一枪)第一个例子可以去看看以前的那篇倒立摆的博文的前面部分体会一下~
Mma自带了解大部分恒等式化简规则,但是对于有些Mma无法解读的那些,你可以自己写规则告诉它,然后再用这些规则去推别的公式,比如众所周知的,我们可以把sin(cos(x))展开成一系列贝塞尔函数的和的这种法则,写下这套规则后你就可以去推那些载波啊什么的相关公式了。【好吧,我知道这一段看懂的人不多。。所以我就不举例子了。。】
请问你家Matlab是怎么完成分段函数的?再次重申,没有黑matlab的意思。。不信的话我换一句咯。。请问你家汇编是怎么完成分段函数的?
~请问Matlab先生你懂什么是字符串相除,字符串相乘么?~
看到没,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]
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
map:
map是一个超常用的函数,你可以把某个函数作用于一个列表的每一个元素,比如对每个数求平方:
>>> def f3(x):
... return x*x
...
>>> x = [1,2,3,4];
>>> print map(f3,x)
[1, 4, 9, 16]
后台蹲着的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语法规定只要在函数后面加上一个&就可以了!!
代码简直美不胜收,不是么?~好啦好啦,别哭了,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都可以画的我就不举了~。。
Mma在常用的算式作图上,基本你想要的功能都可以完成,比如直方图啊,等高图啊,密度图啊,3维图啊,矢量场图啊之类的,而且可以设置的参数极其丰富,画图来的图非常精美,这也是它闻名之处!
但是除此之外,它还可以画下面这种抽象的图:
什么,你觉得这些太简单没意思?别傻了,我只是写博文,讲解一下而已,你真正用的时候画出来的图是这个样子的:
亦或者画个状态机
来看看:
还有金融方面的绘图,比如可以看看这篇文章:《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
这几个其实本质等于:
Column[{1,2,3,4}]
MatrixForm[{{1,2},{3,4}}]
TableForm[Array[a,{2,2}]]
体会一下这种用法,我们在C++语言里面用//表示注释,经常会用于说明一个东西,Mma将其借鉴过来,并变成一个函数!!美!!
什么时候该用@,什么时候用//,虽然你可以随意,但是还是建议根据函数功能来判断一下,虽然10//Range语法上是对的,但是可读性是不好的!!
那你问两个参数怎么办?
Para1~Function~Para2
比起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里面的匹配,替换等用法是别的语言所难以企及的,比如有一个向量,我想根据规则替换里面的某些元素:比如满足一个矩阵中xn找出来,然后替换成nf(n),再把2乘某个变量找出来,换成4乘这个变量,那么:
为什么可以这么实现?因为Mma中加法虽然写作a+b,但是系统理解的是Plus[a,b],而上面说了,函数也是规则【因为函数相当于把规则Plus作用于成员a和b】,那么规则也是可以随意替换掉的~【发挥你的想象力,可以实现更多有趣的玩法】
我并不打算在这里解释上面是怎么一行实现冒泡排序的,因为你需要一点Mma的语法基础,而且你懂了之后这个代码很好懂的~
好,这一节到此结束!!简短吧~
或许你不是很清楚Mathamtica的语法规则,但是很多人(爱逛社交网络的理工科大学生)都应该听过Wolfram|Alpha(下文简称W|A)这个东西吧,没听过的你可以在上面输入一下 integrate of x^4 sin x , weather in hangzhou today ,water或者gdp of china这些你就会明白这个东西是干什么的了。。
很强大不是么?然而这个东西确实Mathematica的一部分,你在Mma软件中只要输入代码之前按一下=,就可以把Mma当做这个引擎来使用;你输入的东西会通过网络传到这个W|A,然后把结果返回来。【所以你需要联网】
这个有个非常之好用的地方在于,假如你忘了或者你根本不知道某个功能的函数是什么,嘿嘿,那你就可以在Mathematica中通过自然语言来描述你这个问题!!比如生成10个1~100的随机整数:
你看,不仅返回了结果,而且还告诉你正确的函数是什么!!相信我,虽然我举的是很简单的例子,但是W|A这套引擎比你想象的还要强大。
嗯,看到没,即便你的英语没过关,不知道number应该要加s,Mma也会原谅你。。。【这样自我吐槽真的好么。。】
我个人认为,Mma拥有着所有编程软件里面最好的说明文档!!比起C++的MSDN,Matlab的help,Python的官方文档,Linux的--help,要强太多太多了。原因有以下几个:
第二,对于任何一个函数,你可以直接按F1进入这个函数的说明文档,这个函数说明是最最最友善的东西了;
首先,嗯,它是全中文的!!【应该说,它有全中文的】
其次,它里面说明了每一个参数的意义,中文的;
然后对于每一个参数的用法,都有举至少一个非常经典的例子,基本保证一看就懂;
再其次,它会说明每个函数会在什么情况下会出现问题;
再再再其次,它还会告诉你一些相关的函数;【我经常就是想画一个什么图,然后就先F1一下Plot这个最基本的函数,显然Plot不是我想要的那个函数,但是在下面相关函数里面找一下基本就可以马上找到我想要的东西了~】;
再再再再其次,下面还有某一个专题的教程,没错,专题!!比如你想搞图像处理,比如你想搞音频处理,比如你想搞金融相关的,比如你想搞自动控制相关的。。。你懂得~
第三,~不好意思,你还记得我现在是在讲为什么Mma说明文档是最好的么?继续,~最最最重要的一点事,Mma里面所有你打开的窗口的任何地方,你都可以写代码!运行代码!任何地方!!所以,说明文档里面的所有,所有!!的例子,你都可以随便改,随便运行,随便测试,请问还有比这个更好的教材么?!
教你两个Mma做PPT然后闪瞎全场不认识这个软件的人的眼睛的方法;
第一,在PPT里面用一下Mma里面的动画交互控件
,比如用Animate函数或者AnimateList这些函数做一个交互动画,和微软
或者Latex
做的PPT相比,瞬间高大上了某木有!!
拖动一下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上面的半翻译性质的博文。。
withparadox2大神以前用Mma来调教过google earth来实现“自动环球旅行”,地址是这个,不过他博客最近崩了。。暂时访问不了。。他以前还用Mma来画过一个栩栩如生的青苹果和生成3D姓名【虽然博客访问不了,地址先放这了,搞不好以后哪天就可以访问了~青苹果这个网上很多人转载过他这篇的,我在果壳,百度空间,贴吧等各种地方都见过,你们随便一搜就可以搜得到】
此外,还有果壳的大神做的五子棋AI程序,其简洁程度令人震惊!还比如AlephAlpha大大的博客有很多超级好玩的东西,还还比如这个神一般的玩法和这个,还还还比如制作云词。。。
如果还觉得不够,请点击这里!!接近一万种玩法!!
stackexchange上面的一个整合贴,你这辈子都够看的了。。
如果想看一下Mma的可以运用于哪些方面,请点击:http://www.wolfram.com/solutions/
我发现其实我可以写一个“我为什么喜欢XXX”系列了诶。。想了一下,如果真想写的话,顺序估计是这样子的:
然后可以再写一个“我为什么不喜欢XXX”系列,写的顺序应该是:
写完收工!!
我觉得。。还是应该负责任说一句,虽然这篇里面各种调戏Matlab,但是只是搞笑而已,Matlab很萌的,乃们不要黑它!!虽然它连简单的for运行起来都很慢,它的矩阵运算已不是业界内最快,它的GUI用起来简直一把渣【基本是废的】,它画出来的矢图对一些特殊字符和中文的支持简直不能更烂【大小极不好控制】,画个简单的图都要各种gca,gcf的设置【画条曲线,一半代码花在计算上,一半代码花在画图设置上】。。。。【我真的是在洗白它么?】但是它里面的各种工具箱(神经网络啊,小波啊,射频分析啊,数据挖掘啊)简直是工科生的神器【有这一条就够了,不是么?】,上手简单,而且最新的2013还有代码检测的功能,还可以轻易支持调用GPU并行计算等。。。【好吧,我只能编这么多了。。】
【完】
本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com
分类: Mathematica 标签: Mathematica, Matlab, Wolfram, 安利
原网址: 访问
创建于: 2020-06-02 00:14:59
目录: default
标签: www.kylen314.com