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