MATLAB
MATLAB(Matrix Laboratory,矩阵实验室)是由美国The MathWorks公司出品的商业数学软件。MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。除矩阵运算、绘制函数/数据图像等常用功能外,MATLAB还可用来创建用户界面,以及调用其它语言(包括C、C++、Java、Python、FORTRAN)编写的程序。
L-shaped membrane商标[1] | |
MATLAB R2017a屏幕截图 | |
開發者 | 迈斯沃克 |
---|---|
初始版本 | 1984年 |
穩定版本 | R2020a (2020年3月19日 ) |
编程语言 | C语言、C++、Java |
操作系统 | Windows、macOS、Linux[2] |
系統平台 | IA-32、x86-64 |
类型 | 数值计算 |
许可协议 | 专有软件、商业软件 |
网站 | mathworks.com |
多范式:函數、指令式、过程式、面向对、阵列 | |
設計者 | 克里夫·莫勒尔 |
實作者 | 迈斯沃克 |
20世纪70年代末 | |
穩定版本 | 9.8 (R2020a)
(2020年3月19日
) |
型態系統 | 动态、弱 |
文件扩展名 | .m |
網站 | mathworks.com |
啟發語言 | |
影響語言 | |
|
MATLAB主要用于数值运算,但利用为数众多的附加工具箱,它也适合不同领域的应用,例如控制系统设计与分析、影像處理、深度學習、信号处理与通讯、金融建模和分析等。另外还有配套软件包Simulink提供可视化开发环境,常用于系统模拟、动态/嵌入式系统开发等方面。
在R2017b後的MATLAB版本更釋出了深度學習的工具,使其能夠視覺化的快速建立AI模型,並透過各種轉碼器,部屬於嵌入式硬體之中。
截至2020年,MATLAB在全球擁有超過400萬用戶。MATLAB用戶來自工程,科學和經濟學領域。
历史
1970年代末到80年代初,时任美国新墨西哥大學教授的克里夫·莫勒尔为了让学生更方便地使用LINPACK及EISPACK(需要通过FORTRAN编程来实现,但当时学生们并无相关知识),独立编写了第一个版本的MATLAB。这个版本的MATLAB只能进行简单的矩阵运算,例如矩阵转置、计算行列式和本征值,此版本软件分发出大约两三百份[7][8]。
1984年,杰克·李特、克里夫·莫勒尔和斯蒂夫·班格尔特合作成立了MathWorks公司,正式把MATLAB推向市场[8][9]。MATLAB最初是由莫勒尔用FORTRAN编写的,李特和班格尔特花了约一年半的时间用C重新编写了MATLAB并增加了一些新功能,同时,李特还开发了第一个系统控制工具箱,其中一些代码到现在仍然在使用[8]。C语言版的面向MS-DOS系统的MATLAB 1.0在拉斯维加斯举行的IEEE決策与控制会议(IEEE Conference on Decision and Control)正式推出[8][10][lower-alpha 1],它的第一份订单只售出了10份拷贝[8],而到了现在,根据MathWorks自己的数据[11],目前世界上180多个国家的超过三百万工程师和科学家在使用MATLAB和Simulink。
1992年,学生版MATLAB推出;1993年,Microsoft Windows版MATLAB面世;1995年,推出Linux版[8]。
主要功能
MATLAB的主要提供以下功能[12]:
- 可用于技术计算的高级语言
- 可对代码、文件和数据进行管理的开发环境
- 可以按迭代的方式探查、设计及求解问题的交互式工具
- 可用于线性代数、统计、傅立叶分析、筛选、优化以及数值积分等的数学函数
- 可用于可视化数据的二维和三维图形函数
- 可用于构建自定义的图形用户界面的各种工具
- 可将基于MATLAB的算法与外部应用程序和语言(如C、C++、Fortran、Java、COM以及Microsoft Excel)集成的各种函数
工具箱
MATLAB的一个重要特点是可扩展性。作为Simulink和其它所有MathWorks产品的基础,MATLAB可以通过附加的工具箱(Toolbox)进行功能扩展,每一个工具箱就是实现特定功能的函数的集合[lower-alpha 2]。MathWorks提供的工具箱分以下几大类[13]:
- 数学和优化
- 统计和数据分析
- 影像處理和電腦視覺
- 深度學習與機器學習
- 控制系统设计和分析
- 信号处理和通讯
- 测试和测量
- 金融建模和分析
- 应用程序部署
- 数据库连接和报表
- 分布式计算
这些工具箱大多是用开放式的MATLAB语言写成,用户不但可以查看源代码,还可以可根据自己的需要进行修改以及创建自定义函数。此外,常有用户在MATLAB Central: File Exchange 页面存档备份,存于发布自己编写的MATLAB程序或工具箱,供他人自由下载使用。
MATLAB语言
MATLAB语言是一种交互性的数学脚本语言,其语法与C/C++类似。它支持包括逻辑(boolean)、数值(numeric)、文本(text)、函数柄(function handle)和异质数据容器(heterogeneous container)在内的15种数据类型,每一种类型都定义为矩阵或阵列的形式(0维至任意高维)[14]。
执行MATLAB代码的最简单方式是在MATLAB程序的命令窗口(Command Window)的提示符处(>>
)输入代码,MATLAB会即时返回操作结果(如果有的话)。此时, MATLAB可以看作是一个交互式的数学终端,简单来说,一个功能强大的“计算器”。MATLAB代码同样可以保存在一个以.m为后缀名的文本文件中,然后在命令窗口或其它函数中直接调用。
变量与赋值
MATLAB的变量名字跟许多程序语言一样,严格区分大小写,例如,var、VAR和Var是三个不同的变量。另外,MATLAB中变量名字必须以字母为首字母,3var、_var等是非法的变量名。变量由赋值运算符(=
)定义. MATLAB是动态检查的,这意味着变量可以在未定义其类型的情况下赋值并且变量的类型也可以改变,除非将变量看做是符号对象[15]。变量值可以取自常量,计算中的其他变量的值,或某一函数的输出。例如:
>> x = 17
x =
17
>> x = 'hat'
x =
hat
>> x = [3*4, pi/2]
x =
12.0000 1.5708
>> y = 3*sin (x)
y =
-1.6097 3.0000
向量和矩阵
MATLAB的意思是"矩阵实验室",因此它提供了许多创建向量,矩阵和多维数组的便捷的方式。在MATLAB自己的语言中,一个向量(vector)指的是一维(1×N或N×1)矩阵,在其他语言中通常被叫做数组(array)。矩阵(matrix)通常指的是2-维数组,例如m×n数组其中m和n大于或等于1。多维数组通常指的是维数大于2的数组。
需要注意的是,虽然MATLAB用C语言重写,但是在矩阵存储方式上却和FORTRAN保持一致,两者使用的均为列优先存储,而非行优先存储[lower-alpha 3]。在进行较大的矩阵运算时,这一差别对性能的影响是不应忽略的。
MATLAB提供了定义简单数组的简单方式,使用语法:初值:
增量:
终值。例如:
>> array = 1:2:9
array =
1 3 5 7 9
定义了一个名为array
的变量(或向已存在的变量array
赋予一个新值),其值为包含1, 3, 5, 7, 9的一个向量。即数组由1开始(初值),每次以增量2(增量)递增,当达到9(终值)时停止。
>> array = 1:3:9
array =
1 4 7
在该语法中增量可被省略(这样仅剩一个冒号),这时增量采用默认值1。
>> ari = 1:5
ari =
1 2 3 4 5
由于默认增量为1,上面的语句对变量ari
用1, 2, 3, 4, 5的向量赋值。
在MATLAB内定义矩阵同样很简单,例如:
>> M = [1,2,3;4,5,6;7,8,9]
M =
1 2 3
4 5 6
7 8 9
在MATLAB内存取矩阵元素同样非常简单,例如:
>> M = [1,2,3;4,5,6;7,8,9]
M =
1 2 3
4 5 6
7 8 9
>> M(2,2)ans =
5
>> M(2,:)ans =
4 5 6
>> M(:,1)ans =
1
4
7
>> M(2,2) = 10
M =
1 2 3
4 10 6
7 8 9
若要對矩阵內所有元素做同樣的運算,如次方倍,則需要在運算元前面加上".",例如:
>> M = [1,2,3;4,5,6;7,8,9]
>> M .^2
ans =
1 4 9
16 25 36
49 64 81
若不在運算元前面加上"."則代表矩陣運算:
>> M = [1,2,3;4,5,6;7,8,9]
M ^2 = M * M =
30 36 42
66 81 96
102 126 150
代数/符号运算
利用MATLAB的符号数学工具箱(Symbolic Math Toolbox)[lower-alpha 4]可以进行代数或符号运算,如分解多项式因子和解代数方程:
>> syms x y
>> A=x^3-3*x^2*y+3*x*y^2-y^3;
>> factor (A)
ans =
(x - y)^3
把多项式简化成了。
>> solve('x^2 - 2*x - 4 = 0')ans =
1 - 5^(1/2)
5^(1/2) + 1
求得方程的两个解为和。
图形和图形用户界面编程
MATLAB中常用的绘图命令是plot,例如描绘一个在[-4,4]区间内的正弦函数:
>> x = -4:0.05:4;
>> y = sin (x);
>> plot(x,y)
|
|
利用plot命令也可以在同一幅图中描绘多个函数图形:
>> x = 0:.01:2*pi;
>> y1 = sin (x);
>> y2 = sin(2*x);
>> y3 = sin(4*x);
>> plot(x, [y1; y2; y3])
>> legend('y=sin(x)', 'y=sin (2x)','y=sin (4x)')
|
|
用MATLAB的画图命令可以生成复杂的三维图形[lower-alpha 5]:
>> t = linspace(0, 2*pi, 512);
>> [u,v] = meshgrid (t);
>> a = -0.4; b = .5; c = .1;
>> n = 3;
>> x =(a*(1 - v/(2*pi)) .*(1+cos(u)) + c) .* cos(n*v);
>> y =(a*(1 - v/(2*pi)) .*(1+cos(u)) + c) .* sin(n*v);
>> z = b*v/(2*pi) + a*(1 - v/(2*pi)) .* sin (u);
>> surf(x,y,z,y)
>> axis off
>> axis equal
>> colormap(hsv(1024))
>> shading interp
>> material shiny
>> lighting phong
>> camlight('left', 'infinite')
>> view([-160 25])
|
版本歷史
到7.1版为止,MATLAB的释放编号均以数字来命名,例如R7,R12.1,R14 SP1等;从7.2版开始,释放编号以年份来命名,每年3月份推出的用a表示,9月份推出的则以b表示,例如R2006a代表2006年3月推出的版本,R2009b指2009年下半年推出的版本[16]:
版本 | 发行编号 | 年份 |
---|---|---|
MATLAB 1.0 | R? | 1984年 |
MATLAB 2 | R? | 1986年 |
MATLAB 3 | R? | 1987年 |
MATLAB 3.5 | R? | 1990年 |
MATLAB 4 | R? | 1992年 |
MATLAB 4.2c | R7 | 1994年 |
MATLAB 5.0 | R8 | 1996年 |
MATLAB 5.1 | R9 | 1997年 |
MATLAB 5.1.1 | R9.1 | |
MATLAB 5.2 | R10 | 1998年 |
MATLAB 5.2.1 | R10.1 | |
MATLAB 5.3 | R11 | 1999年 |
MATLAB 5.3.1 | R11.1 | |
MATLAB 6.0 | R12 | 2000年 |
MATLAB 6.1 | R12.1 | 2001年 |
MATLAB 6.5 | R13 | 2002年 |
MATLAB 6.5.1 | R13SP1 | 2003年 |
MATLAB 6.5.2 | R13SP2 | |
MATLAB 7 | R14 | 2004年 |
MATLAB 7.0.1 | R14SP1 | |
MATLAB 7.0.4 | R14SP2 | 2005年 |
MATLAB 7.1 | R14SP3 | |
MATLAB 7.2 | R2006a | 2006年 |
MATLAB 7.3 | R2006b | |
MATLAB 7.4 | R2007a | 2007年 |
MATLAB 7.5 | R2007b | |
MATLAB 7.6 | R2008a | 2008年 |
MATLAB 7.7 | R2008b | |
MATLAB 7.8 | R2009a | 2009年 |
MATLAB 7.9 | R2009b | |
MATLAB 7.10 | R2010a | 2010年 |
MATLAB 7.11 | R2010b | |
MATLAB 7.12 | R2011a | 2011年 |
MATLAB 7.13 | R2011b | |
MATLAB 7.14 | R2012a | 2012年 |
MATLAB 8.0 | R2012b | |
MATLAB 8.1 | R2013a | 2013年 |
MATLAB 8.2 | R2013b | |
MATLAB 8.3 | R2014a | 2014年 |
MATLAB 8.4 | R2014b | |
MATLAB 8.5 | R2015a | 2015年 |
MATLAB 8.6 | R2015b | |
MATLAB 9.0 | R2016a | 2016年 |
MATLAB 9.1 | R2016b | |
MATLAB 9.2 | R2017a | 2017年 |
MATLAB 9.3 | R2017b | |
MATLAB 9.4 | R2018a | 2018年 |
MATLAB 9.5 | R2018b | |
MATLAB 9.6 | R2019a | 2019年 |
MATLAB 9.7 | R2019b | |
MATLAB 9.8 | R2020a | 2020年 |
MATLAB 9.9 | R2020b |
从2014a版起,Matlab界面支持中文[17]。
其它科学计算软件
Maple
Maple是Waterloo Maple Inc.(简称Maplesoft)开发的商业计算机代数系统,用于快速计算、开发设计表单、教学基本概念或建立高保真模拟模型等。最新版本是2018年3月发布的Maple 2018.0,分Personal(个人版),Professional(专业版),Academic(学术版),Government(政府版)和Student(学生版)。
Mathematica
Mathematica是斯蒂芬·沃爾夫勒姆开发的科学计算软件,开发工作现由Wolfram Research公司负责。最新版本是2019年4月16日发布的Mathematica 12.0。[18]
LabVIEW
LabVIEW是美国国家仪器公司开发的可视化编程平台,主要用于数据采集,仪器控制和工业自动化。最新版本是2017年8月发布的LabVIEW 2017。
FreeMat
FreeMat是一个与MATLAB和IDL很类似的数值计算平台及程序语言。最新版本是2009年10月发布的FreeMat 4.0
GNU Octave
GNU Octave是一種主要用於數值計算的高級語言。它除了提供數值方法解決線性和非線性問題的命令介面,還提供了一種與MATLAB大抵兼容的語言。最新版本是2019年3月1日发布的5.1.0。
Scilab
Scilab是一个交互性的数值运算平台,主要用于工程和科学应用方面,例如航空航天、汽车、能源、金融、化学、生物、医学、国防等。最新版本是5.4.0。
ScicosLab
ScicosLab是由一些曾在INRIA和ENPC参与Scilab开发的研究人员,在Scilab BUILD4版本的基础上开发出來的GTK+版本,它集成了建模/模拟工具Scicos[lower-alpha 6]及其它数量众多的工具箱,被认为是“惟一一款可以与商业软件MATLAB/Simulink及MATRIXx/SysstemBuild媲美的开源软件”。最新稳定版本是4.4.1。
JAMA
JAMA (JAMA : A Java Matrix Package),一种Java语言编程工具包。目前最新1.0.3版本,是2012年11月9日发布的。
注释
- 在其創始人Moler的回顧文獻中,誤將會議名稱的"Decision"誤植成"Design"[8],而在IEEE該社群官方的歷史紀錄文件中,有明確提到MATLAB第一次公開展示的正確會議名稱[10].
- MathWorks官方提供的工具箱需通过支付相对应的费用单独获取。
- 以一个定义为为M的3x3矩阵为例:列优先存储指的是MATLAB先保存第一列的3个元素,然后保存第二列的,最后保存第三列的元素,从而这9个矩阵元素在MATLAB中的排序是从1到9,所以在调用矩阵元素时,M(2)指的是第一列的第二个元素,M(6)指的是第二列第三个元素(当然这两个元素也可以用二维的方式调用,M(2)对应M(1,2),M(6)对应M(2,3));行优先存储则刚好相反,先保存第一行的3个元素,再保存第二行和第三行的元素。
- 从4.9版(对应于MATLAB R2007b+)开始,新的MuPAD运算引擎代替了之前版本使用的Maple引擎,详情见Version 4.9(R2007b+)Symbolic Math Toolbox Software
- 本例子基於Davis, Timothy A.; Kermit Sigmon. 7th. Chapman & Hall/CRC. 2005. ISBN 1-58488-523-8 (英语).一书中的范例,形状、颜色、角度等参数有修改。
- 第一个版本的Scicos是完全用Scilab语言写成的,但后续版本逐步改用C语言进行开发。由于在Scilab 5版本中出现稳定性及性能问题,开发人员决定此后Scicos仅在ScicosLab中进行后续开发。详情见Scilab/Scicos history
参考文献
引用
- . MathWorks. 2003 [February 7, 2014]. (原始内容存档于2019-04-23).
- . MathWorks. [August 14, 2013]. (原始内容存档于2016-10-13).
- (PDF). Computer History Museum. [December 6, 2016]. (原始内容 (PDF)存档于2014-12-27).
So APL, Speakeasy, LINPACK, EISPACK, and PL0 were the predecessors to MATLAB.
- Bezanson, Jeff; Karpinski, Stefan; Shah, Viral; Edelman, Alan. . Julia Language. February 14, 2012 [December 1, 2016]. (原始内容存档于2019-02-19).
- Eaton, John W. (PDF). Texas-Wisconsin Modeling and Control Consortium. May 21, 2001 [December 1, 2016]. (原始内容 (PDF)存档于2017-08-09).
- . Scilab. [December 1, 2016]. (原始内容存档于2016-12-01).
- Thomas Haigh. (PDF). Santa Barbara, California. 2004-03-08: 64–65 [2010-04-29]. (原始内容存档 (PDF)于2018-10-12) (英语).
- Cleve Moler. (PDF). January 2006 [2010-04-30]. (原始内容 (PDF)存档于2009-04-11) (英语).
- . MathWorks. [2010-04-29]. (原始内容存档于2010-04-16).
- Schrader, C.B.; Spong, M.W. . IEEE Control Systems Magazine. 2004-12, 24 (6): 56 – 66 [Jan 14, 2011]. doi:10.1109/MCS.2004.1368481. (原始内容存档于2015-01-09).
- . MathWorks. [2010-04-29]. (原始内容存档于2010-05-02).
- . MathWorks中国. [2010-04-29]. (原始内容存档于2010-08-06).
- . MathWorks中国. [2010-04-29]. (原始内容存档于2011-06-06).
- . MathWorks. [2010-05-01]. (原始内容存档于2010-05-05).
- . MathWorks. [2010-05-01]. (原始内容存档于2010-05-05).
- . MathWorks. [2010-04-30]. (原始内容存档于2010-05-02).
- . MathWorks. [2014-03-06]. (原始内容存档于2014-03-14).
- Stephen Wolfram. . 2019年4月16日 [2019年11月19日]. (原始内容存档于2020年4月9日).
- . [2020-06-29]. (原始内容存档于2020-10-01).
外部链接
維基教科書中的相關電子:MATLAB Programming |
维基共享资源中相关的多媒体资源:MATLAB |
- MATLAB官方網站 页面存档备份,存于
- MATLAB線上教材 页面存档备份,存于
- Matlab技术论坛 页面存档备份,存于
- 線上執行Matlab語法 页面存档备份,存于
- 矩阵实验室(MATLAB)新浪微博 页面存档备份,存于
- Matlab教學 页面存档备份,存于