9-2 S帠~x}

在 MATLAB 中,有些好用的指令可以產生各種特殊用途的矩陣,以便利不同的數值運算,這些指令可以列表如下:

指令說明
zeros(m, n) 產生維度為 m×n ,構成元素全為 0 的矩陣
ones(m, n) 產生維度為 m×n ,構成元素全為 1 的矩陣
eye(n) 產生維度為 n×n ,對角線的各元素全為 1 ,其他各元素全為 0 的單位矩陣
pascal(m, n) 產生維度為 m×n 的 Pascal 矩陣
vander(m, n) 產生維度為 m×n 的 Vandermonde 矩陣
hilb(n) 產生維度為 n×n 的 Hilbert 矩陣
rand(m, n) 產生 [0, 1] 均勻分佈的亂數矩陣,其維度為 m×n
randn(m, n) 產生 μ = 0, σ= 1 的正規分佈亂數矩陣,其維度為 m×n
magic(n) 產生維度為 n×n 的魔方陣,其各個直行、橫列及兩對角線的元素和都相等

例如 ,hilb(n) 指令可以產生 n×n 的 Hilbert 矩陣,$H_{i,j}=\frac{1}{i+j+1}$,驗證如下:

Example 1: 09-矩陣的處理與運算/hilb01.mH=hilb(4) H = 1.0000 0.5000 0.3333 0.2500 0.5000 0.3333 0.2500 0.2000 0.3333 0.2500 0.2000 0.1667 0.2500 0.2000 0.1667 0.1429

另外,magic(n) 可以產生一個 n×n 的魔方陣(Magic Matrix),其各個直行、橫列及兩對角線的元素值總和都相等,例如:

Example 2: 09-矩陣的處理與運算/magic01.mM = magic(5) fprintf('直行總和:'); sum(M) % M 的每一個直行總和 fprintf('橫列總和:'); sum(M, 2) % M 的每一個橫列總和 fprintf('對角線總和:'); sum(diag(M)) % M 的對角線總和 fprintf('反對角線總和:'); sum(diag(fliplr(M))) % M 的反對角線總和 M = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 直行總和: ans = 65 65 65 65 65 橫列總和: ans = 65 65 65 65 65 對角線總和: ans = 65 反對角線總和: ans = 65

rand 指令及 randn 指令則常用於產生亂數矩陣,其機率分布之差異可用直方圖(Histogram) 顯示如下:

Example 3: 09-矩陣的處理與運算/matrix11.mx1 = rand(10000, 1); x2 = randn(10000, 1); subplot(2,1,1); hist(x1, 40); title('均勻分佈'); subplot(2,1,2); hist(x2, 40); title('高斯分佈'); set(findobj(gcf, 'type', 'patch'), 'EdgeColor', 'w'); % 改邊線為白色

若欲產生具有其他機率分佈的亂數,可參考一般機率教科書,或直接使用 MATLAB 的統計工具箱(Statistics Toolbox)。

其他產生各種測試矩陣的指令還有 compan(Companion 矩陣)、gallery(Higham 測試矩陣)、hadamard(Hadamard 矩陣)、hankel(Hankel 矩陣)、invhilb(Hilb 矩陣的反矩陣)、rosser(經典的對稱固有值測試問題)、toeplitz(Toeplitz 矩陣)、wilkinson(Wilkinson 的固有值測試矩陣矩陣)等,讀者可自行由線上支援得到更多的說明。


MATLAB程式設計:入門篇