第2章 數組
本章包括
◆ 創建數值數組
◆ 操作數值數組
數組是MATLAB的基礎內容,幾乎所有的數據都是用數組的形式進行儲存的,因此,MATLAB又被稱為矩陣實驗室。從MATLAB 5.x版本開始,基于面向對象的考慮,這些數組就成為MATLAB中的內建數據類型(BuiIt-in Data Type),而數組運算就是定義這些數據結構的方法。在本章中,將介紹關于數組類型和數組運算的內容。
2.1 創建數值數組
創建數組是所有MATLAB運算和操作的基礎,針對不同維度的數組,MATLAB提供了多種創建方法,分別可以創建不同要求的數組類型。在本節中,將分別根據數組維度以及方法的不同來介紹如何創建數組。
2.1.1 一維數組的創建方法
在MATLAB中,一維和二維數組都被認為是比較低維的數組。它們的創建方法比較簡單,同時,也是創建高維數組的基礎條件,下面將以簡單的例子來說明如何在MATLAB中創建各種不同的數組類型。
例2.1 在MATLAB中,使用不同的方法來創建一維數組。
step 1 在MATLAB的命令窗口中輸入下面的程序代碼:
>> data1=[pi;log(5);7+6;2^3]; >> data2=[pi log(5) 7+6 2^3]; >> data3=2:2:10; >> data4=2:10; >> data5=linspace(2,10,5); >> data6=logspace(1,5,10);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到以下結果:
data1 = 3.1416 1.6094 13.0000 8.0000 data2 = 3.1416 1.6094 13.0000 8.0000 data3 = 2 4 6 8 10 data4 = 2 3 4 5 6 7 8 9 10 data5 = 2 4 6 8 10 data6 = 1.0e+005 * 0.0001 0.0003 0.0008 0.0022 0.0060 0.0167 0.0464 0.1292 0.3594 1.0000
上面的結果基本演示了在MATLAB中創建一維數組的方法。
◆ 直接輸入法:在上面的程序代碼中,data1和data2就是直接輸入法。其中data1在輸入數據的時候,使用了分號,創建了一維列數組;data2則在創建過程中使用了空格,因此創建了一維行數組。
◆ 步長生成法:在上面的程序代碼中,data3和data4的創建方法就是步長生成法,其通用方法是a:inc:b,其中a表示的是數組的第一個元素,inc是創建數組之間的間隔,也就是步長,b則是數組中的最后一個元素。其中inc可以省略,默認的數值為1。
◆ 定數線性采樣法:在上面的程序代碼中,data5的創建方法就是定數線性采樣方法,該方法在設定“總個數”的條件下,均勻采樣分布生成一維行數組,這種方法的調用格式為:x=Iinspace(a,b,n),其中a和b分別是數組的第一個和最后一個元素,n表示的是采樣點數。
◆ 定數對數采樣法:在上面的程序代碼中,data6的創建方法就是定數對數采樣法。這種方法在設定“總個數”的條件下,經過“常用對數”采樣生成一維行數組。這種方法的調用格式為x=Iogspace(a,b,n)。
說明
在步長生成法中,步長參數inc的數值可以是正數,也可以是負數,當inc是正數的時候,必須滿足a<b;當inc是負數的時候,必須滿足a>b。
2.1.2 二維數組的創建方法
在本節中將介紹如何在MATLAB中創建二維數組。
例2.2 在MATLAB中創建二維數組。
step 1 在MATLAB的命令窗口中輸入下面的程序代碼:
>> Data1= [1 2 3 4 5 6 7 8 9]; >> Data2=[1,2,3;4,5,6;7,8,9];
step 2 查看程序結果。在命令窗口輸入變量名稱,可以得到下面的程序結果:
Data1 = 1 2 3 4 5 6 7 8 9 Data2 = 1 2 3 4 5 6 7 8 9
上面的例子基本演示了在MATLAB中創建二維數組的方法,Data1的創建方法比較直接,得到的結果就是輸入的結果;Data2的創建方法則是更加普遍的方法,關于該方法需要注意下面的內容:
◆ 整個輸入數組必須以方括號“[]”作為創建的首尾。
◆ 數組的行和行之間必須用分號“;”間隔。
◆ 數組的列和列之間必須用逗號“,”間隔。
提示
上面使用的創建方法適用的范圍比較窄,當數組的行或者列數比較大的時候,該創建方法就會顯得比較煩瑣,至于其他方法將在后面章節中加以介紹。
2.1.3 使用下標創建三維數組
在MATLAB中,習慣將二維數組的第一維稱為“行”,第二維稱為“列”,而對于三維數組,其第三維則習慣性地稱為“頁”。在MATLAB中,將三維或者三維以上的數組統稱為高維數組。由于高維數組的形象思維比較困難,在本節中將主要以三維為例來介紹如何創建高維數組。
例2.3 使用下標引用的方法創建三維數組。
step 1 在MATLAB的命令窗口中輸入下面的程序代碼:
A(2,2,2)=1; >> for i=1:2 for j=1:2 for k=1:2 A(i,j,k)=i+j+k; end end end
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到下面的程序結果:
>> A(:,:,1) 3 4 4 5 >> A(:,:,2) 4 5 5 6
step 3 創建新的高維數組。在MATLAB的命令窗口中輸入下面的程序代碼:
>> B(3,4,:)=2:5;
step 4 查看程序結果。在命令窗口中輸入變量名稱,可以得到下面的程序結果:
>> B(:,:,1) 0 0 0 0 0 0 0 0 0 0 0 2 >> B(:,:,2) 0 0 0 0 0 0 0 0 0 0 0 3 >> B(:,:,3) 0 0 0 0 0 0 0 0 0 0 0 4 >> B(:,:,4) 0 0 0 0 0 0 0 0 0 0 0 5
說明
從結果中可以看出,當使用下標的方法創建高維數組的時候,需要使用各自對應的維度的數值,沒有指定的數值則在默認情況下為0。
2.1.4 使用低維數組創建三維數組
本節將介紹如何在MATLAB中使用低維數組創建三維數組。
例2.4 使用低維數組創建高維數組。
step 1 在MATLAB的命令窗口中輸入下面的程序代碼:
>> D2=[1,2,3;4,5,6;7,8,9]; >> D3(:,:,1)=D2; >> D3(:,:,2)=2*D2; >> D3(:,:,3)=3*D2;d
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到以下結果:
>>D2 D2 = 1 2 3 4 5 6 7 8 9 >> D3 D3(:,:,1) = 1 2 3 4 5 6 7 8 9 D3(:,:,2) = 2 4 6 8 10 12 14 16 18 D3(:,:,3) = 3 6 9 12 15 18 21 24 27
提示
從結果中可以看出,由于三維數組中“包含”了二維數組,因此可以通過二維數組來創建各種三維數組。
2.1.5 使用創建函數創建三維數組
本節將介紹如何利用MATLAB的創建函數來創建三維數組。
例2.5 使用函數命令來創建高維數組。
step 1 使用cat命令來創建高維數組。在MATLAB的命令窗口中輸入下面的程序代碼:
>> D2=[1,2,3;4,5,6;7,8,9]; >> C=cat(3,D2,2*D2,3*D2);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到以下結果:
C(:,:,1) = 1 2 3 4 5 6 7 8 9 C(:,:,2) = 2 4 6 8 10 12 14 16 18 C(:,:,3) = 3 6 9 12 15 18 21 24 27
說明
cat命令的功能是連接數組,其調用格式為C = cat(dim,A1,A2,A3,A4...),其中,dim表示的是創建數組的維度,A1,A2,A3,A4表示的是各維度上的數組。
step 3 使用repmat命令來創建數組。在MATLAB的命令窗口中輸入下面的程序代碼:
>> D2=[1,2,3;4,5,6;7,8,9]; >> D3 = repmat(D2,2,3); >> D4=repmat(D2,[1 2 3]);
step 4 查看程序結果。在命令窗口中輸入變量名稱,可以得到以下結果:
D2 = 1 2 3 4 5 6 7 8 9 D3 = 1 2 3 1 2 3 1 2 3 4 5 6 4 5 6 4 5 6 7 8 9 7 8 9 7 8 9 1 2 3 1 2 3 1 2 3 4 5 6 4 5 6 4 5 6 7 8 9 7 8 9 7 8 9 D4(:,:,1) = 1 2 3 1 2 3 4 5 6 4 5 6 7 8 9 7 8 9 D4(:,:,2) = 1 2 3 1 2 3 4 5 6 4 5 6 7 8 9 7 8 9 D4(:,:,3) = 1 2 3 1 2 3 4 5 6 4 5 6 7 8 9 7 8 9
說明
repmat命令的功能在于復制并堆砌數組,其調用格式B = repmat(A,[m n p...])中,A表示的是復制的數組模塊,第二個輸入參數則表示該數組模塊在各個維度上的復制個數。
step 5 使用reshape命令來創建數組。在MATLAB的命令窗口中輸入以下代碼:
>> D2=[1,2,3,4;5,6,7,8;9,10,11,12]; >> D3=reshape(D2,2,2,3); >> D4=reshape(D2,2,3,2); >> D5=reshape(D2,3,2,2)
step 6 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
>> D2 D2 = 1 2 3 4 5 6 7 8 9 10 11 12 >> D3 D3(:,:,1) = 1 9 5 2 D3(:,:,2) = 6 3 10 7 D3(:,:,3) = 11 8 4 12 >> D4 D4(:,:,1) = 1 9 6 5 2 10 D4(:,:,2) = 3 11 8 7 4 12 >> D5 D5(:,:,1) = 1 2 5 6 9 10 D5(:,:,2) = 3 4 7 8 11 12
說明
reshape命令的功能在于修改數組的大小,因此可以將二維數組通過該命令修改為三維數組,其調用格式為B = reshape(A,[m n p ...]),其中A就是待重組的矩陣,后面的輸入參數則表示數組各維的維度。
2.1.6 創建低維標準數組
除了前面介紹的方法,MATLAB還提供了多種函數來生成一些標準數組,用戶可以直接使用這些命令來創建一些特殊的數組,下面將使用一些簡單的例子來說明如何創建標準數組。
例2.6 使用標準數組命令創建低維數組。
step 1 在MATLAB的命令窗口中輸入以下代碼:
>> A=zeros(3,2); >> B=ones(2,4); >> C=eye(4); >> D=magic(5); >> randn('state',0); >> E=randn(1,2); >> F=gallery(5);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
A = 0 0 0 0 0 0 B = 1 1 1 1 1 1 1 1 C = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 D = 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 E = -0.4326 -1.6656 F = -9 11 -21 63 -252 70 -69 141 -421 1684 -575 575 -1149 3451 -13801 3891 -3891 7782 -23345 93365 1024 -1024 2048 -6144 24572
提示
并不是所有的標準函數命令都可以創建多種矩陣,例如eye、magic等命令就不能創建高維數組。同時,對于每個標準函數,參數都有各自的要求,例如gallery命令中只能選擇3或者5。
2.1.7 創建高維標準數組
本節將介紹如何使用標準數組函數來創建高維標準數組。
例2.7 使用標準數組命令創建高維數組。
step 1 在MATLAB的命令窗口中輸入以下代碼:
%設置隨機數據器的初始條件 >> rand('state',1111); >> D1=randn(2,3,5); >> D2=ones(2,3,4);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
>> D1 D1(:,:,1) = 0.8156 1.2902 1.1908 0.7119 0.6686 -1.2025 D1(:,:,2) = -0.0198 -1.6041 -1.0565 -0.1567 0.2573 1.4151 D1(:,:,3) = -0.8051 0.2193 -2.1707 0.5287 -0.9219 -0.0592 D1(:,:,4) = -1.0106 0.5077 0.5913 0.6145 1.6924 -0.6436 D1(:,:,5) = 0.3803 -0.0195 0.0000 -1.0091 -0.0482 -0.3179 >> D2 D2(:,:,1) = 1 1 1 1 1 1 D2(:,:,2) = 1 1 1 1 1 1 D2(:,:,3) = 1 1 1 1 1 1 D2(:,:,4) = 1 1 1 1 1 1
說明
限于篇幅,在這里就不詳細介紹各種命令的參數和使用方法了,有需要的讀者請自行閱讀相應的幫助文件。
2.2 操作數值數組
在MATLAB中,除了需要創建數組之外,還需要對數組進行各種操作,包括重組、元素變換、提取、旋轉等操作,MATLAB都提供了對應的函數命令,本節中將以簡單的實例來說明這些命令的使用方法。由于數組維度的不同將會帶來MATLAB不同的操作要求,因此,將按不同的數組維度來討論數組的操作。
2.2.1 選取低維數組的對角元素
低維數組的操作比高維數組的操作在運算或者使用上要簡單,因此在本節中將首先使用實例來介紹如何操作低維數組。
例2.8 使用diag命令來選取對角元素或者創建矩陣。
step 1 在MATLAB的命令窗口中輸入以下代碼:
>> Data=[1,2,3,4;5,6,7,8;9,10,11,12]; A1=diag(Data,1);A2=diag(Data); A3=diag(Data,-1); B1=diag(A2,1); B2=diag(A3,1);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
Data = 1 2 3 4 5 6 7 8 9 10 11 12 A1 = 2 7 12 A2 = 1 6 11 A3 = 5 10 B1 = 0 1 0 0 0 0 6 0 0 0 0 11 0 0 0 0 B2 = 0 5 0 0 0 10 0 0 0
說明
從結果中可以看出,diag命令的功能可以是選取矩陣對角線的數組,也可以將某個數組創建矩陣,用戶可以很方便地利用該命令來處理矩陣對角線的數據。
對于diag命令中參數k的含義,可以用圖2.1來形象地說明。

圖2-1 diag命令中參數k的含義
2.2.2 低維數組的形式轉換
例2.9 對數組或者矩陣進行形式轉換:對稱變換和旋轉。
step 1 在MATLAB的命令窗口中輸入如下代碼:
>> Data=[1,2,3,4;5,6,7,8;9,10,11,12]; %矩陣的轉置 >> B=Data'; >> C=fliplr(Data); >> D=flipud(Data); %多次旋轉矩陣 >> E=rot90(Data); >> F=rot90(E); >> G=rot90(F); >> H=rot90(G);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
Data = 1 2 3 4 5 6 7 8 9 10 11 12 B = 1 5 9 2 6 10 3 7 11 4 8 12 C = 4 3 2 1 8 7 6 5 12 11 10 9 D = 9 10 11 12 5 6 7 8 1 2 3 4 E = 4 8 12 3 7 11 2 6 10 1 5 9 F = 12 11 10 9 8 7 6 5 4 3 2 1 G = 9 5 1 10 6 2 11 7 3 12 8 4 H = 1 2 3 4 5 6 7 8 9 10 11 12
這段代碼中演示了各種轉換命令,下面簡要介紹各種命令的含義。
◆ fIipIr:以數組的垂直中線為對稱軸,交換左右對稱位置上的數組元素。
◆ fIipud:以數組的水平中線為對稱軸,交換左右上下對稱位置上的數組元素。
◆ rot90:逆時針旋轉二維數組90°。
2.2.3 選取三角矩陣
例2.10 選取數組上三角或者下三角矩陣。
step 1 在MATLAB的命令窗口中輸入以下代碼:
>> Data=[1,2,3,4;5,6,7,8;9,10,11,12]; >> Al=tril(Data); >> Bl=tril(Data,1); >> Cl=tril(Data,2); >> Dl=tril(Data,-1); >> Dl=tril(Data,-2); >> Au=triu(Data); >>Bu=triu(Data,1); >>Cu=triu(Data,2); >>Du=triu(Data,-1); >>Eu=triu(Data,-2);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
Data = 1 2 3 4 5 6 7 8 9 10 11 12 Al = 1 0 0 0 5 6 0 0 9 10 11 0 Bl = 1 2 0 0 5 6 7 0 9 10 11 12 Cl = 1 2 3 0 5 6 7 8 9 10 11 12 Dl = 0 0 0 0 5 0 0 0 9 10 0 0 El = 0 0 0 0 0 0 0 0 9 0 0 0 Au = 1 2 3 4 0 6 7 8 0 0 11 12 Bu = 0 2 3 4 0 0 7 8 0 0 0 12 Cu = 0 0 3 4 0 0 0 8 0 0 0 0 Du = 1 2 3 4 5 6 7 8 0 10 11 12 Eu = 1 2 3 4 5 6 7 8 9 10 11 12
說明
在上面的步驟中,tril命令的功能是提取矩陣的下三角矩陣,triu命令的功能在于提取矩陣的上三角矩陣,兩個命令中的參數k的含義和diag命令相同。
2.2.4 Kronecker乘法
例2.11 演示Kronecker乘法的不可交換性。
step 1 在MATLAB的命令窗口中輸入以下代碼:
>> X=[1,2;3,4]; >> I=eye(3); >> A=kron(X,I); >> B=kron(I,X);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
X = 1 2 3 4 I = 1 0 0 0 1 0 0 0 1 A = 1 0 0 2 0 0 0 1 0 0 2 0 0 0 1 0 0 2 3 0 0 4 0 0 0 3 0 0 4 0 0 0 3 0 0 4 B = 1 2 0 0 0 0 3 4 0 0 0 0 0 0 1 2 0 0 0 0 3 4 0 0 0 0 0 0 1 2 0 0 0 0 3 4
說明
從結果中可以看出,對于相同的兩個矩陣,交換后的乘積是不同的結果,因此就證明了Kronecker乘法的不可交換性。關于Kronecker乘法,請讀者自行查閱相應的書籍。
2.2.5 高維數組的對稱交換
對于高維數組,由于在結構上多了維度,因此在操作方法上多了一些操作其他維度的命令,在本節中還是以簡單的實例來介紹這些函數的使用方法。
例2.12 對三維數組進行對稱交換。
step 1 在MATLAB的命令窗口中輸入以下代碼:
>> Data=[1,2,3,4;5,6,7,8;9,10,11,12]; >> A=reshape(Data,2,2,3); >> B=flipdim(A,1); >> C=flipdim(A,2); >> D=flipdim(A,3);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
>> A A(:,:,1) = 1 9 5 2 A(:,:,2) = 6 3 10 7 A(:,:,3) = 11 8 4 12 >> B B(:,:,1) = 5 2 1 9 B(:,:,2) = 10 7 6 3 B(:,:,3) = 4 12 11 8 >> C C(:,:,1) = 9 1 2 5 C(:,:,2) = 3 6 7 10 C(:,:,3) = 8 11 12 4 >> D D(:,:,1) = 11 8 4 12 D(:,:,2) = 6 3 10 7 D(:,:,3) = 1 9 5 2
說明
在MATLAB中,flipdim(A,k)命令的第一個輸入變量A表示的是被操作的數組,第二個輸入變量k指定的是對稱面。1表示的是與數組行平行的平分面,2表示的是與數據列平行的平分面,3表示的是與數據頁平行的平分面。
2.2.6 高維數組的維序號移動
例2.13 對三維數組進行“維序號移動”。
step 1 在MATLAB的命令窗口中輸入以下代碼:
>> Data=[1,2,3,4;5,6,7,8;9,10,11,12]; >> A=reshape(Data,2,2,3); >> Adim=shiftdim(A,1); >> Adim2=shiftdim(A,2); >> Adim3=shiftdim(A,3);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
>> A A(:,:,1) = 1 9 5 2 A(:,:,2) = 6 3 10 7 A(:,:,3) = 11 8 4 12 >> Adim Adim(:,:,1) = 1 6 11 9 3 8 Adim(:,:,2) = 5 10 4 2 7 12 >> Adim2 Adim2(:,:,1) = 1 5 6 10 11 4 Adim2(:,:,2) = 9 2 3 7 8 12 >> Adim3 Adim3(:,:,1) = 1 9 5 2 Adim3(:,:,2) = 6 3 10 7 Adim3(:,:,3) = 11 8 4 12
2.2.7 高維數組的廣義共軛轉置
例2.14 對三維數組進行廣義共軛轉置。
step 1 在MATLAB的命令窗口中輸入以下代碼:
>> A=reshape(Data,2,2,3); >> Ap1=permute(A,[1,2,3]); >> Ap2=permute(A,[2,3,1]); >> Ap3=permute(A,[3,2,1]); >> Ap4=permute(A,[3,1,2]);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
>> A A(:,:,1) = 1 9 5 2 A(:,:,2) = 6 3 10 7 A(:,:,3) = 11 8 4 12 >> Ap1 Ap1(:,:,1) = 1 9 5 2 Ap1(:,:,2) = 6 3 10 7 Ap1(:,:,3) = 11 8 4 12 >> Ap2 Ap2(:,:,1) = 1 6 11 9 3 8 Ap2(:,:,2) = 5 10 4 2 7 12 >> Ap3 Ap3(:,:,1) = 1 9 6 3 11 8 Ap3(:,:,2) = 5 2 10 7 4 12 >> Ap4 Ap4(:,:,1) = 1 5 6 10 11 4 Ap4(:,:,2) = 9 2 3 7 8 12
說明
在MATLAB中,permute命令的第一個輸入變量是被轉置的數組,第二個變量表示的是轉置方式的行數組,該行數組中元素位置號代表的是新數組的維序號數值。
2.2.8 高維數組的降維操作
例2.15 使用squeeze命令來撤銷“孤維”,使高維數組降維。
step 1 在MATLAB的命令窗口中輸入以下代碼:
>> B=cat(4,A(:,:,1),A(:,:,2),A(:,:,3)); >> C=squeeze(B); >> size_B=size(B); >> size_C=size(C);
step 2 查看程序結果。在命令窗口中輸入變量名稱,可以得到如下結果:
>> B B(:,:,1,1) = 1 9 5 2 B(:,:,1,2) = 6 3 10 7 B(:,:,1,3) = 11 8 4 12 >> C C(:,:,1) = 1 9 5 2 C(:,:,2) = 6 3 10 7 C(:,:,3) = 11 8 4 12 >> size_B size_B = 2 2 1 3 >> size_C size_C = 2 2 3
2.3 小結
在本章中,依次介紹了如何在MATLAB中創建和操作數值數組,這些內容都是MATLAB的基礎知識,因此希望讀者能夠熟練掌握。其中數值數組是MATLAB所有操作的重要內容,在后面的章節中,將主要介紹如何使用MATLAB進行數值運算。
- 數據展現的藝術
- Hands-On Artificial Intelligence on Amazon Web Services
- Getting Started with Clickteam Fusion
- 大數據改變世界
- Learning Apache Cassandra(Second Edition)
- 自動化控制工程設計
- Excel 2007技巧大全
- PostgreSQL 10 Administration Cookbook
- Microsoft System Center Confi guration Manager
- RedHat Linux用戶基礎
- 中國戰略性新興產業研究與發展·增材制造
- 人工智能技術入門
- RealFlow流體制作經典實例解析
- 實戰大數據(Hadoop+Spark+Flink):從平臺構建到交互式數據分析(離線/實時)
- 特征工程入門與實踐