MATLAB中所有資料都是按照數組的方式進行存儲和運算,數組和數組運算始終是MATLAB中的核心内容,使用數組和數組運算可以使計算機程式簡單、易讀,使程式指令更接近于教科書上的數學公式,而且還可以提高程式的向量化程度,提高計算效率,節省計算機開銷。本章主要介紹數組及數組運算、多項式表示及運算和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);
上面的例子基本示範了在MATLAB中建立一維數組的方法,主要有以下幾種。
①直接輸入法:data1和data2的建立方法就是直接輸入法;
②步長生成法:data3和data4就是步長生成法,其通用方法是a:inc:b。其中a是數組的第一個元素;inc是建立數組之間的間隔,也就是步長,inc可以省略,預設數值為1;b是數組中的最後一個元素。
③定數線性采樣法:data5就是,x=linspace(a,b,n),a和b分别是數組的第一個和最後一個元素;n是采樣點數。
④定數對數采樣法:data6就是,x=logspace(a,b,n),在設定“總個數n”的條件下,經過“常用對數”采樣生成一維行數組。
在步長生成法中,步長參數inc的數值可以是正數,也可以是負數,當inc是正數的時候,必須滿足a<b;當inc是負數的時候,必須滿足a>b。
●二維數組的建立
二維數組也成為矩陣,有如下6種建立方法:
(1)直接輸入:将資料括在[ ] 中,同一行的元素用空格或逗号隔開,每一行可以用【Enter】鍵或分号隔開。
A=[ 1 2 3
4 5 6
1 2 6 ]
(2)函數eye:生成機關矩陣。
eye(n):生成 n x n 階的機關E;
eye(m,n):生成 m x n 的矩陣E,對角線元素為1,其他元素為0;
eye(size(A)):生成一個矩陣與A大小相同的機關矩陣。
(3)函數ones:生成全1的矩陣。
ones(n):生成 n x n 全1矩陣;
ones(m,n):生成 m x n 的全1矩陣;
ones(size(A)):生成一個矩陣與A大小相同的全1矩陣;
ones(m,n,p,…):生成 m x n x p x …的全1的多元矩陣。
(4)函數zeros:生成全0矩陣。
zeros(n):生成 n x n 全0矩陣;
zeros(m,n):生成 m x n 的全0矩陣;
zeros(size(A)):生成一個矩陣與A大小相同的全0矩陣;
zeros(m,n,p,…):生成 m x n x p x …的全0的多元矩陣。
(5)函數rand:生成[0,1]之間均勻分布的随機函數。
Y=rand:生成一個随機數;
Y=rand(n):生成 n x n 的随機矩陣;
Y=rand(m,n):生成 m x n 的随機矩陣;
Y=rand(size(A)):生成一個矩陣與A大小相同的随機矩陣;
Y=rand(m,n,p,…):生成 m x n x p x …的随機數多元矩陣。
(6)函數randn:函數randn用來生成服從正态分布的随機函數。
Y=randn:生成一個服從标準正态分布的随機數;
Y=randn(n):生成 n x n 的服從标準正态分布的随機矩陣;
Y=randn(m,n):生成 m x n 的服從标準正态分布的随機矩陣;
Y=randn(size(A)):生成一個矩陣與A大小相同的服從标準正态分布的随機矩陣;
Y=randn(m,n,p,…):生成 m x n x p x …的服從标準正态分布的随機數多元數組。
●多元數組的建立
在MATLAB中,習慣将二維數組的第一維稱為“行”,第二維稱為“列”,而對于第三位數組,其第三維則習慣性稱為“頁”。在MATLAB中,将三維或者三維以上的數組統稱為高維數組。
1. 使用下标引用的方法建立三維數組。
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
建立新的高維數組。
B(3,4,:)=2:5;
從結果中可以看出,當使用下标引用的方法建立高維數組的時候,需要使用各自對應的次元的,沒有指定的數值則在預設情況下為0。
2. 使用低維數組建立高維數組。
D2=[1,2,3;4,5,6;7,8,9];
D3(:,:,1)=D2;
D3(:,:,2)=2 * D2;
D3(:,:,3)=3 * D2;
D3
3. 使用函數指令來建立高維數組。
①使用cat指令來建立高維數組。
D2=[1,2,3;4,5,6;7,8,9];
C=cat(3,D2,2 * D2,3 * D2);
cat指令的功能是連接配接數組,其調用格式為:
C=cat(dim,A1,A2,A3,A4…)。其中,dim表示建立數組的次元,A1,A2,A3,A4表示各次元上的數組。
②使用repmat指令來建立數組。
D2=[1,2,3;4,5,6;7,8,9];
D3=repmat(D2,2,3);
D4=repmat(D2,[1 2 3]); %1行、2列、3頁
repmat指令的功能在于複制并堆砌數組,其調用格式:
B=repmat(A,m,n)。其中A表示複制的數組子產品;用m個A組成行和n個A組成列拼成新的數組。
B=repmat(A,[m n p …])。其中A表示複制的數組子產品;第二個輸入參數則表示該數組子產品在各個次元上的複制個數。(拼成的B:用m行、n列、p頁個A…)
③使用reshape指令來建立數組。
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);
reshape指令功能在于修改數組的大小,是以可以将二維數組通過該指令修改為三維數組,其調用格式為:
B=reshape(A,[m n p…])。其中,A表示待重組的矩陣;後面輸入的則表示數組的各維的次元。(數組的元素個數不變,按列的順序重新組合為新的數組)
●基本的數組操作
1. 數組的尋址
數組中包含多個元素,是以對數組的單個元素或多個元素進行通路操作時,需要對數組進行尋址操作。在MATLAB中,數組尋址通過對數組下标的通路實作,MATLAB中提供end參數表示數組的末尾。
MATLAB在記憶體中以列的方向儲存二維數組,對于一個m行n列的數組,i、j分别表示行、列的索引,二維數組的尋址可表示為A(i,j);如果采用下标尋址,則數組中元素的下标k表示為(j-1)x m+i。
一維數組的尋址:
A=randn(1,6)
A(5)
A(1 3 4 6)
A(5)尋址為第五個元素
A(1 3 4 6)尋址為A數組的1,3,4,6位置的元素
二維數組的尋址:
A=randn(3,4)
A(6)
A(3,2)
A(6)表示按列開始尋址,到第六個元素
A(3,2)表示尋址到第三行第二列的元素
2. 數組的查找
MATLAB提供數組查找函數find,它能夠查找數組中的非零數組元素,并傳回其數組索引值。(數組列向排列查找)
indices=find(X) %查找X數組的非零元素的下标值
indices=find(X,k) %查找X數組的k項的非零元素的下标值
indices=find(X,k,‘first’) %正向查找X數組的k項的非零元素的下标值
indices=find(X,k,‘last’) %倒向查找X數組的k項的非零元素的下标值
3. 數組的排序
MATLAB提供數組排序函數sort,該函數可對任意給定的數組進行排序。sort函數的文法為:
B=sort(A) %1維是按列的方向進行排序
B=sort(A,dim) %2維是從列的方向及行的方向進行排序
其中,B為傳回的排序後的數組;A為輸入待排序的數組,當A為多元數組時,用指定需要排序的維數(預設為1維)。
4. 數組的轉置
對數組進行轉置。例如,對數組A的轉置為A’。注意,當A為複數數組時,則A‘表示共轭轉置,如果要實作非共轭轉置,則應采用A.’。
A=[3+3i 3+2i;5+6i 6+7i]
A =
3.0000 + 3.0000i 3.0000 + 2.0000i
5.0000 + 6.0000i 6.0000 + 7.0000i
A’
ans =
3.0000 - 3.0000i 5.0000 - 6.0000i
3.0000 - 2.0000i 6.0000 - 7.0000i
A.’
ans =
3.0000 + 3.0000i 5.0000 + 6.0000i
3.0000 + 2.0000i 6.0000 + 7.0000i
5. 數組的重排
對已經存在的數組,可以根據其存儲方式進行重排。例如:
a=[1 2;3 4;5 6]
b=a( : )
c=reshape(a,2,3) %變成2x3數組,注意變換前後的數組元素個數必須相等
d=zeros(2,2) %定義一個2x2的全零矩陣
d(:)=a(3:6) %從a陣中取出4個元素(第3個到第6個),構成新數組
6. 數組擴大
①連接配接操作符[ ]:像分塊矩陣構造大數組一樣,通過連接配接操作符[ ]可将小數組連接配接成大數組。
a=[1 2;3 4]
b=[a a+5;a-5 zeros(size(a))]
%利用小數組a生成4x4的大數組
c=[a;5 10] %給a數組的下面加上一行
d=[a [5;10]] %給a數組的右邊加上一列
e=[[5;10] a] %給a數組的左邊加上一列
②陣列連接配接函數cat:可以将兩個數組按指定次元進行連接配接,進而得到大數組。
a=[1 2;3 4]
b=[5 6;7 8]
c=cat(1,a,b) %沿着第一維連接配接
d=cat(2,a,b) %沿着第二維連接配接
e=cat(3,a,b) %沿着第三維連接配接,生成多元矩陣
③陣列重複函數repmat:可以将小數組以重複的形式産生大數組。
t=repmat(a,2,3)
%将a數組複制兩行三列産生新的大數組t。
7. 數組縮小
将大數組變成小數組的方法有兩種:抽取法和删除法。
①抽取法是指從大的數組中抽取其中一部分,進而構成新的數組。
a=[1:4;5:8;9:12;13:16]
b=a(2:3,3:4) %抽取第二、第三行和第三、第四列
c=a([2 4],[1 3]) %抽取第二、第四行和第一、第三列
②删除法是在原來的數組中,利用空數組[ ]删除指定的行或列。
a(2,:)=[ ] %删除第二行
%空指派隻能具有一個非冒号索引。
a(:,[1,3])=[ ] %删除第一列和第三列
a(2)=[ ] %删除一個元素,無法構成數組,則剩餘部分變為行向量
8. 數組變換
MATLAB提供了一組變換函數,如:rot90、tril、triu、fliplr、flipud等,它們可以将數組變換成期望的形式。
A=fix(10*rand(2,4)) %産生[0,10]之間均勻分布的随機數組
B1=tril(A,1),B2=triu(A,1) %上三角數組和下三角數組
C1=fliplr(A),C2=flipud(A) %左右、上下翻轉