首页 > 编程笔记

MATLAB是什么(超级详细)

MATLAB 是一个用于科学研究与工程应用分析和设计的商业化算术运算软件,由美国新墨西哥大学的数学教授 Cleve Moler 开发。

Moler 当时在美国阿贡国家实验室(Argonne National Laboratory)参与了两个数值计算软件包的开发:用于求取矩阵特征值的 EISPACK 和用于求解线性系统的 LINPACK。同时,他也在新墨西哥大学讲授数值分析和矩阵论的课程。为了让学生们既能够在计算机上进行实践,又能免除编写程序的麻烦,Moler 利用 FORTRAN 语言和 EISPACK 及 LINPACK 的部分功能,编写了最初版本的 MATLAB。

最初版本的 MATLAB 仅 80 个数学函数,只能在字符界面上绘制粗略的曲线图,而且缺少 M 文件和工具箱等成熟版本 MATLAB 的核心部分。它所关注的是与矩阵有关的计算,这一点从 MATLAB(Matrix Laboratory:矩阵实验室)的名称也能看出来。

在 MATLAB 向商业化软件的转变过程中,自动控制工程师 Jack Little 扮演了重要角色。他是首个商业化 MATLAB 软件的主要开发者。1981 年 IBM 公司推出其首款个人计算机后,Little 迅速意识到 MATLAB 在个人计算机上的应用前景,并与 Steve Bangert 用 C 语言改写了 MATLAB,而 M 文件、工具箱以及更为强大的图形绘制功能等重要特性也在这时加入了 MATLAB。1984 年,Moler、Little 和 Bangert 在美国加利福尼亚州成立了 MathWorks 公司。

自那以后,MATLAB 便迅速发展,成为一个强有力的科学与工程领域的应用软件。它不仅用于解决矩阵与数值计算方面的问题,而且已经成为集数值与符号计算、数据可视化、图形界面设计、程序设计、仿真等功能为一体的集成软件平台。

此外,在教育领域,MATLAB 也成为高等数学、线性代数、概率论与数理统计、数值分析、数学建模、自动控制系统设计与仿真、信号处理、通信系统仿真乃至大学物理、生物学、计量经济学等广泛课程的重要教学和实践工具,为众多的研究者与学习者所熟悉。

MATLAB的优点和缺点

1、优点

MATLAB 作为一种科学计算软件,具有如下优点。

1) 强大的数学计算能力特别是矩阵运算能力

与 C/C++、Java 等编程语言不同,MATLAB 是将数组和矩阵作为基本的操作单元来对待的。

在 C/C++ 等编程语言中,加法运算符“+”在最基础的层面上支持的仅仅是单个标量的加法运算。尽管 C++ 等面向对象的编程语言可以通过操作符重载来定义更为复杂的“+”运算,但是这需要编程者额外的编程工作,或者是其他库的支持。而 MATLAB 编程语言直接将数组和矩阵这样的批量数据的组织形式作为基本的处理单元,因此,在 MATLAB 中,“+”表示的就是整个数组和矩阵之间的加法,这是 MATLAB 内生的特性,不需要编程者额外进行任何工作,从而极大地简化了数组和矩阵运算的编程任务,也使得其表达形式与数学公式更为一致,同时也更为简明清晰。

不仅如此,MATLAB 数组和矩阵的元素还可以取复数值而不限于实数值,从而使复数相关的运算也变得十分易用。

此外,MATLAB 从最初版开始就关注矩阵运算,因此其矩阵运算包括特征根与特征矢量的求取、矩阵求逆等常用而核心的运算,都具有极高的运行效率。实际上,MATLAB 在矩阵相关运算方面,一直都是各主要编程语言中最为高效者之一。

2) 语言特性简洁,编程效率高

MATLAB 编程语言本身的特性简洁明了,没有引入太多复杂的特性,这一点与 C++ 这样面向对象的编程语言相比显得尤为突出。

此外,MATLAB 中的数组和矩阵实际上都是“动态”的,因此,在内存管理方面编程者几乎不需要负担多少工作。尽管在空间和时间效率上不一定能保证是最优的,但是不用进行内存管理,将明显减少程序发生内存相关错误的可能,从而使得编程者的代码编写和调试工作变得更为简单和轻松,编程效率可以显著提高,编程者能够将更多精力集中在如何解决实际问题,而不是陷在编程语言本身的技术细节之中。

同时,MATLAB 将数组和矩阵作为基本操作单元的处理方式,也使得与批量数据的运算和处理有关的程序变得更为简洁,编程工作量更少。在掌握了 MATLAB 的矢量化运算技巧之后,在 C语言或 Java 语言中需要一层甚至是多层嵌套的循环才能完成的运算,在 MATLAB 中也许仅需要寥寥数行就能实现。

3) 交互性好,使用方便

MATLAB 又被称为“草稿纸式的计算软件”,它的基本使用方式是命令行式的:在命令窗口中输入一条命令,马上就能执行该命令,并且根据用户的需要可以显示计算的结果。这条命令可以本身是执行一项复杂、完整的计算任务的函数调用,也可以仅仅是一个复杂处理过程中的中间步骤。而利用 C/C++ 或 Java 等编程语言编程时,在编写了完整或部分的代码后,需要经过编译、链接等操作产生可执行程序,然后才能够实际运行和看到结果。

而且 MATLAB 的不同程序间的互相调用也十分方便和简单。它提供的每个 M 文件既是一个函数模块,也是一个完整的可执行程序。因此,它们既可以单独用来执行一项特定的任务,也可以组合起来构成更为复杂的程序。以 MATLAB 工具箱为例,每个工具箱通常由存放在特定目录下的一系列M函数构成,这个目录实际上起到了在其他编程语言中函数库的作用。

4) 绘图能力强大,能够利用数据可视化有效辅助研究分析

利用 MATLAB 可以方便地绘制多种常用的二维图形和三维图形,如曲线图、散点图、饼图、柱状图、三维曲线/三维曲面图、伪彩色图等。这些图形不但提供大量数据的直观表示,而且更便于揭示数据间的内在关系。

5) 为数众多的工具箱

MATLAB 除了基本的数学计算功能,还以工具箱的形式提供了大量针对特定功能和特定应用领域的工具箱。

例如,在 MATLAB R2020a 中,就提供了包括曲线拟合工具箱、最优化工具箱、符号数学工具箱、统计与机器学习工具箱、深度学习工具箱、强化学习工具箱、并行计算工具箱,以及针对信号处理、图像处理与机器视觉、控制系统、测试测量、射频与混合信号、无线通信、自主系统、FPGA 等硬件开发、汽车、航空航天、计算金融学和计算生物学等特定应用领域的工具箱,多达 60 余个。此外,还包括用于仿真和代码生成等功能的软件和函数或模块库,数量也多达数十个。这些工具箱直接为使用者提供了相关领域的大量较为成熟的算法,从而使得研究者与开发者能够迅速在这些已有成果的基础上,构建自己的解决方案或新的算法。

6) 开放性好,便于扩展

大量 MATLAB 工具箱函数都是以 M 文件的形式提供的,因此,其具体实现都是公开的,而且用户可根据自己的需要加以修改。这些公开的代码不仅为用户对其进一步改进提供了很好的基础,而且研究者还能够通过阅读这些代码,更好地理解相关的算法。

以 M 文件为基本模块的工具箱组织方式,也使得用户能够构建自己的工具箱,或进一步搭建起基于 MATLAB 的二次应用环境。

MATLAB 的开放性还体现在它与其他编程语言和工具软件的交互上。

MATLAB 提供了 C语言和 FORTRAN 语言的 API 函数库,开发者可以利用这些 API 函数,使用 C 语言或 FORTRAN 语言来实现有关算法,然后把它们编译为可在 MATLAB 中执行的 MEX 函数模块。

MATLAB 还通过 COM 接口对外提供计算服务,其他的应用程序可以通过该 COM 接口调用 MATLAB 的计算功能,从而使得 MATLAB 可以作为一个强大的后台计算引擎来发挥作用。例如,用户可以利用 C++、VB 等语言来编写应用程序,然后在其中调用 MATLAB 来完成复杂或性能敏感的计算任务。

MATLAB 也可以对 Java 类进行操作和使用。同时,由于 MATLAB 强大的功能和已经构建起来的应用生态,不少其他的工具软件也提供了与 MATLAB 兼容的接口。例如,在 LabVIEW 中就可以利用 M 语言来编写模块以执行有关的计算功能。

7) C/C++代码生成功能

MATLAB 能自动将 M 代码转换为可靠的 C/C++ 语言代码。通过这一功能,开发者就可以利用 MATLAB 高效便捷地进行算法的实现、调试与验证,之后再自动转换为 C/C++ 代码,就能够将所实现的算法用于需要的程序中,从而极大地减少编写和调试程序的工作量。

2、缺点

尽管 MATLAB 具有上述优点,但是其缺点也是较为明显的。

1) 价格昂贵

作为一款功能强大的数学计算软件,MATLAB 的价格十分昂贵。

实际上,除了 MATLAB 核心软件,MATLAB 的多数工具箱都是单独计价的。如果要将这些工具箱全部配齐,整个软件的价格将达到十余万甚至数十万元人民币。这一昂贵的价格在相当程度上限制了 MATLAB 的使用。

在各种开源软件不断涌现的今天,MATLAB 昂贵的价格已经催生出了若干功能类似的其他软件。有些开源工具在部分功能和计算效率上都已经达到了与 MATLAB 比高低的程度,也因此逐步扩大了它们在数学计算方面的流行度。

2) 体积庞大,对计算机性能要求高

随着 MATLAB 功能的不断增加,工具箱数量的不断增多,其完整安装所需的空间也越来越大。

以 MATLAB R2012a 为例,其完整安装约需要 5.7GB 的硬盘空间。同时,MATLAB 对于计算机的CPU和内存的要求也随着版本的提高而提高。因此,如果仅仅希望以 MATLAB 作为应用程序的后台计算引擎,上述的硬件开销一般都是偏大的。

3) 在某些特定应用领域中的表现不及其他软件

MATLAB 的优势主要体现在以矩阵计算为核心的科学计算与仿真上,但是在一些相对更新的应用领域,由于其基础架构的问题,因此表现不见得是最佳的。

例如,在大数据处理和深度学习方面,MATLAB 尽管在最新的版本中也提供了工具箱支持,但是其功能和性能相比于 Python 语言及相关的第三方工具包或应用框架等还有一些差距。在这些领域的研究者中,其使用者所占的比例也较小。

4) 语言本身的计算效率存在不足

一般而言,MATLAB 内置的计算函数的效率都足够高效,但是对于利用 MATLAB 进行开发的程序员来说,如果需要提高所编写的程序的效率,就需要掌握更多的技巧。

在 MATLAB 的较早期版本中,影响程序效率的一个典型因素,就是利用循环的方式来对数组中的每个元素进行处理。由于在 MATLAB 中,哪怕是基本的算术运算,也会被解释为对 MATLAB 相应内置函数的一次调用,因此,在利用循环逐元素进行操作时,函数调用带来的计算开销将远大于这一计算本身的实际开销,从而使得程序的运行速度显著下降。

因此在较早期的 MATLAB 版本中,如何利用矢量化技术来减少循环的数量,是提高程序效率的一个重要技巧,甚至在很多应用中,为了能够利用矢量化技术带来的高效率,往往使得代码本身变得晦涩难懂,影响了程序的可读性。尽管在较新的版本中,MathWorks 公司已经极大地提升了 MATLAB 中循环的执行效率,但是这一问题仍然没有得到解决。

此外,还有一种提高效率的方式,即使用 MEX 编程,利用 C/C++ 语言来编写对性能影响最为显著的算法核心部分,把它编译为 MEX 模块后再在 M 函数中加以调用。不过这种方式一方面需要程序员熟悉 C/C++ 编程,而且 MEX 模块的调试并不是十分方便,另一方面也使得整个程序的组织结构显得较为零散,不便于阅读和迅速理解。

尽管存在上述缺点,MATLAB 仍然以其高效的计算、便捷的交互、强大的可视化能力和众多工具箱的有力支持,在科学研究与技术开发中扮演着重要的角色。

应用案例

MATLAB 在工业界和学术界的应用案例可谓汗牛充栋,在此,仅列举数个不同应用领域的案例以窥一斑。

1) 奇瑞汽车的发动机管理系统软件开发

发动机管理系统(Engine Management System, EMS)通过车载的各类传感器感知发动机的吸入空气量、冷却水温度、发动机转速、加减速状态等信息,并据此控制发动机的工作,如发动机的燃油供给量、点火提前角、怠速空气流量等。设计良好的EMS软件可有效地提高发动机的工作性能。

由于不同车型对 EMS 有着不同的需求,因此需要采用一种灵活、迅速、低成本的方式来进行 EMS 软件的开发。奇瑞汽车采用基于模型的设计(Model-Based Design)解决方案,该解决方案主要采用的是 MATLAB 和同为 MathWorks 公司产品的 Simulink 软件。

开发组在 MS Word 中定义了系统软件需求,并利用 Simulink 和 StateFlow 构建了一个 EMS 控制模型。通过 Simulink Check 和 Simulink Requirements 软件,开发组建立了 Word 文档中的系统需求与Simulink控制模型中相应部件之间的对应关系,从而能够在需求发生变化时自动地将这些变化体现在模型中。在经过仿真和硬件验证后,开发组利用 Embedded Coder 和 Fixed-Point Designer 自动生成了超过 20 万行面向定点数 PowerPC 微控制器的源代码。这些源代码所生成的软件已经用在了包括奇瑞 QQ 在内的产品上。

采用上述解决方案,奇瑞公司每年可节约开发费用近 200 万美元。在开发第 2 代 EMS 软件时,第 1 代产品中约 60% 的控制设计都可以复用,从而使得开发时间减半。代码自动生成同样节约了大量的开发与调试时间,所生成的代码执行效率高,而且未发现代码缺陷。

2) 上海电气集团的分布式能源系统规划与设计平台

上海电气集团需要根据不同城市的不同负载分布、发电系统类型、储能设备类型以及长期的气象数据,来规划和设计分布式能源系统。这些负载和发电、储能单元的种类繁多,数量庞大,针对不同城市需要进行电网模型的调整,需要针对新技术添加模型,还需要结合气象数据并在此基础上分析经济效益。这些需求对上海电气集团研发分布式能源系统规划与设计平台提出了挑战。

该平台的开发采用 MATLAB 与 MATAB Production Server。能源工程师们利用 MATLAB 构建了分布式能源系统中各设备组件的模型,这些模型不仅包含了设备的物理特性,还包含了其经济特性。例如,在风力发电机模型中,除了电力输出,发电机的维护费用也以关于风速的函数形式被包含在内。

由于组件繁多,因此,为了提高组件的复用性,开发团队利用 MATLAB 的面向对象编程能力,将这些组件以对象的形式加以实现。

开发者利用 MATLAB 的财务工具箱开发了一系列算法,用于评估给定的分布式能源系统模型的财务状况。在这些算法中,不仅包含了能源价格的变化趋势以及时间序列形式的气象数据,还包括了规章政策等因素。

在利用 MATLAB Compiler SDK 将平台的模型和算法打包后,平台通过 MATLAB Production Server 进行了部署。通过对 Production Server 进行部署的方式,使得用户能够访问自动更新的最新版本。该平台能够与一个用 C# 编程语言编写的网络应用界面进行交互,让用户能够通过浏览器来使用该平台。

这一解决方案使得整个平台至少提前了 6 个月投入使用。通过该平台提供的规划与设计,仅仅在一个项目上,便节约了 200 万元人民币。而且 Production Server 的使用使得系统的更新能够即时自动完成,不再需要 IT 人员的维护。

3) 都科摩(北京)通信技术研究中心的通信算法开发

都科摩(北京)通信技术研究中心在研发过程中,利用 MATLAB 来提高研发效率。研究人员利用 MATLAB、信号处理工具箱中的滤波函数,以及通信工具箱中的调制、解调、编码和解码函数,构建了一条完整的发射—接收链,并以之作为验证先进通信算法的仿真框架。例如,如果现在要针对新一代设备开发调制解调方案,那么就可以将框架中的调制和解调函数替换为所开发的调制和解调功能,即可对其进行仿真验证。

在链接层的层次上对框架的可靠性进行验证之后,研究人员又进一步构建了包含多个基站和数百台移动设备的系统级模型。由于模型规模庞大,因此其仿真相当耗时。为了提高仿真效率,研究人员使用了 MATLAB 并行计算工具箱和 MATLAB Parallel Server,使得仿真能够以并行的方式进行。

通过上述方案,仿真系统的开发时间减少了 50%;一些仿真任务的耗时从数周减少为几个小时,仿真量也提高了 5 倍,从而大大提高了仿真结果的可信度。

与MATLAB类似的软件

除了在前面介绍的缺点,MATLAB 还存在一个潜在风险,即它并非自主可控的软件。因此,在某些特定的情况下,即使是合法的正版用户,也可能不得不面临没有 MATLAB 可用的情形。

这里介绍几种较为流行的、与 MATLAB 类似的科学计算免费软件,由于它们与 MATLAB 的相似性,因此在极端情况下,用户也能够较快地切换到这些新的软件中,完成一些较为常规和基础的科学计算任务。

1) Scilab

Scilab 最早可追溯到 20 世纪 80 年代,其前身是由法国国家信息与自动化研究所(INRIA)开发的计算机辅助控制系统设计软件 Blaise。Blaise 的目的是为自动控制领域的研究者提供一个工具,它的开发也受到了 MATLAB 的启发。

在 1984 年,Blaise 更名为 Basile,然后由 INRIA(法国计算机科学与控制国家研究院)的首个初创公司 Simulog 进行发行。20 世纪 90 年代初,Simulog 停止了 Basile 的发行,该软件更名为 Scilab,由 INRIA 的 Scilab 工作组 6 位成员负责开发。INRIA 决定以免费开源软件的方式发行 Scilab,其首个正式版本于 1994 年上传至可匿名访问的 FTP 服务器供使用者下载。Scilab 工作组的开发工作一直进行到 2002 年。

从 2003 年开始,为了适应越来越多的使用人数需求,INRIA 组建了 Scilab Consortium 以负责 Scilab 的开发、维护和技术支持。2008 年,Scilab Consortium 与 Digiteo 研究者网络结合,Scilab 的开发与维护即由 Scilab Consortium 在 Digiteo 内部开展进行。

到了 2010 年,在 INRIA 的支持下,Scilab Enterprises 公司成立,以保证 Scilab 软件的未来发展。从 2012 年开始,Scilab 有关的开发工作等就完全由 Scilab Enterprises 公司负责了。

Scilab 提供了数以百计的数学函数,能够完成数值分析、数据可视化、算法开发和应用开发等任务,主要面向的领域包括数学、优化、统计、信号处理和控制系统等。此外,Scilab Enterprises 还推出了 Xcos 软件,用于类似 Simulink 的系统建模与仿真。

2) GNU Octave

GNU Octave 是 GNU 项目中的一个免费软件,可以运行于 GNU/Linux、macOS、Windows 等操作系统之上。

Octave 最早的目的是为化工专业的本科生提供一个化学反应器设计方面的辅助软件,实际上 Octave 的命名就来自开发者的一位老师兼化学反应工程方面的专家 Octave Levenspiel。但是这一目标的局限性很快就变得显而易见,因此该软件也开始向更为灵活、更为一般的计算软件转变。

现在,GNU Octave 已经成为主要面向数值计算的一种高级编程语言,以及使用这种编程语言的软件工具。

Octave 编程语言在很大程度上与 MATLAB 编程语言是兼容的,这就使得 MATLAB 用户向 Octave 的迁移显得尤为方便,甚至在没有使用过于专业的工具箱函数时,MATLAB 程序可以直接移植到 Octave 中。

Octave 的免费与开放性,使得用户可以通过编写和发布自己的程序,来不断完善和强化 Octave 软件的功能。

3) 基于Python编程语言的科学计算与可视化

Python 编程语言作为一种免费开源的语言,由于其易用性与强大灵活的功能,在众多领域获得了应用。在科学计算方面,Python 社区的开发者提供了 NumPy、SciPy、Matplotlib 和 SymPy 等多个软件包,能够高效地完成数组计算、数值和符号计算以及数据可视化的任务。

NumPy 是利用 Python 进行科学计算的基础包,其中提供了类似 MATLAB 数组的 N 维数组对象 ndarray,并重载了 Python 的运算符以支持矩阵运算;提供了类似 MATLAB 数组下标的 N 维数组的索引和切片,还提供了强大的线性代数、傅里叶变换和随机数功能。

SciPy 中包含了一系列数值算法,以及包括信号处理、最优化、统计等很多专门应用领域的工具箱。

Matplotlib 提供了功能全面的可视化函数集,能够绘制多种静态图形、动画以及可交互图形,包括各种常见的二维图形和三维图形。

SymPy 顾名思义是为了提供符号计算功能而开发的 Python 工具包,能够进行表达式的变形、化简、求解方程和方程组、微积分、组合学、几何、统计、离散数学、矩阵运算乃至物理学和密码学方面的符号计算。这些 Python 工具包共同完成了 MATLAB 中相当多的常见功能。

当然,由于 Python 编程语言所支持的运算符和 MATLAB 并不相同,因此,在一些具体运算上,以及编程语言的表现形式上,两者存在较为明显的不同,但是在理解和掌握了 MATLAB 中对数组进行处理的方式和思路之后,对于具备 Python 编程语言基础的开发者和研究者而言,两者之间的转换也并不困难。

除了上述免费开源软件,还有其他一些国内外开发者负责的免费科学计算软件,只不过从所实现的功能和使用人数而言,目前还与上述软件存在一定的差距。

推荐阅读