1. MATLAB是什麼?
MATLAB,是“matrix laboratory”的縮寫形式,意思是矩陣實驗室。MATLAB是在1984年由一個大學生把數學課的教學課件重新程式設計設計出來的一個産品,很多人都把MATLAB看做是一個計算機軟體,是一種用于算法開發、資料分析、可視化和數值計算的程式設計環境。MATLAB一個重要優勢就是封裝了大量數學相關的算法函數,工程師和科學家可以很友善的調用而不必重新編寫。MATLAB同時也是一種非常受歡迎的程式設計語言,簡稱M語言,工程師可以用它來編寫各種科學技術程式,甚至可以将編寫的程式釋出成獨立的APP供他人使用。
MATLAB的應用非常廣泛,可以說涉及到工業和科學領域的方方面面,在航空、航天、汽車、電子、能源、金融、大資料和人工智能等各個行業中,MATLAB都被工程師和科學家廣泛應用。究其原因,我想還是MATLAB與生俱來的數學基因使它可以在各個工業和科學領域發揮作用,畢竟無論你是研究天體實體學,還是開發一個機器人,最終還是會落到數學的解算上來。
2. MATLAB軟體界面
如果把MATLAB看做是一個計算機軟體,那就要了解下MATLAB的界面。啟動MATLAB時,會打開MATLAB主界面,預設布局下包括下列面闆:
- 目前檔案夾:MATLAB中的檔案浏覽器,定位在目前工作的檔案夾。
- 指令行視窗:是輸入MATLAB指令的區域,指令前面以提示符 (>>) 表示。
- 工作區:Workspace,建立或者導入的資料都以變量的形式存顯示在工作區。
3. MATLAB語言初探
矩陣和數組
MATLAB作為一種程式設計語言,M語言,和C語言或者其它語言相比,有一個最大的不同,那就是所有 MATLAB 變量都是多元數組,與資料類型無關。這也是很多熟悉了C語言程式設計的工程師很難轉變的一種程式設計習慣。MATLAB 主要用于處理整個的矩陣和數組,而其他程式設計語言大多逐個處理數值。矩陣作為MATLAB變量的一種常見形式,是指通常用來進行線性代數運算的二維數組。
建立數組
試着建立第一個數組,包含四個元素,可以使用逗号(,)或者空格分開。
a = [1 2 3 4]
a = 1×4
1 2 3 4
這種數組叫做行向量。
如果要建立包含多行的矩陣,則用分号(;)來分割各行。
a = [1 2 3; 4 5 6; 7 8 10]
a = 3×3
1 2 3
4 5 6
7 8 10
建立矩陣還可以使用一些内置函數(ones、zeros 或 rand 等函數)來自動建立。例如,建立一個由随機整數組成的 5×1 列向量。
b = randi(100,5,1)
b = 5×1
62
59
55
87
27
數組索引
MATLAB的每個變量都是可以包含多個數字的數組,要通路數組中的元素,需要使用數組索引。
使用内置魔方矩陣函數建立一個 4×4 的矩陣。
A = magic(4)
A = 4×4
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
對于數組而言,其中的每個元素都有一個唯一的索引,可以了解為地圖上某個位置點的坐标。有兩種方式引用數組中的特定元素,最常使用的方法是指定行和列的下标。
A(3,2)
ans = 7
另一種方法不太常用,就是使用單一下标按順序向下周遊每一列。使用單一下标引用數組中特定元素的方法稱為線性索引。
A(11)
ans = 6
比較下面兩行代碼看看有何不同。
B = A(4,5) %Index in position 2 exceeds array bounds (must not exceed 4).
A(4,5) = 17
A = 4×5
16 2 3 13 0
5 11 10 8 0
9 7 6 12 0
4 14 15 1 17
如果将數組外的元素指派給某個變量,MATLAB會引發錯誤。如果将某個常數指派給數組外的元素,則數組的大小會自動增大,用來容納新增的元素。能了解下面的代碼嗎?
C(4,3) = 6
C = 4×3
0 0 0
0 0 0
0 0 0
0 0 6
如果要引用數組的多個元素,可以使用冒号(:)運算符,用來指定格式為(起始值:結束值)的範圍。例如:列出數組A前三行第二列的所有元素:
A(1:3,2)
ans = 3×1
2
11
7
單獨的冒号(沒有起始值或結束值)則可以指定該維中的所有元素。例如,列出數組A 第三行中的所有列:
A(3,:)
ans = 1×5
9 7 6 12 0
此外,冒号運算符還可以使用較通用的格式 start:step:end 建立等距向量值。如果省略step參數,則預設步長為1。
B = 0:10:100
B = 1×11
0 10 20 30 40 50 60 70 80 90 100
數組運算
MATLAB的變量都是以數組形式存在的,在MATLAB中可以使用一個數學運算符或者函數來處理矩陣中的所有元素。
a + 10 %對矩陣a中每個元素加10
ans = 3×3
11 12 13
14 15 16
17 18 20
sin(a) %計算矩陣a中每個元素的正弦值
ans = 3×3
0.8415 0.9093 0.1411
-0.7568 -0.9589 -0.2794
0.6570 0.9894 -0.5440
a' %求矩陣a的轉置矩陣
ans = 3×3
1 4 7
2 5 8
3 6 10
因為MATLAB中的變量都是矩陣,是以變量間的運算都是矩陣運算,那麼矩陣乘除就必須符合[a,b]*[b,a]的格式。
m = rand(2,3)
m = 2×3
0.3181 0.9398 0.4795
0.1192 0.6456 0.6393
n = rand(3,2)
n = 3×2
0.5447 0.7210
0.6473 0.5225
0.5439 0.9937
m * n
ans = 2×2
1.0424 1.1968
0.8305 1.0585
如果兩個矩陣的具有相同行列數,那麼兩個矩陣相加的結果則是矩陣中對應位置的元素分别相加後得到新矩陣。如果希望兩個矩陣對應位置上的元素分别相乘或相除得到一個新矩陣,該如何計算呢?這就要引出MATLAB中一個獨有的點運算符,如(.*)。乘法、除法和幂的矩陣運算符都可以使用點運算符。
a.*a
ans = 3×3
1 4 9
16 25 36
49 64 100
a./a
ans = 3×3
1 1 1
1 1 1
1 1 1
a.^2
ans = 3×3
1 4 9
16 25 36
49 64 100
數組串聯
串聯是連接配接數組以便形成更大數組的過程。實際上,第一個數組是通過将其各個元素串聯起來而構成的。成對的方括号[] 即為串聯運算符。
A = [a, a]
A = 3×6
1 2 3 1 2 3
4 5 6 4 5 6
7 8 10 7 8 10
使用逗号将彼此相鄰的數組串聯起來稱為水準串聯。每個數組必須具有相同的行數。同樣,如果各數組具有相同的列數,則可以使用分号垂直串聯。
A = [a; a]
A = 6×3
1 2 3
4 5 6
7 8 10
1 2 3
4 5 6
7 8 10
文本和字元
字元串數組中的文本
MATLAB中可以将字元序列加上雙引号指派給變量。
t = "Hello, world"
t = "Hello, world"
如果文本中本身就包含雙引号,在定義的時候使用兩個雙引号。
q = "MATLAB is a good engineering ""Knife"""
q = "MATLAB is a good engineering "Knife""
MATLAB中所有的變量都是數組,是以t和q也都是數組,資料類型是string。使用指令whos可以檢視變量的資訊。
whos t
Name Size Bytes Class Attributes t 1x1 166 string
要将文本添加到字元串的末尾,請使用加号運算符 +。
f = 71;
c = (f-32)/1.8;
tempText = "Temperature is " + c + "C"
tempText = "Temperature is 21.6667C"
與數值數組類似,字元串數組可以有多個元素。使用 strlength 函數可以求數組中每個字元串的長度。
A = ["a","bb","ccc"; "dddd","eeeeee","fffffff"]
A = 2×3 string array
"a" "bb" "ccc"
"dddd" "eeeeee" "fffffff"
strlength(A)
ans = 2×3
1 2 3
4 6 7
字元數組中的資料
有時,字元表示的資料并不一定對應到文本,例如 DNA 序列。此類資料可以存儲在資料類型為 char 的字元數組中。字元數組使用單引号,數組的每個元素都包含單個字元。
seq = 'GCTAGAATCC';
whos seq
Name Size Bytes Class Attributes seq 1x10 20 char
seq(4)
ans = 'A'
使用方括号串聯字元數組,就像串聯數值數組一樣。
seq2 = [seq 'ATTAGAAACC']
seq2 = 'GCTAGAATCCATTAGAAACC'
4. MATLAB科學繪圖
二維圖:線圖
MATLAB中最常用的繪圖函數是plot。例如,繪制從0到2π之間的正弦函數值。
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
MATLAB的繪圖功能非常強大,可以标記坐标軸并添加标題。
plot(x,y)
xlabel('x')
ylabel('sin(x)')
title('正弦函數制圖')
通過向 plot 函數添加第三個輸入參數,您可以使用紅色虛線繪制相同的變量。
plot(x,y,'r--')
'r--' 為plot函數的參數,設定線條的顔色和線型。plot的參數設定可以包含表示線條顔色、線型和标記的字元。标記是在繪制的每個資料點上顯示的符号,例如,+、o 或 *。例如,'g:*' 表示繪制使用 * 标記的綠色點線。
預設情況下,每次調用繪圖函數、重置坐标區及其他元素以準備新繪圖時,MATLAB都會清空繪圖窗。要将繪圖添加到目前圖窗中,可以使用 hold on指令,在使用 hold off 或關閉視窗之前,所繪制的新圖形都會顯示在目前圖窗中。
x = 0:pi/100:2*pi;
y = sin(x);
plot(x,y)
hold on
y2 = cos(x);
plot(x,y2,':')
legend('sin','cos')
hold off
三維圖:曲面
三維圖通常顯示一個由帶兩個變量的函數(即 z = f (x,y))定義的曲面圖。要計算 z,可以先使用 meshgrid 在此函數的域中建立一組 (x,y) 點,然後繪制曲面圖。
[X,Y] = meshgrid(-2:.2:2);
Z = X .* exp(-X.^2 - Y.^2);
surf(X,Y,Z)
函數surf 和 mesh都是以三維形式顯示曲面圖。surf 使用不同顔色繪制曲面圖的連接配接線和面。mesh 僅以顔色繪制線框曲面圖連接配接線。
[X,Y] = meshgrid(-2:.2:2);
Z = X .* exp(-X.^2 - Y.^2);
mesh(X,Y,Z)
子圖
使用 subplot 函數可以在同一視窗的不同子區域顯示多個繪圖。subplot 的前兩個輸入表示每行和每列中的繪圖數,第三個輸入指定繪圖是否處于活動狀态。例如,在圖窗視窗的 2×2 網格中建立四個繪圖。
t = 0:pi/10:2*pi;
[X,Y,Z] = cylinder(4*cos(t));
subplot(2,2,1); mesh(X); title('X');
subplot(2,2,2); mesh(Y); title('Y');
subplot(2,2,3); mesh(Z); title('Z');
subplot(2,2,4); surf(X,Y,Z); title('X,Y,Z');
5. MATLAB幫助文檔
如果要學好用好MATLAB,那就一定要熟練使用MATLAB的幫助文檔,也許這是我見過的最詳細的技術幫助文檔了。所有 MATLAB函數都有輔助文檔,這些文檔包含一些示例,并介紹函數輸入、輸出和調用文法。從指令行通路此資訊有多種方法:
- 使用 doc 指令在單獨的視窗中打開函數文檔。
doc mean
- 在鍵入函數輸入參數的左括号之後暫停,此時指令行視窗中會顯示相應函數的提示(函數文檔的文法部分)。
mean(
- 使用 help 指令可在指令行視窗中檢視相應函數的簡明文檔。
help mean
mean - 數組的均值 此 MATLAB 函數 傳回 A 沿大小不等于 1 的第一個數組次元的元素的均值。 M = mean(A) M = mean(A,'all') M = mean(A,dim) M = mean(A,vecdim) M = mean(___,outtype) M = mean(___,nanflag) See also median, mode, std, sum, var Documentation for mean Other functions named mean
馬上點選幫助圖示,開始奇妙的MATLAB旅程吧!