by HPCer @ Beijing,2020-6-16
最近这段时间,我的微信朋友圈出现频率最多的就是Matlab被禁相关的新闻,好像Matlab被禁天就要塌下来似的。我对Matlab不可代替这件事真的不敢苟同。大约5~10年前我是Matlab的重度用户,但现在除非是给别人调程序,基本不会再去打开Matlab做任何事情。所以我想,花一点时间,写一点文字,告诉大家Matlab真的不是像传统工业软件那样不可替代,这个事情或许是值得去做的。
为什么我说Matlab被禁不重要
Matlab最初是美国新墨西哥大学Cleve Moler教授编写的用于线性代数和数值分析教学的工具,其目的是让学生学习使用LINPACK和EISPACK库,而不去写繁琐的Fortran程序。他用Fortran编写和封装了相关程序,构建了类似今天脚本语言常见的解释性执行环境,其中最核心的内容是矩阵计算。早期Matlab提供的功能并不多,但基本上也能找到今天常用函数的影子,比如所有人都会用到的PLOT函数(如下图所示):
后来随着Matlab的逐渐商业化,特别是Cleve在斯坦福大学的学生Jack Little加入Matlab产品化开发后(用C语言重写了Matlab,并加入了函数、工具箱和图形化等现代Matlab的基本功能),相继发布了PC-MATLAB(用于PC机)和Pro-MATLAB(用于Unix工作站)产品,MATLAB逐渐在大量使用矩阵计算的工程学科中推广开来。今天的MATLAB虽然增加了很多功能,无论是在语言层面的面向对象编程支持,还是图形化界面的丰富,亦或toolbox的大量增加,都没改变其核心仍然是矩阵计算,所以大家可以看到Matlab里矩阵是最基本的数据类型。
到了今天,不是说矩阵计算不重要了,而恰恰相反,无论是传统CAE仿真,还是如今火热的人工智能,都是建立在矩阵计算基础上,甚至可以说没有矩阵计算,也就没有了今天的数字化工业。但反过来说,在矩阵计算如此重要的时代,Matlab能够发挥的作用有多少?
我想至少有以下几个方面,是今天的Matlab做不到的:
- 大规模并行矩阵计算:大规模并行计算一直是Matlab的短板,您可以说Matlab有parfor、有workers、还支持cuda,但Matlab解释性执行这个基本前提直接阻止了Matlab在高性能计算领域的发挥前景。当然您还可以说我用mex调用C、Fortran程序呀,甚至我还可以用生成器将Matlab语言转成C呀,但这个就不是我们现在讨论的Matlab普适应用价值所在了。
- 工业级软件产品开发:今天的工业级软件产品里,我们基本看不到Matlab的影子,而类似于Matlab解释性脚本语言的开源语言Python反到后来居上,借着人工智能的火热,占据了工业级矩阵计算软件的半壁江山。
- ARM与边缘计算设备:Matlab无法在ARM处理器上运行,这对大量使用ARM的移动端、边缘端设备、工控和基于国产处理器的设备来说是一个巨大的市场空白;此外由于Matlab庞大的体积,也基本难以用于边缘设备的部署。
从这个角度来讲,如果说我们今天要开发一款基于矩阵计算的工业级的高性能程序,Matlab是无能为力的,而这种场景在今天越来越多;此外,随着5G和工业互联网的普及,在边缘端进行的矩阵计算也越来越多,而这种场景更是Matlab无能为力的。
那Matlab今天的主要应用场景在哪?我能够想象到的主要还是集中在教学和科研中,但我想这或许只是一种习惯,而不是真正的技术门槛导致了不可迁移。我们今天就来盘点一下Matlab的两个主要替代品 - Octave和Python。作为一个系列文章的开端,本文不会深入技术细节,未来我会挑选一些典型应用场景,做一些比较详细的分析和解读。
Matlab的直接替代品 - Octave
应该说Octave是Matlab的最直接替代品,
- 首先Octave的界面和Matlab真的很像,因为最初它就是模仿Matlab开始的:
- 其次,在语法和绘图功能方面,Octave和Matlab极其相似,Octave可以直接直接运行大部分的Matlab源程序,即m文件;Matlab程序除非涉及到比较特殊的工具箱,基本简单的改写即可在Octave中运行。
- 大量的开源代码是同时支持Matlab和Octave的,比如在国外有限元教学中经常用到的ifiss工具箱,就同时维护了Matlab和Octave版本。
- 最近火热的人工智能领域里,Andrew NG 吴恩达在其最受欢迎的深度学习课程中推荐用Octave替代Matlab。
- Octave可以保存数据为Matlab二进制格式,也就是说实在您有部分功能用Octave搞不定了,或者不想自己造轮子了,还可以用偷偷Matlab算一下,当然这一招一般情况下不推荐使用(:
为什么我不提Scilab,按理说Scilab比Octave出道时间早,又是INRIA(法国国家信息与自动化研究院)这么强大的背书,应该是牛x的,但我用过几次Scilab后直接选择了放弃。我不记得以前是在哪篇文章里看过,说信仰自由的法国人喜欢搞开源软件,但搞了一堆却没几个好好维护下去的,Scilab恐怕就毁在这儿。(关于开源软件的开发模式,大家没事可看看Eric Raymond著名的《大教堂与市集》)当然这也许只是我的个人偏好问题,Scilab的粉丝请不要对我开火(:
Matlab的间接替代品 - Python Spyder
首先要解释一下,我为啥说Spyder而不提现在用的更多的Jupyter Notebook?我想用过Mathematica的同学都知道,Jupyter更像是Mathematica,很多Matlab的用户直接上手Jupyter并不习惯,而Spyder真的很像Matlab:
关于Python的话题,我想用一天也都说不完,反正Python很火就是了,应用领域也比Matlab要大得多。Python可以从理论研究出发,一路做到工业产品,也就是说您在迁移Matlab程序的过程中,万一哪天厌倦了想转行,还可以靠Python去产业界找个工作^-^ 可以说如果你一上手就是用的Python,可能根本不会去想Matlab的事情;但对于Matlab重度用户来讲,转移到Python还是有一定的难度,主要的问题还是使用习惯造成。所以这里我要介绍一个大神器,叫做oct2py,用它可以直接在Python环境里调用Octave内核来运行Matlab/Octave代码,用这种方式可能会比直接用Python重写Matlab代码要自然得多。所以,我想或许Python+Octave能够完美解决Matlab的替代问题,而Python本身又比Matlab强大很多,一旦渡过了适应期大家会发现Matlab真的是可有可无了~
结语
十年前我还在读研究生的时候,曾经给国家气象局的学弟学妹们上过一门Matlab的课 ,那个时候我们是想用Matlab代替一门当时在空间科学领域广为应用的商业语言,叫做IDL(Interactive Data Language,交互式数据语言)。我不知道今天在空间科学里IDL的使用率还有多少,至少这门语言没有发展推广到其他更加广阔的应用领域,甚至在空间科学本身,我也看到越来越多使用Matlab的用户。我想说既然Matlab可以替代IDL,那么在贸易战美国对我们封锁的背景下,Matlab也绝对不像网上很多人说的那样不可替代!如果您不知道怎样替代,请持续关注我的吧^-^
其实我更想说的是,很多时候一个软件在国内用的多,用的广,并不是说他真的就是技术上不可替代,甚至不是因为他真的做得就是比其他软件好,至少在数学软件这块,Matlab是不如Mathematica优雅的(Matlab也有类似于Mathematica的符号运算功能,但他借用的是Maple的语法,并且是以MuPAD单独组件的形式出现,我敢说大部分Matlab用户甚至从来都没有打开过这个界面),但国内用Matlab的人却要比Mathematica多太多了。
我是一个国产HPC/CAE软件研发从业者,今天在仿真计算软件领域看到的情况与Matlab生态是类似的,很多人都说老外的软件做的就是比国产的好,但我想很多时候只是使用习惯和你身边的人决定了你接受哪种软件,对于一个完全没有任何经验和没任何人指导的工业软件初学者来讲,是我们FELAC好用还是ANSYS好用,真不一定好说(:
待续……
参考文献
[1] MATLAB发展简史. https://ww2.mathworks.cn/company/newsletters/articles/a-brief-history-of-matlab.html