第1章 MATLAB简介 MATLAB=matrix+laboratory,即“矩阵实验室”,顾名思义,MATLAB与矩阵运算有着紧密的联系。实际上,MATLAB被设计的初衷就是专门解决矩阵运算的难题。随着时代的发展,现在的MATLAB已经成为一款性能强大的多功能集成软件,可同时执行数值运算、数据可视化、图形页面设计、程序设计、仿真等基本功能。经过三十余年的发展,MATLAB已经成为目前世界上最为热门的商业数学软件之一,广泛应用于数据分析、深度学习、图像处理、风险管理与量化金融、控制系统等领域。MATLAB使得许多金融从业人员进行算法研究、模型构造、组合管理等工作的效率得到大大提升。 本章主要介绍MATLAB的发展历史、MATLAB的版本进展、MATLAB R2020a的版本特性、MATLAB的特点、MATLAB相较Python的优势以及下载方式等方面内容。同时为了让读者简单明了地熟悉MATLAB的整个框架体系及编程逻辑,我们将在本章末尾通过GUI(图形用户界面)实例,为读者展示MATLAB的实际应用。学习思路导图如图11所示。 图11第1章学习思路导图 1.1概述 1.1.1发展历史 1. MATLAB的诞生 20世纪70年代中期,在美国国家科学基金的资助下,美国新墨西哥大学的计算机科学系主任Cleve Moler与其同事开发了调用EISPACK和LINPACK的FORTRAN子程序库。EISPACK是特征值求解的程序库,LINPACK是解线性方程的程序库。在当时,这两个程序库代表了世界上矩阵运算的最高水平。 到了70年代后期,Cleve Moler在给学生讲授课程时,想教学生使用上述两个程序库,但他发现学生在编写接口程序上花费了大量的时间,为了减轻学生的负担,他编写了供学生使用的FORTRAN子程序库接口程序,这就是第一代的MATLAB。在之后的数年里,MATLAB一直在大学里作为辅助软件,免费面向学生使用,得到了学生的广泛好评。 2. MATLAB的商业化 工程师John Little对Cleve Moler编写的MATLAB程序十分着迷,并敏锐地察觉到了MATLAB在工程领域的广阔前景。于是1983年,他和Cleve Moler、Steve Bangert一起开发编译了第二代的MATLAB,并于1984年成立了MathWorks公司,正式向市场推出用C语言编写的MATLAB的第一个商业版本(即DOS版本3.0)。之后他们继续进行MATLAB的开发,为它添加了图形图像、符号运算等功能,使得MATLAB的功能更加强大。 在MATLAB推向市场后短短几年,由于MATLAB具有良好的开放性和优异的可靠性,当时世界上其他控制领域里的封闭式软件包(如英国的UMIST、德国的KEDDC等)纷纷被淘汰,转而以MATLAB为平台进行重建。 到了20世纪90年代初期,MATLAB已成为国际控制界的标准计算软件。美国和欧洲的各大学将MATLAB正式列入本科生和研究生的教学计划。至此,MATLAB已经成为学生和工程师们常用的基本软件之一。 时至今日,MATLAB已经推出了最新的MATLAB R2021a版本。如今MATLAB的大多数功能来自专业化应用的工具箱,并且每个迭代的版本都在不断完善原来的功能及增加新的工具箱。 有兴趣的读者可以在浏览器中输入下面这个网址,进一步了解MATLAB的发展历程。 https://ww2mathworkscn/company/newsletters/articles/abriefhistoryofMATLAB.html 1.1.2MATLAB的版本进展 目前MATLAB正处于高速发展的进程中。按照惯例,MATLAB每年会发布两个版本,通常是在3月份发布a版,在9月份发布b版,后者只是在少许内容上有所更新,两者并没有本质上的区别。MATLAB各版本更新时间及相关内容见表11。 表11MATLAB各版本更新时间及相关内容 更新时间更新版本号主要更新内容 1984MATLAB 1.0MATLAB的第一个版本。 1993MATLAB 4.0具有划时代意义的MATLAB Windows版本,从此告别DOS版本,开启崭新的时代。 1994MATLAB 4.2扩充了4.0版本的功能,在图形界面设计方面提供了新的方法。 1997MATLAB 5.0允许了更多的数据结构,如单元数据、多维矩阵、对象与类等,使其成为一种更加方便编程的语言。 1999MATLAB 5.3在许多方面进一步地改进了MATLAB语言的功能。 2000MATLAB 6.0在核心数值算法、界面设计、外部接口、应用桌面等诸多方面进行了极大的改进。此时的MATLAB再也不是一个简单的矩阵实验室了,它已经演变成为一种具有广泛应用前景的计算机高级编程语言,为科研需求提供更加强大的功能。 2004MATLAB 7.0随着MATLAB 7.0的商业化以及软件本身的不断升级,MATLAB 7.0的用户界面也越来越精致,更加接近Windows的标准界面,人机交互性更强,操作更简单。而且新版本的MATLAB 7.0提供了完整的联机查询、帮助系统,极大地方便了用户的使用。 2006MATLAB R2006b 从这时开始,MathWorks公司每年将发布两次新的产品,每一次发布都会包含所有的产品模块。在R2006中,MATLAB主要更新了10个产品模块,增加了多达350个新特性,增加了对64位Windows系统的支持,并新推出了.NET工具箱。 2010MATLAB R2010a增加更多多线程数学函数,增强文件共享、路径管理功能,改进MATLAB桌面; 新增用于MATLAB进行流处理的系统对象,并在Video and Image Processing Block和Signal Processing Blockset中提供超过140种支持算法; 针对50多个函数提供多核支持并增强性能,并对图像处理工具箱中的大型图像提供更多支持。 2015MATLAB R2015a新版MATLAB和Simulink,包括Simulink多项新增图形控制与显示功能; 四个新产品: Antenna Toolbox, Robotics System Toolbox, Simulink Test, and Vision HDL Toolbox; 79种其他产品更新。 2018MATLAB R2018a多种产品更新,例如深度学习: 使用Deep Network Designer应用程序编辑网络,使用网络分析器实现可视化,自动进行视频标注,将模型导出到ONNX,并部署到NVIDIA、Intel和ARM处理器。 注意事项: (1) MATLAB的版本是不向下兼容的!这意味着旧版本的MATLAB很可能打不开新版本的MATLAB文件。举个例子,使用MATLAB R2020a中的App Designer所保存的文件在2010年的MATLAB版本中就无法打开,因为2010年的MATLAB版本没有App Designer功能。因此,出于兼容性考虑,本书建议读者安装最新版的MATLAB进行学习并使用。 (2) 理论上MATLAB的版本越高,其对电脑配置的要求也越高。 (3) 本书是基于MATLAB R2020a版本编写的。因此在后面的章节叙述中,如无特别提醒,本书将自动省略实例中所使用的MATLAB的版本号。 1.1.3MATLAB R2020a版本特性 如前文所述,MATLAB每推出一个新版本,功能都会越来越强大。 在MATLAB R2020a中,其不仅更新了许多产品模块,还增强了实时编辑器、表格、日期时间和其他功能。同时,自动化的上下文提示可以大大提升编程的效率,并且将结果与可视化内容和您的代码一起显示。在运行性能方面,MATLAB运行代码的速度几乎是两年前的两倍。不仅如此,App Designer、数据导入导出、软件开发及数据分析等功能都愈加完善。具体更新参见表12。 表12MATLAB R2020a具体更新 文件编码将MATLAB代码文件和其他纯文本文件默认保存为UTF8编码的文件。 图形boxchart: 创建箱线图以可视化分组的数值数据。tiledlayout函数: 定位、嵌套和更改布局的网格大小。ChartContainer类: 制作图表以平铺显示笛卡尔、极坐标或地理图。 实时编辑器任务交互式重新设定时间轴同步时间表,以及堆栈或非堆栈表变量。 Financial Instruments Toolbox定价和估值: 使用新的面向对象框架,对不同类型的金融工具分别或作为投资组合进行定价。 Optimization Toolbox代码生成: 生成C/C++代码以使用quadprog求解二次规划问题(需要MATLABCoder)。 OPC ToolboxOPC UA安全: 通过安全连接来连接到OPC UA服务器并配置安全设置。 Predictive Maintenance ToolboxDiagnostic Feature Designer应用程序: 从应用程序到自动执行信号处理、特征提取和特征排序任务整个过程生成MATLAB代码。 Symbolic Math Toolbox实时编辑器任务: 交互式求解方程式,简化符号表达式,并在实时脚本中生成MATLAB代码。 MATLAB Web App Server新产品,可将MATLAB应用程序和Simulink仿真作为基于浏览器的Web应用程序共享。 Statistics and Machine Learning自动机器学习(AutoML): 自动选择最佳模型和相关超参数(fitcauto)以进行分类。 Text Analytics Toolbox文档摘要: 从文本中提取摘要。 1.1.4MATLAB的特点 1. 写代码易,编写脚本快 用户可以在MATLAB中使用M语言编写脚本文件或者自定义函数,满足用户的需要。此外,与C语言等高级语言相比,M语言的语法十分简单,方便初学者学习和使用。 2. 工具箱多,应用学科广 MATLAB的工具箱主要有两类: 功能性工具箱和学科性工具箱。顾名思义,功能性工具箱主要用来扩充MATLAB的计算、建模等功能,使其更加强大。而学科性工具箱则经常用于学科专业计算,专业性很强,如控制、统计、计量、金融衍生产品、信号处理、金融、管理科学等各类常用的工具箱等。用户可以直接使用工具箱而不需要自己编写代码。这些工具箱可直接用于各学科领域的学习,也可直接用于解决应用领域内特定类型的问题。 3. 命令窗简,编程效率高 MATLAB可在输入一条命令后马上运行得到结果,无须像其他高级语言如C语言等,写完源程序的代码后还要进行编译等操作才能出结果。此外,MATLAB的用户界面越来越精致,更加接近Windows的标准界面,人机交互性大大增强,操作也越来越容易。 4. 可视化强,绘图功能全 MATLAB软件具有十分强大的数据可视化以及图形化功能,通过使用MATLAB自带的绘图函数,初学者也可以很轻松地绘制出各种复杂的二维图形、三维图形等,并给图形添加标注、标题、坐标轴等。数学建模等比赛都对数据可视化有一定要求,相信读者阅读此书后可以轻松掌握使用MATLAB绘图技巧,取得好成绩! 5.交互性好,图形界面美 用户可以利用图形化的工具创建图形用户界面开发环境(GUIde),简称GUI,通过加入多种界面元素,如按钮(Push Button)、单选按钮(Radio Button)、文本编辑框(Edit Box)等组件,辅以界面外观、属性、行为响应等设置方式,用户可以很方便地和计算机进行交互。 1.1.5MATLAB和Python的比较 MATLAB是科学工程领域必不可少的工具,Python是当下最流行的编程语言之一,两者性能不分伯仲、特性各有千秋。二者的区别主要体现在以下三点。 1. 服务 在MATLAB中,如果遇到使用问题,您可以选择通过发送请求帮助,获取专门技术团队的优质服务,而使用Python仍需要开发者自行debug,无法享受到如此贴心的服务。 2. 定位 MATLAB一开始就是专门为数值计算开发的,计算功能强大,在数值计算领域拥有丰富的工具箱,并且有大量参考书以及官方社区介绍这方面的应用信息。Python作为一门可读性较高的高级编程语言,目前在这方面尚未达到同等层次。 3. 工具 MATLAB安装的时候自带了许多实用的工具包,操作简单且安装便捷,因此MATLAB十分适合研究人员用于建立模型开发工程,可以有效缩短研究时间。Python则不具备这样的条件,需额外安装第三方库获取函数进行代码编写,操作较为麻烦。 1.1.6下载方式 随着MATLAB的发展,MATLAB的安装包的体积也越来越大。许多读者都对如何下载MATLAB有所困惑,在此我们推荐读者进入下方的官方网站进行下载: https://ww2.mathworks.cn/campaigns/products/trials.html 网站页面如图12所示。 图12MATLAB官方下载网站 1.2认识MATLAB 下面以WIN10操作系统、MATLAB R2020a为例进行介绍。 1.2.1打开方法 (1) 打开MATLAB所在文件夹,双击MATLAB.exe。 (2) 双击MATLAB.exe后,则会弹出如图13所示的界面。若MATLAB在图13这个界面“卡”住一段时间,请不要慌张,因为MATLAB占用内存较多,初次加载耗时比较长属于正常情况。但是如果加载时间过长(超过5分钟以上),则建议提升电脑配置以获取更好的使用体验。 图13MATLAB打开界面 (3) 图14即为正常页面。 图14MATLAB打开界面 1.2.2MATLAB的主窗口及功能 在本节中,对主窗口的每一个选项都进行了简单的说明。 在图15中,框住了一些按钮,它们是开发者使用MATLAB时的常用工具,建议初学者尝试单击一下它们,感受一下使用操作,我们将会在后面的章节中对它们的具体功能进行详细说明。 图15MATLAB的选项卡 按照从左往右的顺序,依次对它们进行说明。 1. 文件区 MATLAB的文件区如图16所示。 图16MATLAB的文件区 (1) 新建脚本: 脚本是最简单的程序文件类型,它们可用于自动执行一系列MATLAB命令,例如必须从命令行重复执行的计算或必须引用的一系列命令。 (2) 新建实时脚本: 在实时脚本中,可以编写代码,并使用生成代码的代码查看生成的输出和图形。添加格式化的文本、图像、超链接和方程式,以创建可以与他人共享的交互式叙述。 (3) 新建: 可以新建各种类型的程序文件,开始编辑。 (4) 打开: 可以打开想要的程序文件,开始编辑。 (5) 查找文件: 基于名称或内容搜索文件。 (6) 比较: 比较任意两个文件的内容,找出差异。 2. 变量区 (1) 导入数据: 可以将数据文件里面的数据导入MATLAB中。 (2) 保存工作区: 保存当前工作区的变量。 (3) 新建变量: 创建并打开工作变量进行编辑。 (4) 打开变量: 打开工作区变量进行编辑。 (5) 清空工作区: 清空当前工作区的变量。 3. 代码区 (1) 收藏夹: 可以利用收藏夹功能将这某些命令作为一个小脚本程序,直接放在工具栏,方便以后的调用。 (2) 分析代码: 分析当前文件夹中的MATLAB代码文件,查找效率低下的编码和潜在的错误。 (3) 运行并计时: 运行代码和配置文件以提高性能。 (4) 清除命令: 等同于clc命令,清除命令行窗口所有显示内容。 4. 环境区 (1) 布局: 调整桌面布局。 (2) 预设: 指定预设项,可以修改MATLAB页面文字大小、字体等。 (3) 设置路径: 更改MATLAB搜索路径。 (4) Parallel: MATLAB并行运算选项。 (5) 附加功能: 获取包括硬件支持在内的附加功能。 5. 资源区 (1) 帮助: 获取帮助。 (2) 社区: 访问MathWorks在线社区。 (3) 请求支持: 提交技术支持请求。 (4) 了解MATLAB: 按需访问学习资源。 1.2.3MATLAB的工作窗口 “工欲善其事,必先利其器。”对于初学者来说,首先必须十分了解自己的工具,才可以用得顺手。下面,我们将从最基本的工作窗口开始介绍。 1. 命令行窗口 如图17所示,命令行窗口主要用于输入命令并显示除了图形以外的所有显示结果。其中,“〉〉”为运算提示符,表明MATLAB处于准备状态,可以输入语句了。 图17命令行窗口 注: 输入语句时,一定要在英文输入法的状态下输入,尤其是标点符号。 Tips: 输完代码后按“Enter”键即可执行命令,按“Shift”+“Enter”键即可换行继续输入代码。 2. 工作区窗口 如图18所示,工作区窗口可以显示目前MATLAB内存中所有变量的变量名、数据结构、字节数以及类型等相关信息。 3. 当前文件夹窗口 如图19所示,该窗口可以显示当前工作目录下的文件,并进行新建、复制、粘贴、重命名等操作。 注: 可以通过cd命令改变当前目录,例如可以输入: cd D:\MATLAB2020a。 图18工作区窗口 图19当前文件夹窗口 4. 历史命令窗口(可以设置为停靠在主窗口内,方便查看) 如图110所示,历史命令窗口主要用于记录之前执行过的命令以及时间,非常好用!(注: 双击某一历史命令可以直接重新执行该命令。右键也可弹出菜单选择相应的功能。) 打开方式如下: 【布局】→【命令历史记录】→【停靠】 图111为历史命令的设置窗口。 图110历史命令窗口 图111设置历史命令窗口 1.2.4搜索路径 1. 搜索路径定义 MATLAB的搜索路径是文件系统中所有文件夹的子集。简单来说,MATLAB通过搜索路径来高效地定位用于 MathWorks产品的文件。 2. 使用场景 当用户需要调用自己写的函数时,需将其所在的目录拓展成MATLAB的搜索路径后方能调用。(因为有时候MATLAB可能调用不到读者自己写的函数导致程序无法运行) 3. 完整学习网址 https://ww2.mathworks.cn/help/MATLAB/MATLAB_env/whatistheMATLABsearchpath.html 图112设置路径 4. 设置方法 (1) 单击主页栏中的“设置路径”,如图112所示。 (2) 通过单击“添加文件夹”或者“删除”,即可“增加”或者“删除”MATLAB的搜索路径中,如图113所示。 图113添加或者删除路径 5. path命令 显示MATLAB的搜索路径,该路径存储在pathdef.m中。 具体语法如下: path(newpath): path(newpath)将搜索路径更改为newpath。 path(oldpath,newfolder): 将newfolder文件夹添加到搜索路径的末尾。如果newfolder已存在于搜索路径中,则path(oldpath,newfolder)将newfolder移至搜索路径的底层。要添加多个文件夹,请使用addpath函数。 path(newfolder,oldpath): 将newfolder文件夹添加到搜索路径的开头。如果newfolder已经在搜索路径中,则path(oldpath,newfolder)将newfolder移到搜索路径的开头。 1.2.5实用快捷键与常用命令 MATLAB常用快捷键与常用命令见表13与表14。 表13常用的快捷键 快捷键功能 ↑/↓切换到之前运行过的指令,可按多次直到找到需要的指令 ←或Ctrl+B退后一格 →前移一格 Ctrl+←光标直接左移一个字符 Esc或Ctrl+U清除当前输入行 Ctrl+C中断当前正在运行的指令 Ctrl+F弹出对话框,用于寻找文件 Ctrl+K清除光标至行尾字 Ctrl+S将工作区全部变量存储为“.mat”文件 Ctrl+Z恢复上一次删除 表14常 用 命 令 命令功能 clc清除当前工作窗口内的所有显示内容 clear清理工作区内的所有变量 clear all清除工作区内的所有变量和函数 clear+变量名清除指定的变量 clf清理图形窗口内容 delete+文件名从磁盘中删除指定文件 help+命令名查询该命令的帮助信息 which+文件名查找该文件的路径 who显示当前工作区空间内所有变量的一个简单列表 whos列出当前工作区空间内所有变量的大小等详细信息 what列出当前目录下的M文件和MAT文件 续表 命令功能 size+变量名显示当前工作区空间内变量的尺寸 length+变量名显示当前工作区空间内变量的长度 disp+变量名显示当前工作区空间内变量 load加载指定文件的变量 save保存内存变量到指定文件 hold图形保持开关 clf清除图形窗口 type显示文件内容 home将光标移至命令窗口的左上角 cd显示或改变当前工作目录 exit/quit退出MATLAB 1.2.6帮助系统 MATLAB有非常完善的帮助系统,当初学者遇到某个函数或者某个命令不知道怎么用的问题时,有三种方法可以解决这个问题。 图114help命令 (1) “help”命令。help命令可以直接获取有关函数或者命令的帮助。例如输入以下代码: help help,如图114所示。 运行结果如图115所示。 图115help命令运行结果 (2) 直接单击操作页面中的按钮,即可弹出帮助页面,如图116所示。 (3) 进入MATLAB社区或者论坛进行交流。可以直接单击“主页”选项卡中的“社区”按钮,如图117所示,进入MathWorks在线社区同网友一起交流经验与解决难题。 图116help命令按钮 图117MATLAB社区按钮 MATLAB社区界面如图118所示。 图118MATLAB社区界面 1.2.7实时编辑器 在实时编辑器中,可以创建随代码一起显示代码输出的实时脚本。可以添加格式化文本、方程、图像和超链接用于增强您的记叙脚本,以及将实时脚本作为交互式文档与其他人共享。 图119新建实时脚本 单击“主页”选项卡中的“新建实时脚本”按钮即可建立实时脚本,如图119与图120所示。 图120新建实时脚本 图121与图122为运行实行脚本。由图122可以看到,左边是代码,右边是实时运行的结果图(修改好代码后单击上方的“运行”按钮即可实时运行)。 图121运行实时脚本 图122运行实时脚本 实时编辑器功能十分强大,可以导出多种格式文件,如图123所示。 图123实时编辑器的导出功能 举例: 导出PDF文件,效果如图124所示。 图124导出效果展示 1.2.8App Designer App Designer是指交互式开发环境,用于设计App布局并对其行为进行编程。它提供MATLAB编辑器的完整集成版本和大量交互式UI组件。它还提供网格布局管理器来组织您的用户界面,并提供自动调整布局选项来使您的App检测和响应屏幕大小的变化。它允许您通过直接从App设计工具工具条将App打包为安装程序文件来分发App,或通过创建独立的桌面App或WebApp来分发App。 点开App选项卡,我们可以发现有以下按钮可以单击,如图125所示。 图125App选项卡 其中左边的按钮顾名思义,点击即可使用。右边的按钮为MATLAB自带的App,方便研究人员直接使用。 单击“设计App”按钮,MATLAB将会弹出如图126所示的界面。 图126设计App 单击“空白App”按钮,即可创造一个新的App,类似于GUI,可视化效果更好,如图127所示。 图127设计App 1.3MATLAB的实际应用——以GUI为例 为了让读者更简单明了地熟悉MATLAB的整个框架体系及编程逻辑,我们将通过GUI为读者展示MATLAB的实际应用。 MATLAB GUI为图形用户界面(Graphical User Interface,GUI),又称图形用户接口,是指采用图形方式显示的计算机操作用户界面,是MATLAB用户可视化交互式的工具,运用GUI生成的操作界面用户可以不用浏览烦冗的代码而进行操作。 使用GUI的好处在于: GUI十分适合新手。因为GUI的界面很简单,包括最基本的文本框、按钮等,很方便进行项目展示。初学者只需要掌握一些基本函数、语法,便可以轻松上手,感受编程的魅力。 初始界面如图128所示。 实例: 通过使用GUI,演示如何将1000个苹果分进10个箱子中,计算出分类方案,满足“顾客想购买任意数量(1~1000个)的苹果时,都可以选出相对应的箱子,使得这些箱子中的苹果之和为顾客所要求的数量”的条件。 图129是GUI运行效果图。 该GUI的代码并不复杂,只需设计几个简单的按钮即可很好地完成任务要求,在本书的第5章中我们将会具体学习如何设计GUI界面。接下来让我们开启学习MATLAB基本语法等知识的章节吧。 图128GUI初始界面 图129GUI运行效果图 即测即练扫码答题