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）正式推出1=在其创始人Moler的回顾文献中，误将会议名称的"Decision"误植成"Design"，而在IEEE该社群官方的历史纪录文件中，有明确提到MATLAB第一次公开展示的正确会议名称.，它的第一份订单只售出了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）进行功能扩展，每一个工具箱就是实现特定功能的函数的集合1=MathWorks官方提供的工具箱需通过支付相对应的费用单独获取。。MathWorks提供的工具箱分以下几大类：
*数学和优化
*统计和数据分析
*影像处理和电脑视觉
*深度学习与机器学习
*控制系统设计和分析
*信号处理和通讯
*测试和测量
*金融建模和分析
*应用程序部署
*数据库连接和报表
*分布式计算
这些工具箱大多是用开放式的MATLAB语言写成，用户不但可以查看源代码，还可以可根据自己的需要进行修改以及创建自定义函数。此外，常有用户在 MATLAB Central: File Exchange date=20210204221722 发布自己编写的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是动态检查的，这意味着变量可以在未定义其类型的情况下赋值并且变量的类型也可以改变，除非将变量看做是符号对象。变量值可以取自常量，计算中的其他变量的值，或某一函数的输出。例如：
>> 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保持一致，两者使用的均为列优先存储，而非行优先存储1=以一个定义为为M的3x3矩阵为例：列优先存储指的是MATLAB先保存第一列的3个元素，然后保存第二列的，最后保存第三列的元素，从而这9个矩阵元素在MATLAB中的排序是从1到9，所以在调用矩阵元素时，M（2）指的是第一列的第二个元素，M（6）指的是第二列第三个元素（当然这两个元素也可以用二维的方式调用，M（2）对应M（1,2），M（6）对应M（2,3））；行优先存储则刚好相反，先保存第一行的3个元素，再保存第二行和第三行的元素。。在进行较大的矩阵运算时，这一差别对性能的影响是不应忽略的。reason=行与列在不同地区皆有指row之可能。
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） 1=从4.9版（对应于MATLAB R2007b+）开始，新的MuPAD运算引擎代替了之前版本使用的Maple引擎，详情见 Version 4.9（R2007b+）Symbolic Math Toolbox Software可以进行代数或符号运算，如分解多项式因子和解代数方程：
>> 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区间内的正弦函数：
利用plot命令也可以在同一幅图中描绘多个函数图形：
用MATLAB的画图命令可以生成复杂的三维图形：

**版本历史**
到7.1版为止，MATLAB的释放编号均以数字来命名，例如R7，R12.1，R14 SP1等；从7.2版开始，释放编号以年份来命名，每年3月份推出的用a表示，9月份推出的则以b表示，例如R2006a代表2006年3月推出的版本，R2009b指2009年下半年推出的版本：
从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**
是由一些曾在INRIA和ENPC参与Scilab开发的研究人员，在Scilab BUILD4版本的基础上开发出来的GTK+版本，它集成了建模/模拟工具Scicos1=第一个版本的Scicos是完全用Scilab语言写成的，但后续版本逐步改用C语言进行开发。由于在Scilab 5版本中出现稳定性及性能问题，开发人员决定此后Scicos仅在ScicosLab中进行后续开发。详情见 Scilab/Scicos history及其它数量众多的工具箱，被认为是“惟一一款可以与商业软件MATLAB/Simulink及MATRIXx/SysstemBuild媲美的开源软件”。最新稳定版本是4.4.1。

**JAMA**
(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。

**注释**

**参考文献**

**引用**

**外部链接**
  MATLAB官方网站 date=20101223113123 -   MATLAB线上教材 date=20191231120742 -  Matlab技术论坛 date=20201130231324 -  线上执行Matlab语法 date=20191013035506 -   矩阵实验室（MATLAB）新浪微博 date=20200501142359 -  Matlab教学 date=20201001071211 

**参见**
 Maple- Maxima- Mathematica- GNU Octave- Scilab- R语言- Origin- Spyder- 基于模型的设计