天天看點

MATLAB學習筆記————(MATLAB的數組及其操作)

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) %左右、上下翻轉

●數組的運算

繼續閱讀