Matlab 提供一些敘述統計的函式。包括總和 sum、最大值 max、最小值 min、
平均數 mean、中位數 median、取樣標準差 std。
>> x = [4 9 0 4 1 10 3 8];
>> sum(x)
ans =
39
>> max(x)
ans =
10
>> min(x)
ans =
0
>> mean(x)
ans =
4.8750
>> std(x)
ans =
3.7201
這些敘述統計函式可以作用在向量、序列上,其意義相同。
但是如果作用在矩陣上,意思是對矩陣中的每一行做統計的意思。
>> A = [4 6; 9 6; 0 2; 4 8; 1 0; 10 10; 3 7; 8 7]
A =
4 6
9 6
0 2
4 8
1 0
10 10
3 7
8 7
>> sum(A)
ans =
39 46
>> max(A)
ans =
10 10
>> mean(A)
ans =
4.8750 5.7500
一個與統計非常相關的函式是排序 sort。Matlab 只對數值排序,
而且必定是從小排到大。如果作用在矩陣上,意思是將每一行分別排序。
>> sort(x)
ans =
0 1 3 4 4 8 9 10
>> sort(A)
ans =
0 0
1 2
3 6
4 6
4 7
8 7
9 8
10 10
如果要對列做統計或排序呢?那可以將這些函式作用在轉置矩陣上。
Matlab 的轉置符號是 '
>> x'
ans =
4
9
0
4
1
10
3
8
>> A'
ans =
4 9 0 4 1 10 3 8
6 6 2 8 0 10 7 7
>> sort(A')
ans =
4 6 0 4 0 10 3 7
6 9 2 8 1 10 7 8
>> B = sort(A'); B'
ans =
4 6
6 9
0 2
4 8
0 1
10 10
3 7
7 8
一列可以寫兩個以上的指令,如果用分號隔開,則前面的指令不輸出計算結果。
如果用逗點隔開,則前面的指令輸出計算結果。
>> 1+1, 1+2; 1+3
ans =
2
ans =
4
當 Matlab 發現需要進入複數域的時候,它自動會做。
>> sqrt(-4)
ans =
0 + 2.0000i
如果要自己製造複數,可以說
>> i=sqrt(-1); c = 2 + 3*i
c =
2.0000 + 3.0000i
或者
>> c = complex(2,3)
c =
2.0000 + 3.0000i
純量乘矩陣的意義,是將純量與矩陣中的每個元素相乘。所以
>> A = [1 2; 2 1]; B = [3 4; 5 6]; C = A + B*i
C =
1.0000 + 3.0000i 2.0000 + 4.0000i
2.0000 + 5.0000i 1.0000 + 6.0000i
現在我們要知道,Matlab 的 ' 符號其實是做 Hermittian 的意思,不只是轉置
>> C'
ans =
1.0000 - 3.0000i 2.0000 - 5.0000i
2.0000 - 4.0000i 1.0000 - 6.0000i
如果要只做轉置,應該用 .' 符號
>> C.'
ans =
1.0000 + 3.0000i 2.0000 + 5.0000i
2.0000 + 4.0000i 1.0000 + 6.0000i
計算向量的歐幾里得長度,至少有三種方法可用。
>> sqrt(x * x')
ans =
16.9411
>> sqrt(dot(x,x))
ans =
16.9411
>> norm(x)
ans =
16.9411
矩陣本來沒有除法,但是如果有逆矩陣與矩陣相乘的情形,
Matlab 可以將它寫成除法。但是因為矩陣乘法沒有交換律,
所以要定義兩種方向的除法。$A^{-1} B$ 寫做 A\B,
而 $B A^{-1}$ 寫做 B/A。當然,相乘雙方的矩陣維度要合格才能乘。
>> A=[-3 0 1; 2 5 -7; -1 4 8]
A =
-3 0 1
2 5 -7
-1 4 8
>> b=[1; 2; 3]
b =
1
2
3
若要求 A*x = b 的解 x ,則是
>> x = A\b
x =
-0.3194
0.5864
0.0419
我們可以檢查計算的殘量 (residual),注意,以下計算的不是誤差 (error),
細節留到矩陣計算的課再談。
>> A*x - b
ans =
1.0e-15 *
0
-0.4441
-0.4441
它們都是 $10^{-15}$ 左右的數,這些數已經很小,小到可以認為是 0 的地步。
數值解 x 幾乎永遠不可能等於真正的解,總會有些誤差。
當殘量很小的時候,我們通常就相信誤差也很小。
線性聯立方程式可能有唯一解、無解、無窮多組解的狀況。
Matlab 的除法,可以應付所有這些狀況。
詳情也要留到矩陣計算那門課才能談。
兩個維度一樣的矩陣,可以用 ./ 做對應項相除。
>> [1 3 5] ./ [2 6 10]
ans =
0.5000 0.5000 0.5000
其實,純量與矩陣之間,也可以用 ./ 和 *、+、- 符號做簡便的對應項相除、
相乘、相加、相減。
>> 1 ./ [1 2 3]
ans =
1.0000 0.5000 0.3333
>> 1 + [1 2 3]
ans =
2 3 4
>> [1 2 3] - 1
ans =
0 1 2
求逆矩陣的函式是 inv,但是除法運算比求逆矩陣要有效率得多。
所以,除非絕對有必要,否則應該從此刻起,謹記:不要用 inv 函式。
矩陣的特徵值和特徵向量,都可以用 eig 函式求得。
>> eig(A)
ans =
-2.8601
6.4300 + 5.0434i
6.4300 - 5.0434i
這是 A 的三個特徵值。
>> [V,D] = eig(A);
則 D 是一個對角線矩陣,其對角線元素就是 A 的特徵值。
而 V 是一個方陣,它的第 k 行就是對應 D(k,k) 的特徵向量。
特徵向量有無限多個,Matlab 取的是長度為 1 的正規 (normal) 特徵向量。
>> D
D =
-2.8601 0 0
0 6.4300 + 5.0434i 0
0 0 6.4300 - 5.0434i
>> V
V =
0.9823 -0.0055 + 0.0565i -0.0055 - 0.0565i
-0.1275 -0.5062 - 0.6094i -0.5062 + 0.6094i
0.1374 -0.3372 + 0.5054i -0.3372 - 0.5054i
求矩陣行列式、階數 (rank)、對角線和 (trace) 的指令分別是 det, rank, trace。
請讀者自己實驗。