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。 請讀者自己實驗。