MATLAB

MATLAB（Matrix Laboratory，矩阵实验室）是由美国The MathWorks公司出品的商业数学软件。MATLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。除矩阵运算、绘制函数/数据图像等常用功能外，MATLAB还可用来创建用户界面，以及调用其它语言（包括C、C++、Java、Python、FORTRAN）编写的程序。

MATLAB主要用于数值运算，但利用为数众多的附加工具箱，它也适合不同领域的应用，例如控制系统设计与分析、影像处理、深度学习、信号处理与通讯、金融建模和分析等。另外还有配套软件包Simulink提供可视化开发环境，常用于系统模拟、动态/嵌入式系统开发等方面。

在R2017b后的MATLAB版本更新释出了深度学习的工具，使其能够视觉化的快速建立AI模型，并透过各种转码器，部属于嵌入式硬件之中。

截至2020年，MATLAB在全球拥有超过400万用户。MATLAB用户来自工程、科学和经济学领域。

## 历史

1970年代末到80年代初，时任美国新墨西哥大学教授的克里夫·莫勒尔为了让学生更方便地使用LINPACK及EISPACK（需要通过FORTRAN编程来实现，但当时学生们并无相关知识），独立编写了第一个版本的MATLAB。这个版本的MATLAB只能进行简单的矩阵运算，例如矩阵转置、计算行列式和本征值，此版本软件分发出大约两三百份。

1984年，杰克·利特尔、克里夫·莫勒尔和史蒂夫·班格特（Steve Bangert）合作成立了MathWorks公司，正式把MATLAB推向市场。MATLAB最初是由莫勒尔用FORTRAN编写的，利特尔和班格尔特花了约一年半的时间用C重新编写了MATLAB并增加了一些新功能，同时，利特尔还开发了第一个系统控制工具箱，其中一些代码到现在仍然在使用。C语言版的面向MS-DOS系统的MATLAB 1.0在拉斯维加斯举行的IEEE决策与控制会议（IEEE Conference on Decision and Control）正式推出，它的第一份订单只售出了10份拷贝，而到了现在，根据MathWorks自己的数据，目前世界上180多个国家的超过三百万工程师和科学家在使用MATLAB和Simulink。

1992年，学生版MATLAB推出；1993年，Microsoft Windows版MATLAB面世；1995年，推出Linux版。

## 主要功能

MATLAB的主要提供以下功能：

- 可用于技术计算的高级语言
- 可对代码、文件和数据进行管理的开发环境
- 可以按迭代的方式探查、设计及求解问题的交互式工具
- 可用于线性代数、统计、傅立叶分析、筛选、优化以及数值积分等的数学函数
- 可用于可视化数据的二维和三维图形函数
- 可用于构建自定义的图形用户界面的各种工具
- 可将基于MATLAB的算法与外部应用程序和语言（如C、C++、Fortran、Java、COM以及Microsoft Excel）集成的各种函数

### 工具箱

MATLAB的一个重要特点是可扩展性。作为Simulink和其它所有MathWorks产品的基础，MATLAB可以通过附加的工具箱（Toolbox）进行功能扩展，每一个工具箱就是实现特定功能的函数的集合。MathWorks提供的工具箱分以下几大类：

- 数学和优化
- 统计和数据分析
- 影像处理和电脑视觉
- 深度学习与机器学习
- 控制系统设计和分析
- 信号处理和通讯
- 测试和测量
- 金融建模和分析
- 应用程序部署
- 数据库连接和报表
- 分布式计算

这些工具箱大多是用开放式的MATLAB语言写成，用户不但可以查看源代码，还可以可根据自己的需要进行修改以及创建自定义函数。此外，常有用户在 MATLAB Central: File Exchange 发布自己编写的MATLAB程序或工具箱，供他人自由下载使用。

## MATLAB语言

MATLAB语言是一种交互性的数学脚本语言，其语法与C/C++类似。它支持包括逻辑（boolean）、数值（numeric）、文本（text）、函数柄（function handle）和异质数据容器（heterogeneous container）在内的15种数据类型，每一种类型都定义为矩阵或阵列的形式（0维至任意高维）。

执行MATLAB代码的最简单方式是在MATLAB程序的命令窗口（Command Window）的提示符处（`>>`）输入代码，MATLAB会即时返回操作结果（如果有的话）。此时, MATLAB可以看作是一个交互式的数学终端，简单来说，一个功能强大的“计算器”。MATLAB代码同样可以保存在一个以.m为后缀名的文本文件中，然后在命令窗口或其它函数中直接调用。

### 变量与赋值

MATLAB的变量名字跟许多程序语言一样，严格区分大小写，例如，var、VAR和Var是三个不同的变量。另外，MATLAB中变量名字必须以字母为首字母，3var、_var等是非法的变量名。变量由赋值运算符（`=`）定义. MATLAB是动态检查的，这意味着变量可以在未定义其类型的情况下赋值并且变量的类型也可以改变，除非将变量看做是符号对象。变量值可以取自常量，计算中的其他变量的值，或某一函数的输出。例如：

```matlab
>> 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保持一致，两者使用的均为列优先存储，而非行优先存储。在进行较大的矩阵运算时，这一差别对性能的影响是不应忽略的。

MATLAB提供了定义简单数组的简单方式，使用语法：初值`:`增量`:`终值。例如：

```matlab
>> array = 1:2:9
array =
 1 3 5 7 9
```

定义了一个名为`array`的变量（或向已存在的变量`array`赋予一个新值），其值为包含1, 3, 5, 7, 9的一个向量。即数组由1开始（初值），每次以增量2（增量）递增，当达到9（终值）时停止。

```matlab
>> array = 1:3:9
array =
 1 4 7
```

在该语法中增量可被省略（这样仅剩一个冒号），这时增量采用默认值1。

```matlab
>> ari = 1:5
ari =
 1 2 3 4 5
```

由于默认增量为1，上面的语句对变量`ari`用1, 2, 3, 4, 5的向量赋值。

在MATLAB内定义矩阵同样很简单，例如：

```matlab
>> M = [1,2,3;4,5,6;7,8,9]
M =
     1     2     3
     4     5     6
     7     8     9
```

在MATLAB内存取矩阵元素同样非常简单，例如：

```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
```

若要对矩阵内所有元素做同样的运算，如次方倍，则需要在算子前面加上"."，例如：

```matlab
>> M = [1,2,3;4,5,6;7,8,9]

>> M .^2 
ans =
     1     4     9
    16    25    36
    49    64    81     
```

若不在算子前面加上"."则代表矩阵运算：

```matlab
>> 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）可以进行代数或符号运算，如分解多项式因子和解代数方程：

```matlab
>> syms x y

>> A=x^3-3*x^2*y+3*x*y^2-y^3;

>> factor (A)
ans =
（x - y）^3
```

把多项式$A = x^3 - 3x^2y + 3xy^2 - y^3$简化成了$(x - y)^3$。

```matlab
>> solve（'x^2 - 2*x - 4 = 0'）ans =
 1 - 5^（1/2）
 5^（1/2） + 1
```

求得方程$x^2 - 2x - 4 = 0$的两个解为$1 + \sqrt{5}$和$1 - \sqrt{5}$。

## 图形和图形用户界面编程

MATLAB中常用的绘图命令是plot，例如描绘一个在-4,4区间内的正弦函数：

<image>

```matlab
>> x = -4:0.05:4;
>> y = sin (x);
>> plot(x,y)
```

利用plot命令也可以在同一幅图中描绘多个函数图形：

<image>

```matlab
>> 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的画图命令可以生成复杂的三维图形：

<image>

```matlab
>> 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年下半年推出的版本：

版本｜发行编号｜年份

MATLAB 1.0｜暂时不明｜1984年

MATLAB 2｜1986年

MATLAB 3｜1987年

MATLAB 3.5｜1990年

MATLAB 4｜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

MATLAB 9.10｜R2021a｜2021年

MATLAB 9.11｜R2021b

MATLAB 9.12｜R2022a｜2022年

MATLAB 9.13｜R2022b

MATLAB 9.14｜R2023a｜2023年

从2014a版起，Matlab界面支持中文。

## 其它科学计算软件

### 商业软件

#### 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。

#### LabVIEW

LabVIEW是美国国家仪器公司开发的可视化编程平台，主要用于数据采集，仪器控制和工业自动化。最新版本是2021年8月发布的LabVIEW 2021。

### 开源软件

#### FreeMat

FreeMat是一个与MATLAB和IDL很类似的数值计算平台及程序语言。最新版本是2009年10月发布的FreeMat 4.0

#### GNU Octave

GNU Octave是一种主要用于数值计算的高级语言。它除了提供数值方法解决线性和非线性问题的命令界面，还提供了一种与MATLAB大抵兼容的语言。最新版本是2024年3月14日发布的9.1.0。

#### Scilab

Scilab是一个交互性的数值运算平台，主要用于工程和科学应用方面，例如航空航天、汽车、能源、金融、化学、生物、医学、国防等。最新版本是5.4.0。

#### ScicosLab

ScicosLab是由一些曾在INRIA和ENPC参与Scilab开发的研究人员，在Scilab BUILD4版本的基础上开发出来的GTK+版本，它集成了建模/模拟工具Scicos及其它数量众多的工具箱，被认为是“惟一一款可以与商业软件MATLAB/Simulink及MATRIXx/SysstemBuild媲美的开源软件”。最新稳定版本是4.4.1。

#### JAMA

JAMA(numerical linear algebra library) (JAMA : A Java Matrix Package)，一种Java语言编程工具包。目前最新1.0.3版本，是2012年11月9日发布的。

#### NumPy与SciPy

NumPy是Python语言的一个扩充程式库。支援高阶大量的维度阵列与矩阵运算，此外也针对阵列运算提供大量的数学函式函式库。

SciPy是一个开源，基于NumPy的Python算法库和数学工具包，包含的模组有最佳化、线性代数、积分、插值、特殊函式、快速傅立叶变换、讯号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。

#### Julia

Julia是一种高级通用语言。

## 中国大陆受限

2020年6月12日，美国对位列实体清单中的哈尔滨工业大学、哈尔滨工程大学等高等院校实施制裁，禁止使用MATLAB。

## 基本资料

- 域：L-shaped membrane商标
- 域：

<image>

- 开发者：迈斯沃克
- 发行日期：1984年
- 软件版本周期：R2024b
- 软件版本周期：2024年9月12日
- 状态：Active
- 编程语言：C语言、C++、Java
- 操作系统：Windows、macOS、Linux
- 平台：IA-32、x86-64
- 类型：数值计算
- 许可协议：专有软件、商业软件
- 编程范型：多范式：函数、指令式、过程式、面向对、阵列编程
- 发行时间：20世纪70年代末
- 设计者：克里夫·莫勒尔
- 开发者：迈斯沃克
- 软件版本周期：R2022a
- 软件版本周期：2022年3月9日
- 类型系统：动态、弱
- turing-complete：Yes
- 受影响于：APL、EISPACK、LINPACK、PL/0、Speakeasy
- 施影响于：Julia、Octave、Scilab
- 文件扩展名：.m
- wikibooks：MATLAB Programming