数值数组及向量化运算.doc_第1页
数值数组及向量化运算.doc_第2页
数值数组及向量化运算.doc_第3页
数值数组及向量化运算.doc_第4页
数值数组及向量化运算.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章 数值数组及向量化运算数值数组(Numeric Array)和数组运算(Array Operations)始终是MATLAB的核心内容。本书从第3章起,全部注意力将集中于数值数组及其运算。本章系统阐述:数组浮点算法的特点;一、二维数值数组的创建和寻访;数组运算和向量化编程;实现数组运算的基本函数;常用标准数组生成函数和数组构作技法;非数NaN、“空”数组概念和应用;关系和逻辑操作。3.1 数值计算的特点和地位【例3.1-1】已知,求。(1)符号计算解法syms t x %定义符号变量ft=t2*cos(t)%定义函数sx=int(ft,t,0,x)%符号积分 ft =t2*cos(t)sx =x2*sin(x)-2*sin(x)+2*x*cos(x) 说明:1. 符号计算可以得到和手工数学推导相同的结果;2. 可以得到精确的解析结果(2)数值计算解法dt=0.05;%定义采样间隔t=0:dt:5;%定义数值积分的计算区域,数值计算只在有限的区间的采样点进行Ft=t.2.*cos(t);%定义计算的函数Sx=dt*cumtrapz(Ft);%数值积分,计算从0开始到每个采样点位置的区间内,Ft曲线 %下的面积,此面积由宽度为t的小梯形面积累加而成; %下面分步看一下计算结果:whosbar(t,Ft) %Ft函数的数值hold onplot(t,Sx,.r,MarkerSize,12) %数值积分结果axis(0,6,-25,10)hold off Name Size Bytes Class Ft 1x101 808 double array Sx 1x101 808 double array dt 1x1 8 double array t 1x101 808 double array xqxqxq1234 1x1 1 logical arrayGrand total is 305 elements using 2433 bytes 说明:1. 进行数值计算,必须首先确定一组自变量采样点,即确定一个自变量的取值区间,并设定取样间隔;2. 数值计算的表达式都是在意志的数值采样点进行计算;3. 数值计算的结果也是离散的;4. 再将数值计算的结果扩展到更大的计算区域时不一定成立;5. 直接观察计算结果的离散数值难以看出函数关系,但图形有利于加深对函数的认识。【例3.1-2】已知,求。(1)符号计算解法syms t xft=exp(-sin(t)sx=int(ft,t,0,4) ft =exp(-sin(t)Warning: Explicit integral could not be found. In at 58sx =int(exp(-sin(t),t = 0 . 4) 说明:符号计算的能力有限,不是在任何情况下都可以得到计算结果;(2)数值计算解法dt=0.05;t=0:dt:4; Ft=exp(-sin(t);Sx=dt*cumtrapz(Ft);Sx(end)bar(t,Ft)hold onplot(t,Sx,.r,MarkerSize,15)hold offxlabel(x)legend(Ft,Sx)hold off ans = 3.0632 说明:数值计算的应用非常广泛,只要给定计算区间、采用点和计算表达式,总是可以得到数值计算的结果。3.2 数值数组的创建和寻访3.2.1 一维数组的创建1递增/减型一维数组的创建主要特征:(1)数组元素值的大小按照递增或者递减的顺序排列,元素之间的“差”是固定的或者“等步长”的。(2)主要用作函数的自变量,for循环中的自变量等。创建方法:(1)“冒号”生成法格式: x = a : inc :b说明:x-变量名称; a/ b-起点/终点 inc -步长(正数或者负数)例子: (1)i = 0:1:10 i = 0 1 2 3 4 5 6 7 8 9 10 (2) i = 0:10 i = 0 1 2 3 4 5 6 7 8 9 10 说明: 缺省的步长是1;(3) i = 0:1:8.5 ans = 0 1 2 3 4 5 6 7 8 (4) i = 0.5:1:10 i = 0.5000 1.5000 2.5000 3.5000 4.5000 5.5000 6.5000 7.5000 8.5000 9.5000 说明: 当abs(b-a)不能被inc整除,生成的最后一个元素将小于b;(5) i = 10:-1:0 i = 10 9 8 7 6 5 4 3 2 1 0 (6) i = 10:-1:20 i = Empty matrix: 1-by-0 说明:步长可以为负数,但此时前面的元素必须大于后面的。(2)线性(或者对数)定点法格式: x=linspace(a,b,n) %以a,b为左右端点,产生线性等间隔的(1*n)行数组;x=logspace(a,b,n) %以10a,10b为左右端点,产生对数等间隔的(1*n)行数组;xl=linspace(0,10,9) xl = 0 1.2500 2.5000 3.7500 5.0000 6.2500 7.5000 8.7500 10.0000 说明:x=linespace(a,b,n) x=a:(b-a)/(n-1):bxl=logspace(1,4,4) xl = 10 100 1000 10000 说明:logspace(x1,x2,N)用于在10x1 and 10x2之间产生N个对数均匀间隔的点。2 通用型一维数组的创建(1)逐个元素输入法,最简单而通用的方法。如:y=1,2, sin(pi/5),-exp(-3) y = 1.0000 2.0000 0.5878 -0.0498 (2)使用Matlab函数生成,如rand(1,n), ones(1,n)rand(1,10) %在0,1之间产生(1*10)的向量;ans = 0.9501 0.2311 0.6068 0.4860 0.8913 0.7621 0.4565 0.0185 0.8214 0.4447 rand(5,5) ans = 0.6154 0.4057 0.0579 0.2028 0.0153 0.7919 0.9355 0.3529 0.1987 0.7468 0.9218 0.9169 0.8132 0.6038 0.4451 0.7382 0.4103 0.0099 0.2722 0.9318 0.1763 0.8936 0.1389 0.1988 0.4660 rand(5,5) ans = 0.5548 0.2731 0.9084 0.6408 0.9943 0.1210 0.2548 0.2319 0.1909 0.4398 0.4508 0.8656 0.2393 0.8439 0.3400 0.7159 0.2324 0.0498 0.1739 0.3142 0.8928 0.8049 0.0784 0.1708 0.3651 补充说明:为了让前面出现过的随机数再次重复出现,需要对随机数生成器的“状态state”或者“种子seed”进行设置。rand(state,0) %设置随机数生成器的状态rand(1,5) ans = 0.9501 0.2311 0.6068 0.4860 0.8913 rand(state,0) %设置随机数生成器的状态rand(1,5) ans = 0.9501 0.2311 0.6068 0.4860 0.8913 ones(3,8) ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 思考题、练习题:(1)如何生成在(60,100)之间均匀随机分布的(5*8)的矩阵?如何取整数呢?(2)产生列数组 x2 = (1:6) x2 = linspace(0,pi,4)思考题答案:(1) round(60+rand(5,8).*40) ans = 97 65 83 61 84 83 88 66 87 68 78 75 84 62 63 87 69 84 62 87 61 75 78 88 94 85 61 64 61 85 78 89 85 75 73 61 68 89 74 79 (2) x2 = (1:6) x2 = 1 2 3 4 5 6 x2 = linspace(0,pi,4) x2 = 0 1.0472 2.0944 3.1416 其他函数说明:rand() %生成均匀分布的随机数组;randn() %生成正态分布的随机数组;round() %四舍五入取整数zeros() %产生0eye(N) %产生N*N的单位矩阵eye(5) ans = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 3.2.2二维数组的创建一种方法是采用手工输入法,另外还有如下方法。1小规模数组的直接输入法【例3.2-2】在MATLAB环境下,用下面三条指令创建二维数组C。a=2.7358,b=33/79 C=1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i a = 2.7358b = 0.4177C = 1.0000 5.4716 + 0.4177i 0.6909 0.7071 4.8244 3.5000 + 1.0000i 2中规模数组的数组编辑器创建法在数组规模比较大了之后,就不适合采用直接手工输入方法了,可以采用数组编辑器。【例3.2-3】根据现有数据创建一个的数组。图3.2-1 利用数组编辑器创建中规模数组3中规模数组的M文件创建法(1)对于常用的数组,可以保存在一个mat文件中,然后就可以在后面调用了。举例:cleara = (1:10);b = (11:20);c = (21: 30);d = a;b;c save myMatrix d;clearload myMatrix d = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 如果要通过运行m文件产生数组,可以在m文件中编辑数组,然后再运行m文件即可。如:在myMatirx.m文件中输入如下内容,然后运行myMatrix.m就可以载入该数组。%Construct 2D matrixd = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30【例3.2-4】创建和保存数组 AM的 MyMatrix.m 文件。(1) 打开文件编辑调试器,并在空白填写框中输入所需数组(见图3.2-2)。(2) 最好,在文件的首行,编写文件名和简短说明,以便查阅(见图3.2-2)。(3) 保存此文件,并且文件起名为 MyMatrix.m 。(4) 以后只要在MATLAB指令窗中,运行 MyMatrix.m文件 ,数组 AM 就会自动生成于 MATLAB内存中。图3.2-2 利用M文件创建数组4利用MATLAB函数创建数组用于产生特殊二维数组/矩阵的函数如下:diag() %产生对角数组eye() %产生单位数组magic() %产生魔方数组rand() %产生随机数randn() random()3.2.3二维数组元素的标识和寻访【例3.2-6】本例演示:数组元素及子数组的各种标识和寻访格式;冒号的使用;end的作用。A=zeros(2,6)A(:)=1:12 A = 0 0 0 0 0 0 0 0 0 0 0 0A = 1 3 5 7 9 11 2 4 6 8 10 12 A(2,4)A(8) ans = 8ans = 8 A(:,1,3)A(1,2,5,6) ans = 1 5 2 6ans = 1 2 5 6 A(:,4:end) %双下标,显示从第四列到最后一列的所有元素。end表示最后一列ans = 7 9 11 8 10 12 A(2,1:2:5)=-1,-3,-5 A = 1 3 5 7 9 11 -1 4 -3 8 -5 12 A(2,1:2:5)=-1,-3,-5 A = 1 3 5 7 9 11 -1 4 -3 8 -5 12 A(2,1,2,5)=-1,-3,-5 A = 1 3 5 7 9 11 -1 -3 -3 8 -5 12 B=A(1,2,2,2,1,3,5 ) B = 1 5 9 -1 -3 -5 -1 -3 -5 -1 -3 -5 L=A mrdivideMatrix dimensions must agree. aA ans = 0.2000 0.8000 1.4000 0.4000 1.0000 1.6000 0.6000 1.2000 1.8000 说明:这里进行的不是数组运算,而是矩阵运算。总结:(1) 数组运算中,两个数组的加减乘除等都需要使用“.”运算;(2) 数组运算中,一个标量和一个数组的加减运算可以省略“.”运算;(3) 数组运算中,一个标量和一个数组的乘除运算不可以省略“.”运算,否则变成了矩阵运算。思考题:1 为了对班级50名同学的学年综合测评的智育成绩进行统计,假设共有Eng, PE, Phy,Chn, Mth五门课程,分别用5*10的数组表示,学号为k的同学(k=1:50)的课程成绩存储在五个数组中的第k个元素上,任何一门课程的成绩都在(60,100)之间均匀分布且为整数。五门课程的学分为credit= 3,5,4,2,4,请完成如下统计:(1) 统计各门课程的平均分,存入变量meanScore中,;(2) 统计班级学生的加权平均分;(3) 统计加权平均分为6069分的同学的数量,存入数组a;(4) 统计加权平均分为7079分的同学的数量,存入数组b;(5) 统计加权平均分为8089分的同学的数量,存入数组c;(6) 统计加权平均分为90分及以上的同学的数量,存入数组d;(7) 将如上四个分数段的同学的数量存入数组E中。Eng = round(60+(rand(5,10)*40) Eng = 98 90 85 76 62 68 61 77 94 80 69 78 92 97 74 68 90 94 61 88 84 61 97 97 93 84 78 81 87 77 79 93 90 76 60 71 97 68 75 72 96 78 67 96 66 68 79 87 93 68 PE = round(60+(rand(5,10)*40) PE = 68 88 80 86 89 88 92 99 65 86 87 75 96 74 72 82 98 71 60 71 72 94 93 72 94 78 81 70 96 79 82 94 86 74 83 88 95 95 68 63 66 84 93 81 75 85 67 89 72 100 Phy = round(60+(rand(5,10)*40) Phy = 83 69 68 83 77 99 69 76 87 68 77 83 75 92 72 100 86 90 69 84 81 90 91 62 95 92 73 71 94 85 73 81 87 84 61 78 98 78 85 75 77 86 78 62 91 80 89 97 65 83 Chn = round(60+(rand(5,10)*40) Chn = 78 75 84 62 63 87 65 70 69 68 62 87 61 75 78 88 78 95 70 94 61 64 61 85 78 89 89 69 62 67 73 61 68 89 74 79 96 92 63 67 61 84 83 88 66 82 71 96 86 100 Mth = round(60+(rand(5,10)*40) Mth = 78 84 97 86 65 87 77 78 72 82 74 65 71 99 93 74 94 78 62 76 73 62 66 87 77 67 80 76 88 68 75 78 95 95 96 66 93 96 86 85 76 95 70 60 89 68 78 60 99 89 credit = 3,5,4,2,4 credit = 3 5 4 2 4 credit(1) ans = 3 credit(1).*Eng ans = 294 270 255 228 186 204 183 231 282 240 207 234 276 291 222 204 270 282 183 264 252 183 291 291 279 252 234 243 261 231 237 279 270 228 180 213 291 204 225 216 288 234 201 288 198 204 237 261 279 204 credit(2).*PE ans = 340 440 400 430 445 440 460 495 325 430 435 375 480 370 360 410 490 355 300 355 360 470 465 360 470 390 405 350 480 395 410 470 430 370 415 440 475 475 340 315 330 420 465 405 375 425 335 445 360 500 Sum = credit(1).*Eng + credit(2).*PE + credit(3).*Phy+ credit(4).*Chn+credit(5).*Mth Sum = Columns 1 through 9 1434 1472 1483 1458 1325 1562 1357 1482 1381 1370 1375 1462 1575 1398 1486 1636 1499 1147 1350 1389 1506 1417 1593 1456 1429 1319 1593 1385 1507 1564 1492 1371 1387 1722 1559 1375 1352 1546 1424 1357 1425 1385 1382 1526 1467 Column 10 1406 1447 1372 1305 1592 sumCredit = sum(credit) sumCredit = 18 meanScore = round(Sum/sumCredit) meanScore = 80 82 82 81 74 87 75 82 77 78 76 76 81 88 78 83 91 83 64 80 75 77 84 79 89 81 79 73 89 76 77 84 87 83 76 77 96 87 76 73 75 86 79 75 79 77 77 85 82 88 B = meanScore B = 80 82 82 81 74 87 75 82 77 78 76 76 81 88 78 83 91 83 64 80 75 77 84 79 89 81 79 73 89 76 77 84 87 83 76 77 96 87 76 73 75 86 79 75 79 77 77 85 82 88 L6069 = meanScore70 L6069 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 a = sum(sum(L6069) a = 1 L7079 = 70=meanScore & meanScore80 L7079 = 0 0 0 0 1 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论