MATLAB

多範式數值計算環境

MATLAB(Matrix Laboratory,矩陣實驗室)是由美國The MathWorks公司出品的商業數學軟體。MATLAB是一種用於演算法開發、資料視覺化資料分析以及數值計算的進階技術計算語言和互動式環境。除矩陣運算、繪製函數/資料圖像等常用功能外,MATLAB還可用來建立使用者介面,以及呼叫其它語言(包括CC++JavaPythonFORTRAN)編寫的程式。

MATLAB
L-shaped membrane商標[1]
MATLAB螢幕截圖
開發者邁斯沃克
首次發布1984年,​40年前​(1984
目前版本
  • R2023b Update 6 (2024年1月10日;穩定版本)
編輯維基數據鏈結
程式語言C語言C++Java
作業系統WindowsmacOSLinux[2]
平台IA-32x86-64
類型數值計算
許可協定專有軟體商業軟體
網站mathworks.com
MATLAB
編程範型多範式函數指令式程序式面向對陣列編程
設計者克里夫·莫勒爾
實作者邁斯沃克
面市時間20世紀70年代末
目前版本
  • R2023b Update 6 (2024年1月10日;穩定版本)
編輯維基數據鏈結
型態系統動態
副檔名.m
網站mathworks.com
啟發語言
影響語言

MATLAB主要用於數值運算,但利用為數眾多的附加工具箱,它也適合不同領域的應用,例如控制系統設計與分析、影像處理、深度學習、訊號處理與通訊、金融建模和分析等。另外還有配套軟體套件Simulink提供視覺化開發環境,常用於系統類比、動態/嵌入式系統開發等方面。

在R2017b後的MATLAB版本更新釋出了深度學習的工具,使其能夠視覺化的快速建立AI模型,並透過各種轉碼器,部屬於嵌入式硬體之中。

截至2020年,MATLAB在全球擁有超過400萬使用者。MATLAB使用者來自工程、科學和經濟學領域。

歷史 編輯

1970年代末到80年代初,時任美國新墨西哥大學教授的克里夫·莫勒爾為了讓學生更方便地使用LINPACKEISPACK英語EISPACK(需要通過FORTRAN編程來實現,但當時學生們並無相關知識),獨立編寫了第一個版本的MATLAB。這個版本的MATLAB只能進行簡單的矩陣運算,例如矩陣轉置、計算行列式和本徵值,此版本軟體分發出大約兩三百份[7][8]

1984年,傑克·李特克里夫·莫勒爾斯蒂夫·班格爾特英語Steve Bangert合作成立了MathWorks公司,正式把MATLAB推向市場[8][9]。MATLAB最初是由莫勒爾用FORTRAN編寫的,李特和班格爾特花了約一年半的時間用C重新編寫了MATLAB並增加了一些新功能,同時,李特還開發了第一個系統控制工具箱,其中一些代碼到現在仍然在使用[8]。C語言版的面向MS-DOS系統的MATLAB 1.0在拉斯維加斯舉行的IEEE決策與控制會議(IEEE Conference on Decision and Control)正式推出[8][10][a],它的第一份訂單只售出了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)進行功能擴充,每一個工具箱就是實現特定功能的函數的集合[b]。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的變數名字跟許多程式語言一樣,嚴格區分大小寫,例如,varVARVar是三個不同的變數。另外,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×NN×1)矩陣,在其他語言中通常被叫做陣列(array)。矩陣(matrix)通常指的是2-維陣列,例如m×n陣列其中mn大於或等於1。多維陣列通常指的是維數大於2的陣列。

需要注意的是,雖然MATLAB用C語言重寫,但是在矩陣儲存方式上卻和FORTRAN保持一致,兩者使用的均為列優先儲存,而非行優先儲存[c]。在進行較大的矩陣運算時,這一差別對效能的影響是不應忽略的。[需要解釋]

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)[d]可以進行代數或符號運算,如分解多項式因子和解代數方程式:

>> 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的畫圖命令可以生成複雜的三維圖形[e]

>> 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 暫時不明 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介面支援中文[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是美國國家儀器公司開發的視覺化編程平台,主要用於資料採集儀器控制工業自動化。最新版本是2021年8月發布的LabVIEW 2021。

開源軟體 編輯

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英語ScicosLab是由一些曾在INRIAENPC參與Scilab開發的研究人員,在Scilab BUILD4版本的基礎上開發出來的GTK+版本,它整合了建模/類比工具Scicos[f]及其它數量眾多的工具箱,被認為是「惟一一款可以與商業軟體MATLAB/Simulink及MATRIXx/SysstemBuild媲美的開源軟體」。最新穩定版本是4.4.1。

JAMA 編輯

JAMA英語JAMA (JAMA : A Java Matrix Package英語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。[19]

注釋 編輯

  1. ^ 在其創始人Moler的回顧文獻中,誤將會議名稱的"Decision"誤植成"Design"[8],而在IEEE該社群官方的歷史紀錄檔案中,有明確提到MATLAB第一次公開展示的正確會議名稱[10].
  2. ^ MathWorks官方提供的工具箱需通過支付相對應的費用單獨取得。
  3. ^ 以一個定義為為M的3x3矩陣為例:列優先儲存指的是MATLAB先儲存第一列的3個元素,然後儲存第二列的,最後儲存第三列的元素,從而這9個矩陣元素在MATLAB中的排序是從1到9,所以在呼叫矩陣元素時,M(2)指的是第一列的第二個元素,M(6)指的是第二列第三個元素(當然這兩個元素也可以用二維的方式呼叫,M(2)對應M(1,2),M(6)對應M(2,3));行優先儲存則剛好相反,先儲存第一行的3個元素,再儲存第二行和第三行的元素。
  4. ^ 從4.9版(對應於MATLAB R2007b+)開始,新的MuPAD運算引擎代替了之前版本使用的Maple引擎,詳情見Version 4.9(R2007b+)Symbolic Math Toolbox Software
  5. ^ 本例子基於Davis, Timothy A.; Kermit Sigmon. MATLAB Primer 7th. Chapman & Hall/CRC. 2005. ISBN 1-58488-523-8 (英語). 一書中的範例,形狀、顏色、角度等參數有修改。
  6. ^ 第一個版本的Scicos是完全用Scilab語言寫成的,但後續版本逐步改用C語言進行開發。由於在Scilab 5版本中出現穩定性及效能問題,開發人員決定此後Scicos僅在ScicosLab中進行後續開發。詳情見Scilab/Scicos history

參考文獻 編輯

參照 編輯

  1. ^ The L-Shaped Membrane. MathWorks. 2003 [February 7, 2014]. (原始內容存檔於2019-04-23). 
  2. ^ System Requirements and Platform Availability. MathWorks. [August 14, 2013]. (原始內容存檔於2016-10-13). 
  3. ^ An interview with CLEVE MOLER Conducted by Thomas Haigh On 8 and 9 March, 2004 Santa Barbara, California (PDF). Computer History Museum. [December 6, 2016]. (原始內容 (PDF)存檔於2014-12-27). So APL, Speakeasy, LINPACK, EISPACK, and PL0 were the predecessors to MATLAB. 
  4. ^ Bezanson, Jeff; Karpinski, Stefan; Shah, Viral; Edelman, Alan. Why We Created Julia. Julia Language. February 14, 2012 [December 1, 2016]. (原始內容存檔於2019-02-19). 
  5. ^ Eaton, John W. Octave: Past, Present, and Future (PDF). Texas-Wisconsin Modeling and Control Consortium. May 21, 2001 [December 1, 2016]. (原始內容 (PDF)存檔於2017-08-09). 
  6. ^ History. Scilab. [December 1, 2016]. (原始內容存檔於2016-12-01). 
  7. ^ Thomas Haigh. The History of Numerical Analysis and Scientific Computing (PDF). Santa Barbara, California. 2004-03-08: 64–65 [2010-04-29]. (原始內容存檔 (PDF)於2018-10-12) (英語). 
  8. ^ 8.0 8.1 8.2 8.3 8.4 8.5 8.6 Cleve Moler. The Growth of MATLAB and The MathWorks over Two Decades (PDF). January 2006 [2010-04-30]. (原始內容 (PDF)存檔於2009-04-11) (英語). 
  9. ^ MathWorks Founders. MathWorks. [2010-04-29]. (原始內容存檔於2010-04-16). 
  10. ^ 10.0 10.1 Schrader, C.B.; Spong, M.W. The IEEE Conference on Decision and Control - tracing CDC history. IEEE Control Systems Magazine. 2004-12, 24 (6): 56 – 66 [Jan 14, 2011]. doi:10.1109/MCS.2004.1368481. (原始內容存檔於2015-01-09). 
  11. ^ About The MathWorks. MathWorks. [2010-04-29]. (原始內容存檔於2010-05-02). 
  12. ^ MATLAB 7.10-简介及主要功能. MathWorks中國. [2010-04-29]. (原始內容存檔於2010-08-06). 
  13. ^ MATLAB附加产品. MathWorks中國. [2010-04-29]. (原始內容存檔於2011-06-06). 
  14. ^ Fundamental MATLAB Classes. MathWorks. [2010-05-01]. (原始內容存檔於2010-05-05). 
  15. ^ Documentation for the MATLAB Variables. MathWorks. [2010-05-01]. (原始內容存檔於2010-05-05). 
  16. ^ MATLAB Release Notes. MathWorks. [2010-04-30]. (原始內容存檔於2010-05-02). 
  17. ^ MATLAB Release Notes. MathWorks. [2014-03-06]. (原始內容存檔於2014-03-14). 
  18. ^ Stephen Wolfram. Version 12 Launches Today! (And It’s a Big Jump for Wolfram Language and Mathematica). 2019年4月16日 [2019年11月19日]. (原始內容存檔於2020年4月9日). 
  19. ^ MATLAB被禁用:美国投向我国高校科研的第一颗炸弹!. 歐界頭條. [2020-06-29]. (原始內容存檔於2020-10-01). 

外部連結 編輯

參見 編輯