第四部分 数组和矩阵

 1.一维数组的创建

 (1)逐个元素输入法:

Variantname=[element1 element2 element3 ...element n]

Variantname=[element1,element2,element3,...element n]

Variantname=[element1 ;element2;element3;...element n]

Variantname=[element1

element2

...

element n]

Variantname表示所要创建的数组名,element表示数组元素

例:

>> x1=[6 2 3]

x1 =

6 2 3



>> x2=[7,5,8]


x2 =
7 5 8



>> y1=[7;5;8]

y1 =
7

5

8


>> y2=[6

2

7]


y2 =
6

2

7

(1)冒号生成法

  Variantname=a:inc:b

Variantname=[a:inc:b]

Variantname=[a,a+inc*1,a+inc*2,...a+inc*n]

inc是元素之间的间隔(也称为步长),可正可负可省略,省略默认为1

若(b-a)是inc的倍数,则数组最后一个元素等于b

若(b-a)不是inc的整数倍,当a+inc*(n+1)超过b时,数组最后一个元素为a+inc*n

a,b必须为实数,b大于a时,inc应为正数,否则负数不可取0

例:

>> x1=3:5

x1 =

3 4 5


>> x2=[1:0.5:3.2]

x2 =

1.0000 1.5000 2.0000 2.5000 3.0000


>> x3=3.2:-0.5:1

x3 =

3.2000 2.7000 2.2000 1.7000 1.2000

(2)定数线性采样法

linspace()函数格式:

Variantname=linspace(a,b,n)

n为总元素个数,大于1的整数,n可省略省略时默认值为100,若a,b都为实数,则该指令等效于Variantname=a:(b-a)/(n-1):b

例:

>> x1=linspace(2,4,6)

x1 =

2.0000 2.4000 2.8000 3.2000 3.6000 4.0000


>> x2=linspace(8,pi,3)


x2 =

8.0000 5.5708 3.1416


>> y1=linspace(8,3,-0.5)

y1 =

Empty matrix: 1-by-0

logspace()函数格式:

variantname=logspace(a,b,n)

例:

>> x1=logspace(1,2,5)

x1 =

10.0000 17.7828 31.6228 56.2341 100.0000



>> x2=logspace(3,1,6)

x2 =

1.0e+03 *

1.0000 0.3981 0.1585 0.0631 0.0251 0.0100


>> y1=linspace(4,6,1)

y1 =

6

注:logspace()函数的用法和linspace()函数用法相似,区别:

linspace()函数创建的数组范围a~b,等效于Variantname=a:(b-a)/(n-1):b

logspace()函数创建数组的范围是~,等效于Variantname=::

2.一维数组子数组的寻访和赋值

(1)一维数组子数组的寻访

arrayname(index)

例:

>> x=6:10  %创建一维行数组x,数组元素为6,7,8,9,10

x =

6 7 8 9 10



>> y=[6;7;8] %创建一维列数组y,数组元素为6,7,8

y =

6

7

8

%index为单个整数时

>> x(2) %寻访x数组的第二个元素,结果为7

ans =

7

>> y(3) %寻访y数组的第三个元素,结果为8

ans =

8

%index为正整数数组时

>> x([1,3,5]) %寻访x数组的第1,3,5个元素

ans =

6 8 10



>> a=y([2,3]) %寻访y数组的第2,3个元素,并将其赋值给a

a =

7

8



>> b=x(2:5) %寻访x数组的第2~5个元素,并将其赋值给b

b =

7 8 9 10



>> x(2:end) %寻访x数组的第2~5个元素

ans =

7 8 9 10



>> y(1:end) %寻访y数组的第1~3个元素

ans =

6

7

8



>> x(linspace(2,4,3)) %寻访x数组的第2,3,4个元素

ans =

7 8 9



>> y(linspace(1,3,3)) %寻访y数组的第1,2,3个元素

ans =

6

7

8

(2)一维数组子数组的赋值:

arrayname(index)=new arrayvalue

arrayname为被赋值的数组名,arrayname(index)为被赋值数组的子数组,arrayname(index)代表对arrayname的寻访。new arrayvalue为将要赋给等式左端的数组或数值

例:

>> x=6:10; %创建一个一维行数组x,数组元素为6,7,8,9,10

>> y=[6;7;8]; %创建一个一维列数组y,数组元素为6,7,8

%index为单个正整数时

>> x(2)=10; %将x数组的第二个元素赋值为10

>> y(3)=5; %将y数组的第三个元素赋值为5

%index为正整数数组时

>> x([1,3,5])=[8,2,7]; %将x数组的第1,3,5个元素赋值为8,2,7

>> y([2,3])=[1,2]; %将y数组的第2,3个元素赋值为1,2

>> y(1:end)=linspace(2,4,3) %将y数组的第1~3个元素赋值为2,3,4

y =

2

3

4

>> x(linspace(2,4,3))=8 %将x数组的第2~4个元素赋值为8

x =

8 8 8 8 7

3.二维数组的创建和寻访

(1)直接输入法:

Variantname=[exp11 exp12 exp13...;exp21 exp22 exp23...;expn1 expn2 expn3...]

Variantname=[exp11,exp12,exp13...;exp21,exp22,exp23...;expn1,expn2,expn3...]

Variantname=[exp11 exp12 exp13

exp21 exp22 exp23

...

expn1 expn2 expn3]

Variantname=[exp11,exp12,exp13...

exp21,exp22,exp23...

...

expn1,expn2,expn3...]

例:

>> x1=[9 2 3;7,11,9;4:-2:0]

x1 =

9 2 3

7 11 9

4 2 0

>> x2=[2,3,6

linspace(0,pi,3)

7,2,3]

x2 =

2.0000 3.0000 6.0000

0 1.5708 3.1416

7.0000 2.0000 3.0000

(2)利用M文件创建和保存数组

在MATLAB工具栏中单机【新建】按钮,将自动启动M文件编辑窗口,输入二维数组x:

 

MATLAB之数组和矩阵_子数组

编辑完成后点保存,并将文件命名为“Scriptx.m”,然后退出M文件编辑窗口

在MATLAB命令窗口执行“Scriptx”命令后,MATLAB将创建“Scriptx.m”中定义数组,如:

>> Scriptx

x =

0.2000 0.5800 0.7200

0.8000 0.4000 2.5000

(3)二维数组子数组的寻访和赋值

二维数组子数组访问的基本格式:

arrayname(row index,column index)

其中,row index,column index分别代表行索引与列索引,可为正整数或正整数数组。

A(:,j)表示寻访A的第j列元素。

A(i,:)表示寻访A的第i行元素。

A(2:4,3:5)表示寻访A的第2~4行,第3~5列的元素

A(:;:)表示寻访A的所有元素

二维数组子数组赋值的基本格式:

arrayname(row index,column index)=new arrayname

例:

>> x=[2.1,3.5,7.8,4.3,1.9;linspace(pi,10,5);linspace(2,8,5)]  %创建3X5的数组x

x =

2.1000 3.5000 7.8000 4.3000 1.9000

3.1416 4.8562 6.5708 8.2854 10.0000

2.0000 3.5000 5.0000 6.5000 8.0000


>> x(3,4) %寻访第三行,第四行的元素

ans =

6.5000

>> a=x(1:3,[1,3]) %将第1~3行,第1,3列元素赋值给a

a =

2.1000 7.8000

3.1416 6.5708

2.0000 5.0000

>> b=x(:,5) %将第5列所有元素赋值给b

b =

1.9000

10.0000

8.0000


>> x(:)=2:16 %对x数组重新赋值


x =

2 5 8 11 14

3 6 9 12 15

4 7 10 13 16

4.执行数组运算的常用函数

(1)随机构建数组函数rand():

rand(n)  %生成nXn的随机数组

rand(n1,n2,n3,...nn)  %生成n1Xn2Xn3X....Xnn的随机数组

(2)获取数组长度函数size():

size()  %获取数组x的各维长度,返回包含数组x各维长度的一维行数组

size(x,dim)  %获取数组x的dim维长度

(3)获取数组元素总数函数numel():

numel(x)  %获取数组x的元素总数

numel(x,index1,index2...)  %获取x(index1,index2...)的元素总数

(4)获取数组指定维度的长度的函数length():

length(x)  %获取数组x的最长维度的长度

(5)获取数组平均值函数mean():

mean(x,dim)  %以dim维的形式返回数组x的平均值

(6)reshape()函数:

reshape(x,m,n,p...)   %利用数组x的值构造mXnXpX...的数组

注:reshape()函数要求至少提供3个元素,即x,m,n

5.向量和子矩阵的生成

%分别使用逐个元素输入法、冒号生产法、定点采样生成法创建向量

>> x=[2;3;4]     %向量x,即一维数组x

x =

2

3

4



>> y=[4:-0.5:2] %使用冒号生成法创建一维行向量

y =

4.0000 3.5000 3.0000 2.5000 2.0000

>> z=[linspace(2,8,4)] %使用定点采样生成法创建一维行向量

z =

2 4 6 8

6.矩阵创建函数

函数

功能

函数

功能

diag()

生成对角矩阵

gallery()

生成Higham矩阵

zeros()

生成零矩阵

hadamard()

生成Hadamard矩阵

ones()

生成元素值全为1的矩阵

hankel()

生成Hankel矩阵

eye()

生成单位矩阵

hilb()

生成Hilbert矩阵

magic()

生成魔方矩阵

pascal()

生成帕斯卡矩阵

rand()

生成随机矩阵

rosser()

生成经典对称特征值测试矩阵

wilkinson()

生成Wilkinson特征值测试矩阵

toeplitz()

生成Toeplitz矩阵

compan()

生成Companion矩阵

vander()

生成范德蒙矩阵

7.高维数组的操作

(1)提取矩阵右上角三角形区域内的元素并赋予新矩阵的函数triu()

一般格式:

triu(X)       %提取A的主对角线右上方的三角形区域内的元素

triu(X,k)     %提取矩阵X的第K根对角线右上方的三角形区域内的元素

例:

>> A=[1:4;5:8;9:12]

A =

1 2 3 4

5 6 7 8

9 10 11 12



>> x1=triu(A)

x1 =

1 2 3 4

0 6 7 8

0 0 11 12



>> x2=triu(A,2)

x2 =

0 0 3 4

0 0 0 8

0 0 0 0

(2)获取矩阵左下三角形区域元素的函数tril()

例:

>> A=[1:4;5:8;9:12]

A =

1 2 3 4

5 6 7 8

9 10 11 12


>> x1=triu(A)

x1 =

1 2 3 4

0 6 7 8

0 0 11 12


>> x2=tril(A,-1) %提取A的主对角线下方第一根对角线的左上方区域内的元素

x2 =

0 0 0 0

5 0 0 0

9 10 0 0

>> x3=x1+x2

x3 =

1 2 3 4

5 6 7 8

9 10 11 12

(3)矩阵翻转函数

一般格式:

flipud(X)        %将X沿水平轴翻转

flipud(X)       %将X沿垂直轴翻转

flipud(X,dim)   %将X沿特定轴翻转。dim等于1时,按行翻转;dim等于2时,按列翻转

              %dim等于3时,按页翻转,以此类推

例:

>> A=reshape([1:12],3,4),B=reshape([1:12],2,2,3);

A =

1 4 7 10

2 5 8 11

3 6 9 12

>> x1=flipud(A)

x1 =

3 6 9 12

2 5 8 11

1 4 7 10



>> x2=fliplr(A)

x2 =

10 7 4 1

11 8 5 2

12 9 6 3


>> x3=flipdim(B,3)

x3(:,:,1) =

9 11

10 12



x3(:,:,2) =

5 7

6 8


x3(:,:,3) =

1 3

2 4

(4)矩阵旋转函数

一般格式:

rot90(X)   %将A按逆时针方向旋转90度

例:

>> A=[1:4;5:8;9:12]

A =

1 2 3 4

5 6 7 8

9 10 11 12

>> B=rot90(A)

B =

4 8 12

3 7 11

2 6 10

1 5 9

8.矩阵运算

(1)加法和减法

>> A=[1:4;5:8];B=[3:6;7:10];C=2;D=1:4;

>> x1=A+B

x1 =

4 6 8 10

12 14 16 18

>> x2=A-C

x2 =

-1 0 1 2

3 4 5 6

>> x3=A+B*i

x3 =

1.0000 + 3.0000i 2.0000 + 4.0000i 3.0000 + 5.0000i 4.0000 + 6.0000i

5.0000 + 7.0000i 6.0000 + 8.0000i 7.0000 + 9.0000i 8.0000 +10.0000i



>> x4=A+D %运算对象不相等出现错误

Error using +

Matrix dimensions must agree.

(2) 乘法

数组乘法:

>> A=reshape([1:8],2,4);

>> B=reshape([8:-1:1],2,4);

>> A.*B

ans =

8 18 20 14

14 20 18 8

矩阵的普通乘法:

>> A=reshape([1:9],3,3);

>> B=reshape([9:-1:1],3,3);

>> c=2;

>> x1=A*B

x1 =

90 54 18

114 69 24

138 84 30

>> x2=A*C

x2 =

2 8 14

4 10 16

6 12 18

矩阵的Kronecker乘法:

>> A=[1 2;3 4];B=[1 2 1;3 6 3];

>> kron(A,B)

ans =

1 2 1 2 4 2

3 6 3 6 12 6

3 6 3 4 8 4

9 18 9 12 24 12

(3)除法

元素除法:

A./B    %矩阵A的元素依次被矩阵B的元素除

A.\B    %矩阵B的元素依次被矩阵A的元素除

例:

>> a=1:4;b=4:-1:1;c=2;

>> x1=a./b

x1 =

0.2500 0.6667 1.5000 4.0000

>> x2=a.\b

x2 =

4.0000 1.5000 0.6667 0.2500

>> x3=a./2

x3 =

0.5000 1.0000 1.5000 2.0000

一般除法:

>> a=[1 2;3:4];b=[4 3;2 1];c=2;d=5;

>> x1=a\b,x2=a/b

x1 =

-6.0000 -5.0000

5.0000 4.0000

x2 =

1.5000 -2.5000

2.5000 -3.5000

>> y1=inv(a)*b,y2=a*inv(b)

y1 =

-6.0000 -5.0000

5.0000 4.0000

y2 =

1.5000 -2.5000

2.5000 -3.5000


>> x3=c\d,x4=c/d

x3 =

2.5000


x4 =

0.4000



>> x5=a/c,x6=a\c

x5 =

0.5000 1.0000

1.5000 2.0000

Error using \

Matrix dimensions must agree.

 %运算对象都为标量时,不能执行左除运算,故x6无法获得运算结果

(4)转置和共轭

非共轭转置 :

A.’      %对矩阵A进行非共轭转置运算

transpose(A)  %对矩阵A进行非共轭转置运算

例:

>> A=reshape([1:8],2,4);B=reshape([8:-1:1],2,4);C=A+B*i;

>> x1=A.'

x1 =

1 2

3 4

5 6

7 8

>> x2=transpose(C)

x2 =

1.0000 + 8.0000i 2.0000 + 7.0000i

3.0000 + 6.0000i 4.0000 + 5.0000i

5.0000 + 4.0000i 6.0000 + 3.0000i

7.0000 + 2.0000i 8.0000 + 1.0000i

共轭转置:

>> A=reshape([1:8],2,4);B=reshape([8:-1:1],2,4);C=A+B*i;

>> x2=C'

x2 =

1.0000 - 8.0000i 2.0000 - 7.0000i

3.0000 - 6.0000i 4.0000 - 5.0000i

5.0000 - 4.0000i 6.0000 - 3.0000i

7.0000 - 2.0000i 8.0000 - 1.0000i

9.元素操作函数

(1)指数函数:

exp(A)    %以e为底,分别以A的元素为指数,求幂

expm(A)    %以e为底,以A为指数,求幂,A必须为行列数相等的矩阵

例:

>> A=[1 2;3 4];

>> x1=exp(A)

x1 =

2.7183 7.3891

20.0855 54.5982


>> x1=expm(A)

x1 =

51.9690 74.7366

112.1048 164.0738

(2)对数函数:

log(A)     %对矩阵A的各元素执行对数运算

logm(A)   %对矩阵A整体执行对数运算

例:

>> A=[1 2;3 4];B=A+2i;

>> x1=log(A)

x1 =

0 0.6931

1.0986 1.3863

>> x2=logm(B)

x2 =

0.0047 + 2.3109i 1.4426 - 0.5309i

1.6705 - 1.0243i 0.6884 + 0.8307i

(3)开方函数:

sqrt(A)   %对矩阵A的各元素执行开方运算

sqrtm(A)  %对矩阵A整体执行开方运算

例:

>> A=[1 2;3 4];

>> x1=sqrt(A)

x1 =

1.0000 1.4142

1.7321 2.0000

>> x2=sqrtm(A)

x2 =

0.5537 + 0.4644i 0.8070 - 0.2124i

1.2104 - 0.3186i 1.7641 + 0.1458i