MATLAB发展简史
作者 Cleve Moler, MathWorks
初版 MATLAB® 并不是编程语言,只是一个简单的交互式矩阵计算器,没有程序、工具箱、图形化,当然也没有ODE或FFT。
在这里,我将为大家讲述 MATLAB 发展过程中的一些里程碑。
缘起数学
第一版 MATLAB 的数学基础源自 J. H. Wilkinson 及 18 个同事于1965到1970年间发表的一系列研究论文,后被收集到Wilkinson和C. Reinsch编辑的《自动化计算手册(第二卷)》线性代数(Handbook for Automatic Computation, Volume II, Linear Algebra)中。它们阐述了解决矩阵线性方程和特征值问题的算法,用 Algol 60 实现。
<>EISPACK和LINPACK
<>
1970年,阿贡国家实验室的一组研究人员建议美国国家科学基金会(NSF)“调研满足研发、测试和推广高质量数学软件所需要的方法、成本和资源,并进行测试、认证、分发和支持在特定问题领域的数学软件包”。该科研组将手册中解决特征值问题的Algol转换为Fortran,并在测试和可移植性方面做了大量研究,最终开发出EISPACK(矩阵特征系统软件包)。EISPACK的首个版本于1971年发布,1976年推出了第二版。
1975年,我和Jack Dongarra、Pete Stewart、Jim Bunch四个人提交另一个研究项目到NSF —— 调研数学软件的开发方法。副产品将是软件本身,叫LINPACK的线性方程软件包。此项目的研究中心也设在阿尔贡。
LINPACK源于Fortran,不涉及Algol。该软件包在每个数字精度(共四个)中包含44个子程序。
在某种意义上,LINPACK和EISPACK项目是失败的。我们向NSF提交的研究项目,其目的是“调研满足研发、测试和推广高质量数学软件所需要的方法、成本和资源”。然而我们从未针对这些课题撰写报告或论文。我们只研发了软件。
初版MATLAB
在70年代和80年代初期,我在新墨西哥大学教授线性代数和数值分析。我希望我的学生能够方便地使用LINPACK和EISPACK,而不必编写Fortran程序。我所说的“方便地使用”是指无需执行远程批处理和重复的编辑-编译-链接-加载-执行过程,而校园中央主机计算机一般需要执行这个过程。
因此,我研读了Niklaus Wirth的著作《Algorithms + Data Structures = Programs》,学习如何解析编程语言。我用Fortran编写了初版MATLAB——矩阵实验室(Matrix Laboratory)的缩写,其数据类型只有矩阵。这个项目对我来说是兴趣爱好,也是我希望了解的编程新领域,并且可以给我的学生学习使用。那时候我没有任何正式的外部支持,当然也没有商业计划。
初版MATLAB只是一个交互式矩阵计算器。下面这个启动屏幕展示了所有保留的文字和函数,只有71个。要添加其他函数,用户必须从我这里获取源代码、编写Fortran子程序、在解析表里添加自己的函数名称,然后重新编译MATLAB。
MATLAB 商业化
1979-80学年我在斯坦福任教,在那里教授数值分析的研究生课程,并在课程中引入了这一矩阵计算器。一些学生也在学习控制理论和信号处理等课程,而我对这些内容一无所知。但是,这些课程涉及的数学以矩阵运算为核心,因此MATLAB迅速得到了学生的追捧。
Jack Little当时正在斯坦福攻读研究生工程学位。他的一个朋友是我的学生并向他展示了MATLAB,随后他便在工作中用到了它。
1983年,Little提议开发基于MATLAB的商用产品。彼时,IBM®台式机才推出两年,很难支持MATLAB这样的程序的运行,但是Little希望对它进行改进。他辞掉了工作,在Sears购买了Compaq®电脑克隆机,并搬到了斯坦福的后山上。在我的鼓励下,他用C语言编写了MATLAB新的扩展版本。我的一个朋友Steve Bangert也在业余时间研究新版MATLAB。
终于,PC-MATLAB于1984年在拉斯维加斯举行的IEEE决策与控制会议(IEEE Conference on Decision and Control)上首次发布。次年,发布了针对Unix工作站的Pro-MATLAB。
在扩展版本中,Little和Bangert对初版MATLAB做了许多重要的修改和提高。其中最重要的是函数、工具箱和图形化。
如今的MATLAB
基于矩阵数学运算的根基,MATLAB一直在不断发展完善以满足工程师和科学家们日益更新的需求。在时间表中展示了MATLAB的主要发展历程。在时间表中展示了MATLAB的主要发展历程。在这里,我将对其中一些内容进行说明。
ODEs
自商业化以来,常微分方程的数值解一直是MATLAB的重要部分。ODE也是Simulink®——用于仿真和基于模型的设计的孪生产品——核心所在。
范德堡尔振荡器是一个经典的ODE示例。
参数μ是非线性阻尼项的强度。当μ = 0,就是一个基本的谐波振荡器。
MATLAB代码将振荡器表达为一对一阶方程。
mu = 5; vdp = @(t,y) [y(2); mu*(1-y(1)^2)*y(2)-y(1)]; tspan = [0 30]; y0 = [0 0.01]'; [t,y] = ode23s(vdp,tspan,y0); plot(t,y,'.-') legend({'y','dy/dt'}) xlabel('t')
当参数μ设置为5,范德堡尔振荡器将会成为一个适度刚性微分方程。我预先使用了ode23s
求解器;名称中的“s”表示它适用于刚性方程。在图中,您可以看到一系列仿真步,他们的解快速变化。在非刚性求解器中会出现更多仿真步。刚性ode求解器使用隐式方法,需要在每一步使用联立线性方程组。MATLAB标志式的反斜杠运算符在这里很好地发挥了作用。
数据类型
多年来,MATLAB只有一种数值数据类型:以64位格式存储的IEEE标准754双精度浮点。随着人们开始在更多应用和更大数据集中使用MATLAB,我们提供了更多的数据呈现方式。
单精度和整数
对于单精度算法的支持开始于本世纪初,在2004年发布的MATLAB 7中实现。由于仅需要32位存储,单精度将大型阵列的内存需求降低了一半。MATLAB没有声明,因此单精度变量由可执行转换函数获取。
MATLAB 7还引入三种无符号整数数据类型:uint8
、uint16
和uint32
;三种带符号整数数据类型:int8
、int16
和int32
;以及一种逻辑数据类型:logical。
稀疏矩阵
稀疏矩阵于1992年随MATLAB 4推出。这是一种能够显示超大数组(几乎不含非零值)又节省内存的方式。它们只会存储非零元素,以及行索引和指向列开头的指针。 MATLAB增加了一对函数sparse
和full
,这是MATLAB前端的唯一变化。所有运算几乎都能同等应用于全矩阵和稀疏矩阵。稀疏存储模式通过矩阵在以与非零项数量成比例的空间中呈现,而大多数运算则以与非零项上数学运算量的时间成比例计算稀疏结果。
单元阵列
单元阵列于1996年随MATLAB 5发布。单元阵列是一个包含索引的具有异构可能的MATLAB对象集合,包括其他单元阵列。单元阵列通过大括号{}
创建。
单元阵列可通过大括号和圆括号进行索引。如果使用大括号,c{k}
表示第k
个单元的内容。如果使用圆括号,c(k)
表示包含指定单元的另一个单元阵列。我们可以想象成邮箱集合。box(k)
表示第k个邮箱。box{k}
是第k
个邮箱中的邮件。
结构
结构和“圆点表示法”于1996年发布。以下用于创建小班成绩簿的脚本显示了结构和圆点表示法的使用。
Math101.name = ["Alice Jones"; "Bob Smith"; "Charlie Brown"]; Math101.grade = ["A"; "B+"; "C"]; Math101.year = [4; 2; 3];
要调取名单,我们需要姓名列表。
disp(Math101.name) "Alice Jones" "Bob Smith" "Charlie Brown"
更改Charlie的成绩则需要结构和数组表示。
Math101.grade(3) = “W”; disp(Math101.grade) “A” “B+” “W”
对象
2008年,我们对MATLAB面向对象编程功能进行了重要改进。创建类可简化涉及特定数据结构或与特殊数据交互的大量函数的编程任务。MATLAB 类支持函数和运算符重载、对属性和方法的控制访问、引用和值语义以及事件和侦听程序。
MATLAB图形系统是一个MATLAB面向对象编程方法的大型复杂示例。
提升MATLAB的可用性:桌面版和实时编辑器
首版MATLAB只是简单的终端应用程序。随着时间的推移,我们增加了图形化、编辑和其他工具的独立窗口。这些改进使MATLAB的使用变得更加简单,尤其是对那些没有编程经验的用户来说。两个影响最大的功能是桌面版和实时编辑器(Live Editor)。
桌面版
MATLAB桌面版于2000年发布。以下截图显示的是桌面版目前的界面。
用户可看到四个面板:当前文件夹查看器(左)、工作区查看器(右)、编辑器/调试器(中上)和传统命令行窗口(下中)。文件查看器和命令行历史记录窗口还可以包含在自定义布局中。
任何面板都可以关闭或在取消停靠后在独立窗口中打开。
实时编辑器
实时编辑器于2016年推出,且仍在不断地快速更新。
描述性文本以及MATLAB输入、输出和图形被整合在一个交互式文档中,并可导出为HTML、PDF或LaTeX文件。
并行计算
Parallel Computing Toolbox™于2004年在超级计算大会上发布。2005年,比尔盖茨在SC05的主题演讲中使用MATLAB演示了微软向高性能计算领域的迈进。
通过在一个集群中的多个机器上或者在一个机器上的多个内核中运行多个MATLAB工作进程,该工具箱支持粗粒度的分布式内存并行机制。MPI用于底层消息传递。目前,该工具箱最受欢迎的功能是并行的for
循环命令 —parfor
.
该工具箱还支持在所安装的图形处理器(GPU)中实现细粒度的共享内存并行机制。gpuArray
让一切变为现实。
工具箱
如今的MATLAB的大多数功能来自供专业化应用的工具箱。R2018a中,MATLAB 产品系列共有 63 个工具箱,支持以下应用领域:
- 应用程序发布
- 代码生成
- 计算生物
- 计算金融
- 控制系统
- 数据库访问和报告
- 图像处理和计算机视觉
- 数学,统计与优化
- 并行计算
- 信号处理和无线通信
- 测试和测量
未来愿景
从简单的计算器开始,MATLAB已经走了很久,成为一个富有生命力的生态系统,支持着各个领域的技术计算。我们将继续加强现有功能,同时审慎添加新功能。我们的目标始终是简便、强大,快速。
2018 年发布
MATLAB时间线
1984
PC-MATLAB
快速傅里叶变换
绘图
1985
Pro-MATLAB
Control System Toolbox™
1987
Signal Processing Toolbox™
常微分方程
1992
稀疏矩阵
Simulink®
1993
Image Processing Toolbox™
Symbolic Math Toolbox™
1996
单精度
元胞数组
结构体
1999
对象
2000
MATLAB 桌面
LAPACK
2004
整数数据类型
函数句柄
并行计算
2008
改进的对象
2010
GPU 支持
2014
新绘图系统
2016
实时编辑器
2017
tall 数组和分类数组