Matlab与 朱莉娅vs. 巨蟒

我使用MATLAB已有25年以上。 (在那之前,我什至使用过MATRIXx ,他都无法安息。)这不是我学会的第一门语言 ,但这是我进入数学时代的语言。 知道MATLAB对我的职业生涯是有益的。

但是,不可能忽略科学计算中Python的增长。 MathWorks应该有同样的感觉:他们不仅增加了直接从MATLAB调用Python的功能,而且还借用了它的一些语言功能,例如对二进制运算符组件的更具攻击性的传递

当我质疑我在研究和教学中继续使用MATLAB的时候到了。 然而,我在材料上投入了很多,以至于很难找到学习新事物的动力。

EDISON软件-网络开发
本文是在EDISON Software的支持下翻译的,EDISON Software 照顾了程序员的健康和早餐 ,并开发了定制软件

MATLAB入门教程 ,我与他人合着进行了计算数学。 本书包含40多个函数和160个计算示例,并且涵盖了我认为使用MATLAB进行数值科学计算的基础知识。 部分原因是为了自我完善,部分是为了提高本书的实用性,我决定将代码转换为JuliaPython 。 这次经历使我对科学计算产生了三种语言的特殊见解,下面我将尝试描述这些观点。

我将推迟成本和开放性问题。 与Python和Julia不同的是,MATLAB不是免费产品。 对于某些人来说,这是一个巨大的差异,但是我想考虑一下技术优点。 多年以来,MATLAB在许多非常有用的方式上远远超出了任何免费产品的范围,如果您想提高生产力,那么代价将是不菲的。 这是对语言和生态系统的柏拉图式吸引力的单独讨论。

如果我们忽略与成本相关的问题,则这些语言存在许多差异的原因与它们的来源有关。 MATLAB首先将数学方面(即计算数学)放在优先位置。 Python出现在1980年代,将计算机科学放在了最前沿。 成立于2009年,Julia设定了实现前两种语言之间平衡的目标。

的MATLAB


最初,MATLAB中的每个值都是一个双精度浮点数数组。 选择的两个方面,即数组和浮点数,均受设计决策的启发。

直到1985年才采用IEEE 754浮点数标准,并且内存以千字节(而非千兆字节)为单位。 双浮点数不是显示字符或整数的最有效方法,但它们是科学家,工程师和所有数学家大部分时间想要使用的。 另外,不应声明变量,也不应分配内存。 通过让您的计算机处理这些任务并摆脱数据类型,您可以腾出头脑去思考适用于数据的算法。

数组很重要,因为线性代数中的数值算法采用了自己的形式LINPACKEISPACK 。 但是,使用科学计算中的标准介质FORTRAN 77访问它们是一个多步骤过程,涉及声明变量,调用例程的隐藏名称,编译代码,然后分析数据和输出文件。 以A * B的形式记录矩阵乘法并列出响应,这立即导致了游戏过程的变化。

MATLAB还使图形变得简单而开放。 没有复杂的,依赖于机器的,具有低级调用的库,只需绘制(x,y),您就会看到其他人会在MATLAB中看到的东西。 还有更多的创新,例如复杂的复数,稀疏的矩阵,用于创建跨平台图形用户界面的工具以及一组高级的ODE求解器,这些使MATLAB以思想的速度成为科学计算的场所。

但是,即使对于较长的交互式计算也是理想的设计,但它并不总是有助于编写高质量的程序。 在许多功能之间移动数据需要操纵各种变量,并经常访问输入和输出参数的文档。 对于小型项目,在平面命名空间中,磁盘上每个文件的一个功能非常简单,但是对于大型项目而言,却很麻烦。 如果要避免计算速度问题,应采用某些编程模式(矢量化,内存的预分配)。 目前,科学计算已应用于具有大量不同类型数据的大量区域。 等等

作为响应,MathWorks继续在MATLAB上进行创新:内置函数,嵌套函数,尾随变量,众多数据类型,面向对象的函数,单元测试基础结构等等。 每种创新都可能是解决重要问题的方法。 但是,这些变化40年的累积产生了使概念的简单性和统一性模糊的副作用。 2009年,我写了一本书 ,不到100页就很好地介绍了MATLAB的基础知识。 据我所知,所有这些东西仍然可用。 但是,您现在需要了解更多信息,才能称自己为专业人员。

巨蟒


Python的历史在某种程度上是MATLAB的历史的镜像。 两种语言都有一个交互式命令行(现在称为REPL是read-eval打印循环的缩写,它翻译为read-evaluate-print循环,并且不受各种声明和编译的影响。但是,MatLab的创建主要是出于对计算的关注分析,然后为黑客创建了python。然后,每种语言都能够通过更新和扩展功能来扩展其用户群。

在我看来,Python仍在遭受其数学工具的匮乏之苦。 它包含一些令人不舒服的小东西,例如用**代替^,@用于乘矩阵(最近添加!),不是大小,而是矩阵的形状,面向行的存储等。 如果您认为V.conj()。T @ D ** 3 @ V比V ∗ D 3 V更优雅,那么很可能您的头部还不好。 此外,索引从0(而不是1)开始。 我曾有机会结识相反的观点 ,但是,我认为这并不是那么令人信服。显然,这全都是个人喜好,是互联网上的神圣战争的主题,因为您总是可以为自己的利益举个麻烦的例子,对我来说到底是什么?这似乎令人信服,因为几十年来我们一直以1为起点对向量和矩阵进行数学索引,并且许多伪代码都基于此假设。

除了带来一些不便之外,我还发现Python + NumPy + SciPy系统既繁琐又不一致,一个很好的例子是这样的事实:尽管着重于对象,但还是有矩阵类, 不建议使用它们 ,也许MatLab像那样破坏了我,但是我认为矩阵是保持方便和积极使用的重要对象。 使用*来对数组和矩阵执行各种操作的功能不是OOP的主要功能吗? 通常,在这方面有很多不幸的时刻((为什么我根本需要spsolve命令?为什么我不能仅仅将solve命令应用到稀疏矩阵?还有很多)。

在某些地方,数字生态系统看起来更糟。 例如,平方和ODE求解器在2019年看起来非常简约。 据我所知,没有用于DAE,DDE,辛或隐式求解器的方法允许Krylov进行内部迭代。 您看,这些功能大多使用了30年或更长时间-仍然不错,但还远远不够完善。 Matplotlib是一个很棒的软件包,在某些情况下它看上去比MATLAB更好,但我错过了3D。

一些专家认为,为什么Python代码试图通过编译语言来提高速度是有原因的。 我对搜索结果“ python太慢 ”感到惊讶。 Python的拥护者援引了当时人们为MATLAB提出的许多论点/道歉。 这并不意味着它们是错误的,而不仅仅是感知上问题

我了解为什么Python对于许多科学计算人员来说如此令人兴奋。 它具有一些语法和MATLAB的功能,可从REPL获得。 它具有出色的工具,并且可以与其他语言和计算领域配合使用。 他免费提供了它,并具有更好的长期可复制性。 显然,这对于许多几乎没有理由改变的人来说效果很好。

由于我知道如何进行科学计算,因此Python迫使我在学习和使用方面进行比往常更多的日常工作。 在一段时间内,我们将不知道它是否会在社区中继续存在或已经接近高峰。

朱莉亚


朱莉娅(Julia)迟到了,有其优点和缺点。 我钦佩朱莉娅的创造者理解他们可以做得更多

我们需要一种具有库许可的开源语言。 我们想要C速度和Ruby动态。 我们希望该语言是同质的,具有像Lisp这样的真实宏,但要具有类似Matlab中的显而易见的熟悉的数学符号。 我们想要像Python一样可编程的东西,像R那样简单的统计数据,像Perl一样自然的字符串处理,像Matlab一样强大的线性代数,并且能够像shell一样将程序粘合在一起。 简单易学,但同时又让最严重的黑客感到满意。 我们希望它是交互式的,而且我们希望对其进行编译。

我相信他们在很大程度上取得了成功。 在1.0版的发布中,它们似乎与REPL和MATLAB略有不同。 (LinRange的精度比linspace好吗?)尽管它很挑剔。

这是我使用的第一种语言,具有超越ASCII的功能。 我对使用诸如Phi之类的变量和诸如≈之类的运算符感到非常满意。 它不仅仅是一个漂亮的包装器; 能够看起来更像我们编写的数学表达式是一个真正的优点,尽管它确实使学习和文档编写变得有些复杂。

Julia的Jobs向我展示了我由于选择了MATLAB而获得了一些编程技能,而不是因为其固有的优越性。 向量化对于许多事情而言并不自然。 朱莉娅(Julia)透露,您可以通过在函数名称中添加一个句点来对任何函数进行向量化。 相比之下,使用理解来构造矩阵会使嵌套循环(或网格网格技巧)看起来像是错误的鞭子,而使用生成器来绕开矩阵作为一个简单的求和就像无所事事。 (我知道Python具有类似的语言功能。)

多重分派的主要特点是使某些事情比对象的方向更容易理解。 例如,假设您有使用传统的面向对象语言编写的Wall和Ball类,那么哪个类应该检测球与墙壁的碰撞? 还是您需要一个房间课程来扮演裁判? 这样的问题会分散我的注意力。 通过多重调度,数据被打包为对象类型,但是处理数据的方法未绑定到类。 所以
函数detect_collision(B ::球,W ::墙)
知道类型,但独立于它们来确定。 我花了很多编程时间来理解多重调度的概念对于扩展语言的重要性和潜在重要性。

数字生态系统正在迅速发展。 我的第一个例子是DifrentialEquations.jl ,由出色的Chris Rakautskas编写 。 如果该软件无法在任何时候获得威尔金森奖,则说明该系统已损坏。 只需访问该站点即可准备上诉。

我还没有看到Julia承诺的MATLAB的巨大速度提升。 这部分是由于我相对缺乏经验以及我执行的任务种类,部分是因为MathWorks在自动优化代码方面做得非常出色。 无论如何,这不是我大部分时间关注的编码方面。

使用Julia进行编程使我花了一些时间来感到自在(也许我只是变老了并且变得更加结实)。 这使我对数据类型的思考比我想的要多,并且总是怀疑我错过了正确的方法。 但是对于日常使用,我很可能会选择Julia作为MATLAB。

总结


MATLAB是公司解决方案,主要用于解决工程问题。 它仍然是解决数值问题的最简单工具。 该公司非常重要的文档和十年的发展无疑在其中起着重要的作用。

MATLAB就像是来自科学计算领域的BMW轿车。 即使在谈论配件之前,它也很昂贵(工具包)。 您需要支付无缺陷,不间断的操作和服务。 但这也引起了不成比例的仇恨

Python是福特的皮卡车。 它是无处不在并且受到许多人的喜爱(在美国)。 它可以做任何您想做的事,并且旨在做其他汽车做不到的事。 您很可能会不时想要它。 但这并不能给您太多驾驶经验。

朱莉娅是特斯拉。 它的建立是为了改变未来的大胆目标,而且它是可能的。 但这也只能一提。 同时,您将获得自己的风格,并拥有大量的力量。


另请阅读博客
EDISON公司:


20个图书馆
壮观的iOS应用程序

Source: https://habr.com/ru/post/zh-CN480716/


All Articles