实验二数值数组与遗传算法.docx

上传人:b****8 文档编号:29999132 上传时间:2023-08-04 格式:DOCX 页数:28 大小:24.96KB
下载 相关 举报
实验二数值数组与遗传算法.docx_第1页
第1页 / 共28页
实验二数值数组与遗传算法.docx_第2页
第2页 / 共28页
实验二数值数组与遗传算法.docx_第3页
第3页 / 共28页
实验二数值数组与遗传算法.docx_第4页
第4页 / 共28页
实验二数值数组与遗传算法.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

实验二数值数组与遗传算法.docx

《实验二数值数组与遗传算法.docx》由会员分享,可在线阅读,更多相关《实验二数值数组与遗传算法.docx(28页珍藏版)》请在冰豆网上搜索。

实验二数值数组与遗传算法.docx

实验二数值数组与遗传算法

实验二数值数组(矩阵)及其运算

一、实验目的

1、掌握MATLAB软件环境下进行数值数组(矩阵)的创建、访问的基本方法。

2、掌握数值数组(矩阵)的算术运算、逻辑运算和关系运算的方法。

二、实验内容

1、关于“变量”

(1)不需要事先定义,在遇到新的变量名时,自动创建并分配存储空间;当遇到已存在的变量时,更新其内容。

(2)变量名由字母、数字和下划线构成,并且必须以字母开头。

(3)能区分大小写字母。

(4)对变量的赋值可采用赋值语句:

变量=表达式[;]

(5)如果行末加上分号,则在屏幕上不显示结果,这在设计M文件时非常有用。

MATLAB中提供了一些用户不能清除的固定变量:

ans,eps,pi,i,j,NaN,Inf,realmax,realmin,nargin,nargout

>>eps

ans=

2.2204e-016

>>1+eps>1

ans=

1

>>realmax

ans=

1.7977e+308

>>realmin

ans=

2.2251e-308

>>realmin>0

ans=

1

>>1+realmin>1

ans=

0

>>1+realmin==1

ans=

1

2、矩阵的创建和操作

(1)矩阵的创建

方法1:

输入元素列表

●矩阵行中的元素以空格()或逗号(,)间隔

●矩阵行之间用分号(;)或回车(enter)间隔

●整个元素列表用方括号([])括起来

例如:

>>a=[123;456;789]

a=

123

456

789

●用冒号(:

)使操作简便:

>>a=[1:

3;4:

6;7:

9]

a=

123

456

7896

方法2:

从外部数据文件中读取矩阵(见实验一中的load命令,略)

方法3:

利用MATLAB内部函数产生矩阵

函数

功能

函数

功能

compan

伴随阵

magic

魔方矩阵

zeros

元素全为0的矩阵

rand

元素服从均匀分布的随机矩阵

diag

对角阵

linspace

线性空间向量

ones

元素全为1的矩阵

randn

元素服从正态分布的随机矩阵

eye

对角线上元素为1的矩阵(单位矩阵)

logspace

对数空间向量

举例:

>>b=eye(3)

b=

100

010

001b=

>>c=ones(2,5)

c=

11111

11111

>>d=zeros(3,2)

d=

00

00

00

>>e=linspace(-3,6,10)

e=

-3-2-10123456

>>f=logspace(1,6,5)

f=

1.0e+006*

0.00000.00020.00320.05621.0000

(2)矩阵的下标——访问(存取)矩阵元素的依据

全下标:

行下标,列下标。

如a(i,j),几何概念清楚,引述简单。

单下标(linearindex):

矩阵元素在内存中是按“列”存储的

“一维编号”:

把矩阵的所有列按先左后右的次序首尾相接排成“一维长列”后依次编号

两种下标的转换关系:

A为(m×n)的二维数组(矩阵),其中某元素的“全下标”为:

(r,c),则相应的“单下标”为:

k=(c-1)×m+r

MATLAB有两个指令可以实现以上标志方法的转换:

●sub2ind%据全下标换算出单下标,如IND=sub2ind(SIZ,I,J)

●ind2sub%据单下标换算出全下标,如[I,J]=ind2sub(SIZ,IND)

>>a=[123;456;789]

a=

123

456

789

>>IND=sub2ind(size(a),2,3)%返回矩阵a的2行3列元素的单下标

IND=

8

>>aa=a(1,2)+a(2,3)%两个全下标元素值相加

aa=

8

>>bb=a(4)+a(8)%两个单下标元素值相加,注意与上面相同。

bb=

8

>>cc=a(4,2)

?

?

?

Indexexceedsmatrixdimensions.%访问不存在的元素时,产生错误信息

>>a(end-2:

end,2)%在下标中可以直接用end表示这一维的最后一个元素。

%a(end-2:

end,2)等效于a(1:

3,2)

ans=

2

5

8

☆修改元素:

>>a(3,3)=19%把原a(3,3)=9改成19

a=

123

456

7819

>>a(2,1:

3)%显示2行1-3列

ans=

456

>>a(2,1:

3)=[51015]%修改成[51015]。

a=

123

51015

789

☆扩大矩阵(增加行或列)

>>a(4,2)=20

a=

123

51015

789

0200

(3)矩阵行列删除

>>a(4,:

)=[]%删除第4行所有元素,冒号表示所有行或列

a=

123

51015

789

>>a(:

3)=[]%删除第3行所有元素,冒号表示所有行或列

a=

12

510

78

>>a(4,2)=[]%删除命令应指向一个存在的元素,否则导致一个出错信息。

?

?

?

Indexedemptymatrixassignmentisnotallowed.

>>a(2:

2:

6)=[]%用单下标可删除单个或多个元素,剩余部分变成行向量。

a=

1710

(4)矩阵连接

>>a=[12;34];

b=[aa+5;a-5zeros(size(a))]%用[]将小矩阵连接成大矩阵。

b=

1267

3489

-4-300

-2-100

>>c=[a;510]

c=

12

34

510

(5)矩阵操作

diag对角矩阵和矩阵的对角化

rot90矩阵旋转90度

reshape矩阵元素重新排列

tril矩阵的下三角阵

triu矩阵的上三角阵

fliplr矩阵左右翻转

flipud矩阵上下翻转

cat矩阵连接

repmat复制并平铺矩阵

举例:

设有矩阵

>>a=[123;456;789]

a=

123

456

789

>>b=diag(a)

b=

1

5

9

%X为矩阵时,V=diag(X,k)得到列向量V,它取自X的第k个对角线上的元素

%k=0,表示主对角线,等同于V=diag(X)。

>>c=diag(b)%产生对角阵。

k=0,表示主对角线

c=

100

050

009

>>c1=diag(b,1)%k>0,表示在主对角线之上。

c1=

0100

0050

0009

0000

>>c1=diag(b,-1)%k<0,表示在主对角线之下。

c1=

0000

1000

0500

0090

>>a=[1234]%V为n维向量时,diag(V,k)产生n+abs(k)阶方阵,V的元素处于第k条对角线上。

a=

1234

>>diag(a,2)

ans=

001000

000200

000030

000004

000000

000000

●d=rot90(a)%将矩阵a逆时针旋转90度,等同于d=rot90(a,k),k=1

>>a=[123;456;789]

a=

123

456

789

>>d=rot90(a)

d=

369

258

147

●reshape(a,m,n)%reshape(a,m,n)从矩阵a中重新生成m×n的矩阵,元素按“列”顺序选取。

>>a=[123;456]

a=

123

456

>>reshape(a,3,2)

ans=

15

43

26

●a=[123;456;789]%矩阵的下三角阵和上三角阵

a=

123

456

789

>>f1=tril(a),f2=triu(a)

f1=

100

450

789

f2=

123

056

009

●f3=fliplr(a),f4=flipud(a)%矩阵左右和上下翻转

f3=

321

654

987

f4=

789

456

123

●A=[12;34],B=[56;78]%矩阵连接。

A=

12

34

B=

56

78

>>C1=cat(1,A,B),C2=cat(2,A,B)%矩阵连接,cat(dim,A,B)将矩阵A、B沿着dim维连接起来

C1=

12

34

56

78

C2=

1256

3478

●repmat(a,2,3)%按m×n的格式扩张a(矩阵或标量),repmat(a,m,n)或repmat(a,[mn]);m=n时,repmat(a,n)

a=

123

456

789

>>repmat(a,2,3)

ans=

123123123

456456456

789789789

123123123

456456456

789789789

>>repmat(8,3)

ans=

888

888

888

3、矩阵运算

(1)算术运算

1)算术运算符:

+-*/\^'

2)算术运算和对应的M函数

功能

算术表达式

M函数

功能

算术表达

M函数

加法

A+B

plus(A,B)

矩阵左除

A\B

mldivide(A,B)

减法

A-B

minus(A,B)

数组左除

A.\B

ldivide(A,B)

矩阵乘法

A*B

mtimes(A,B)

矩阵求幂

A^B

mpower(A,B)

数组乘法

A.*B

times(A,B)

数组求幂

A.^B

power(A,B)

矩阵右除

A/B

mrdivide(A,B)

矩阵共轭转置

A'

ctranspose(A)

数组右除

A./B

rdivide(A,B)

非共轭转置

A.'

transpose(A)

3)基本数学函数:

函数名

数学计算功能

函数名

数学计算功能

abs(x)

实数的绝对值或复数的幅值

floor(x)

对x朝-∞方向取整

acos(x)

反余弦arcsinx

gcd(m,n)

求正整数m和n的最大公约数

acosh(x)

反双曲余弦arccoshx

imag(x)

求复数x的虚部

angle(x)

在四象限内求复数x的相角

lcm(m,n)

求正整数m和n的最小公倍数

asin(x)

反正弦arcsinx

log(x)

自然对数(以e为底数)

asinh(x)

反双曲正弦arcsinhx

log10(x)

常用对数(以10为底数)

atan(x)

反正切arctanx

real(x)

求复数x的实部

atan2(x,y)

在四象限内求反正切

rem(m,n)

求正整数m和n的m/n之余数

atanh(x)

反双曲正切arctanhx

round(x)

对x四舍五入到最接近的整数

ceil(x)

对x朝+∞方向取整

sign(x)

符号函数:

求出x的符号

conj(x)

求复数x的共轭复数

sin(x)

正弦sinx

cos(x)

余弦cosx

sinh(x)

反双曲正弦sinhx

cosh(x)

双曲余弦coshx

sqrt(x)

求实数x的平方根

exp(x)

指数函数ex

tan(x)

正切tanx

fix(x)

对x朝原点方向取整

tanh(x)

双曲正切tanhx

举例:

①两种不同转置的区别:

>>clear;A=zeros(2,3);

A(:

)=1:

6;%全元素赋值法

A=A*(1+i)%运用标量与数组乘产生复数矩阵

A_A=A.'%数组转置,即非共轭转置

A_M=A'%矩阵转置,即共轭转置

A=%运用标量与数组乘产生复数矩阵。

1.0000+1.0000i3.0000+3.0000i5.0000+5.0000i

2.0000+2.0000i4.0000+4.0000i6.0000+6.0000i

A_A=%数组转置,即非共轭转置。

1.0000+1.0000i2.0000+2.0000i

3.0000+3.0000i4.0000+4.0000i

5.0000+5.0000i6.0000+6.0000i

A_M=%矩阵转置,即共轭转置

1.0000-1.0000i2.0000-2.0000i

3.0000-3.0000i4.0000-4.0000i

5.0000-5.0000i6.0000-6.0000i

②求矩阵的逆矩阵(4种方法):

>>B=[12;34];

B1=inv(B)

B2=B^(-1)

B3=eye

(2)/B

B4=B\eye

(2)

B1=

-2.00001.0000

1.5000-0.5000

B2=

-2.00001.0000

1.5000-0.5000

B3=

-2.00001.0000

1.5000-0.5000

B4=

-2.00001.0000

1.5000-0.5000

③关于矩阵求幂:

>>A=[12;34];

B=[21;32];

A.^B

ans=

12

2716

>>exp(A)%求eA,其他函数如sin,tan,log,sqrt等都是对矩阵的每个元素进行相应

运算。

ans=

2.71837.3891

20.085554.5982

>>mpower(A,B)%函数操作数A、B中至少要有一个标量;否则出错。

?

?

?

Errorusing==>mpower

Atleastoneoperandmustbescalar.

>>B=5;

mpower(A,B)

ans=

10691558

23373406

>>A^(-2)

ans=

5.5000-2.5000

-3.75001.7500

%X^p,标量p为整数时,通过连乘实现;当p为负整数时,先对矩阵X求逆。

%当p为其他值时,计算要涉及到特征值和特征向量,这样当[V,D]=eig(X)X^p=V*D.^p/V

(2)关系和逻辑运算

1)关系操作符(6种):

>、<、>=、<=、==、~=

2)逻辑操作符(4种):

&(and)、|(or)、~(not)、xor

3)一些测试用的逻辑函数:

all、any、find、exist、is*(26种)

举例:

a=[1,2;0,4];%all:

测试“所有元素”是否为非零

>>all(a)%a为向量时,all(a)在所有元素非零时,得到逻辑真:

“1”

%a为矩阵时,all(a)将a的列当作向量,得到0、1构成的行向量。

ans=

11

>>all(all(a))%对矩阵a采用两次all函数可得到标量结果。

ans=

0

>>all(ones(2,5),2)%all(a,dim)可测试沿着dim维上的逻辑条件。

ans=

1

1

>>any(a)%any:

测试“任意元素”是否为非零值,也有any(a)、any(a,dim)

等形式。

ans=

21

>>a=zeros(5,10)%find:

查找非零元素的值及其下标,k=find(a):

找非零元素的下标,若a全零,则k=[]

>>a=zeros(5,10)

a=

0000000000

0000000000

0000000000

0000000000

0000000000

>>a(3,7)=0.5

a=

0000000000

0000000000

0000000.500000

0000000000

>>k=find(a)%找非零元素的单下标。

k=

33

>>[i,j]=find(a)%找出矩阵a中非零元素的行列下标。

i=

3

j=

7

>>[i,j,v]=find(a)%[i,j,v]=find(X):

找出矩阵X中非零元素的行列下标和值。

i=

3

j=

7

v=

0.5000

%

%后两者的功能常用于“稀疏矩阵”中。

●—————————————————————————————————

ifexist('sg.dat')%exist:

可在装入数据之前对数据文件作检测(存在否?

loadsg.mat%这在数据量较大时是很有用的

else%sg.dat存在时直接将数据读入,否则将sg初始化为0矩阵

sg=zeros(30,2)

end

●——————————————————————————————————

利用is*(如:

isreal、ischar、islogical等)这一组函数可以对矩阵进行各种检测,下面以isnan(用于检测非数值,同isinf)举例:

m=mean(a)%求均值;矩阵中含NaN时,基于它的函数值也含有NaN;因此,在数据处理之前,一般应对数据进行分析,删除含有NaN的测量样本后再进行处理。

>>a=[122;230.4;35-0.9;4NaN0.9;5-2.0-0.8]

m=mean(a)

[i,j]=find(b)

iflength(i)%当i不为空时

a(i,:

)=[]

end

disp('Thedataafterprocessingisa='),disp(a)

a=

1.00002.00002.0000

2.00003.00000.4000

3.00005.0000-0.9000

4.0000NaN0.9000

5.0000-2.0000-0.8000

m=

3.0000NaN0.3200

i=

4

j=

1

a=

1.00002.00002.0000

2.00003.00000.4000

3.00005.0000-0.9000

5.0000-2.0000-0.8000

Thedataafterprocessingisa=

1.00002.00002.0000

2.00003.00000.4000

3.00005.0000-0.9000

5.0000-2.0000-0.8000

4.遗传算法的Matlab程序

%functiontest(lchrom,popsize,Pc,Pm,gen)

%functiontest(xy,lchrom,popsize,Pc,Pm,gen)

%初始化数据

lchrom=10%基因个数=城市个数

popsize=100%种群规模

Pc=0.91%交叉概率

Pm=0.08%变异概率

gen=1000%最大迭代次数

tic%计时开始

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

xy=rand(lchrom,2)*100%随机给出一组初始点

fori=1:

lchrom

plot(xy(i,1),xy(i,2),'r*');

holdon

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%55

shortpath=[];%最短路径设一个最大值

shortpathlength=realmax;

pop=inigroup(lchrom,popsize)%给出一组popsize大小的初始化排序方案

record=zeros(1,gen)

forw=1:

gen%for1%最大迭代次数

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

forR=1:

popsize%for2%种群规模,一一计算各染色体

ifrand

(1)

(1)=rand,交叉概率

distmatrix=site(lchrom,xy);%计算距离,对称矩阵

i=floor((lchrom-1)*rand)+1;

%无论x正负,向舍去小数后的较小整数靠近

j=floor((lchrom-1)*rand)+1;

%i,j=1~10之间随机数,给出随机选择的两个染色体i=1j=9

oldp1=pop(i,:

);

%随机选择两个染色体oldp1=[89411056273]

oldp2=pop(j,:

);%old2=[53109681742]

m=crossover(oldp1,oldp2);

%完成交叉操作,两两随机交换,此处选择的是消去法,使用eliminate函数

newp1=m(1,:

);%交换后的结果

newp2=m

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1