实验二数值数组与遗传算法.docx
《实验二数值数组与遗传算法.docx》由会员分享,可在线阅读,更多相关《实验二数值数组与遗传算法.docx(28页珍藏版)》请在冰豆网上搜索。
实验二数值数组与遗传算法
实验二数值数组(矩阵)及其运算
一、实验目的
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