1、第三章 数组及其运算数值仿真与MATLAB第三章 数组及其运算本章主要内容如下:3.1 概述3.2 数值数组的生成和寻访3.3 数组运算和矩阵运算3.4 数组的关系操作和逻辑操作3.5 字符串数组3.6 非数和空数组3.7 构架数组第三章 数组及其运算数值仿真与MATLAB3.1 概述n MATLAB长于数值计算,而所谓数值计算,就是指计算的表达式、变量中不得包含未经定义的自由变量。n 数值数组(Numeral Array)和数组运算(Array Operations)是MATLAB的核心内容。数组是MATLAB最重要的一种内建数据类型,而数组运算则是定义在这种数据结构上的方法。本章重点介绍数
2、值数组,其次是与数组类似其它结构体。n 数组:数组:是指由一组实数或复数排成的长方阵列(Array),包括行向量、列向量和矩阵。n 数组的运算数组的运算:无论对数组施加什么运算(加减乘除或函数)总认定那种运算对被运算数组中的每个元素平等地实施同样的操作。第三章 数组及其运算数值仿真与MATLAB3.1 概述n 变量及其赋值n 在命令窗口可直接输入变量并赋值,无须声明其类型和维数,MATLAB将自动处理。n MATLAB 的变量名称由英文大小写52个字母、数字和下划线等符号组成,并且第一个字符必须是英文字母,变量和常量最长允许31个字符。须注意的是,在默认状态下,MATLAB对字母大小写敏感。第
3、三章 数组及其运算数值仿真与MATLAB3.1 概述n MATLAB数据格式及显示方式n MATLAB既可用传统的十进制数表达数值,也可以用科学计数表达数值,用e代表10的指数形式,用i和j来代表虚数。n MATLAB内部数据格式只有一种,是IEEE浮点标准的双精度二进制(64位),相应于十进制的16位有效数,范围为10-308 10+308。n 为了人机交互的友好性,数据输出显示格式有8种。可用菜单选项或format命令选择。第三章 数组及其运算数值仿真与MATLAB3.2 数值数组的生成和寻访3.2.1 一维数组1.一维数组的创建a)逐个元素输入法 借助数组编辑器可以逐个输入数组元素(对于
4、二维数组同样适用),但也可在指令窗中直接输入。例如在指令窗中输入(数组元素之间用“”或“,”隔开):x=2 pi/3 sqrt(3)3+5i 则将显示:x=2.0000 1.0472 1.7321 3.0000+5.0000ib)冒号生成法 这是一维数组生成的常用方法,其通用格式为 x=a:inc:b其中a、b分别为 数组起始值和终值,inc为步长。第三章 数组及其运算数值仿真与MATLAB3.2 数值数组的生成和寻访3.2.1 一维数组1.一维数组的创建c)定数线性采样法n 该方法在设定的“总点数”下,均匀采样生成一维“行”数组。其通用格式为:x=linspace(a,b,n)n【说明】a、
5、b分别是生成数组的第一个和最后一个元素,n是采样总点数。该指令与 x=a:(b-a)/(n-1):b 相同。d)此外还可通过数组运算或数组生成函数,构建某些特殊的数组。第三章 数组及其运算数值仿真与MATLAB【例】一维数组的冒号生成法和定数线性采样法。x=(0:pi/10:pi)x=Columns 1 through 6 0 0.3142 0.6283 0.9425 1.2566 1.5708 Columns 7 through 11 1.8850 2.1991 2.5133 2.8274 3.1416 y=linspace(0,pi,11)y=Columns 1 through 6 0 0
6、.3142 0.6283 0.9425 1.2566 1.5708 Columns 7 through 11 1.8850 2.1991 2.5133 2.8274 3.1416%冒号法生成一维数组%定数(0,)线性采样法生成(111)数组显然这两种方法生成的一维数组是完全相同的。第三章 数组及其运算数值仿真与MATLAB3.2.1一维数组2.一维数组的寻访n数组寻访的一般格式为X(index),下标index可以是单个正整数或正整数数组。例如对数组作如下操作:x=2.0000 1.0472 1.7321 3.0000+5.0000i x(3)ans=1.7321 x(1 2 4)ans=2.
7、0000 1.0472 3.0000+5.0000i x(2:end)ans=1.0472 1.7321 3.0000+5.0000i x(4:-1:1)ans=3.0000+5.0000i 1.7321 1.0472 2.0000下标为由 构成的数组下标为由冒号生成法构成的数组取单个数组元素第三章 数组及其运算数值仿真与MATLAB3.2.2 二维数组1.二维数组的创建a)直接输入法n整个输入数组须以“”为其首尾;n数组行与行之间用“;”或“回车键”隔离;n数组元素用逗号或空格分离。例如要输入二维数组987654321A则在指令窗中的操作如右图所示。其中,第一个矩阵输入采用“;”分行,第二个
8、矩阵输入采用“回车键”分行。A=1 2 3;4 5 6;7 8 9A=1 2 3 4 5 6 7 8 9 A=1,2,34,5,67,8,9A=1 2 3 4 5 6 7 8 9第三章 数组及其运算数值仿真与MATLAB3.2.2 二维数组1.二维数组的创建b)利用M文件创建和保存数组 对于经常需要调用的且比较大的数组,可专门为该数组创建一个M文件。利用文件编辑器输入该数组并保存,以后只要在MATLAB指令窗中,运行该文件,文件中的数组就会自动生成于MATLAB内存中。c)标准数组生成函数指 令含 义指 令含 义diag产生对角形数组(二维以下)rand产生均匀分布随机数组eye产生单位数组(
9、二维以下)randn产生正态分布随机数组magic 产生魔方数组(二维以下)zeros产生全0数组ones产生全1数组第三章 数组及其运算数值仿真与MATLAB d=eye(5)%产生(产生(5*5)的单位阵)的单位阵d=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 a=3*ones(4,5)%产生产生4行行5列全列全3数组数组a=3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 b=diag(a)%取取a 阵对角元阵对角元b=3 3 3 3 c=diag(b)%生成对角元为数组生成对角元为数组b 对对 角阵角
10、阵(与与diag(3,3,3,3)效果相同)效果相同)c=3 0 0 0 0 3 0 0 0 0 3 0 0 0 0 3 zeros(5,6)%生成生成5行行6列的全列的全0阵阵ans=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第三章 数组及其运算数值仿真与MATLAB3.2.2 二维数组2.二维数组的寻访和赋值a)全元素标识和赋值n这是一种最常用的标识方式,对于二维数组来说,“全下标”标识由两个下标组成:行下标,列下标。如A(3,5)等。b)单下标标识和赋值n这是只用一个下标来指明元素在数组中的位置。对二维数组采用“
11、单下标”标识,应先对数组的所有元素进行“一维编号”,即先设想把二维数组的所有列按先左后右的次序,首尾相接排成“一维长列”;然后自上往下对元素位置进行编号。a=zeros(2,5)a=0 0 0 0 0 0 0 0 0 0(生成2行5列0数组)a(:)=-4:5a=-4 -2 0 2 4 -3 -1 1 3 5(对A进行单下标全元素赋值)第三章 数组及其运算数值仿真与MATLAB3.2.2 二维数组2.二维数组的寻访和赋值c)利用MATLAB的冒号运算,可方便地进行数组(矩阵)的子数组(子矩阵)的寻访和赋值。冒号表达式:冒号表达式:s1:s2:s3 式中,s1:起始值;s2:步长(省略为1);s
12、3:终止值。例如:A(:,j):表示A矩阵第j列全部元素 A(i,:):表示A矩阵第i行全部元素 A(1:3,2:4):表示对A矩阵取第一到第三行,第二到第四列中所有元素构成的子矩阵。s=1 3 5;a(s)=10:10:30a=10 20 30 2 4 -3 -1 1 3 5(对A进行单下标行数组元素赋值)back第三章 数组及其运算数值仿真与MATLAB3.3.1 数组运算的常用函数1.函数数组的运算规则n 对于(mn)数组X=xijmn,函数f()的数组运算规则是指:f(X)=f(xij)mn3.3 数组运算和矩阵运算 例如对(33)数组A进行2次乘方运算A2,只需对数组中每个元素进行乘
13、方运算aij2即可,如右图所示。A=1 2 3;4 5 6;7 8 9A=1 2 3 4 5 6 7 8 9 A.2ans=1 4 9 16 25 36 49 64 81第三章 数组及其运算数值仿真与MATLAB3.3.1 数组运算的常用函数2.常用函数3.3 数组运算和矩阵运算名称含义名称含 义名称含 义sin正弦log2以2为底的对数 real复数实部cos余弦pow22的幂sign符号函数tan正切log自然对数rem求余数asin反正弦 log10常用对数mod模除求余acos反余弦 angle相角(弧度)sqrt平方根atan反正切 conj复数共轭abs模或绝对值exp指数imag
14、复数虚部第三章 数组及其运算数值仿真与MATLAB mod(A,2)ans=1 0 1 0 1 0 1 0 1例如对数组987654321A log(A)ans=0 0.6931 1.0986 1.3863 1.6094 1.7918 1.9459 2.0794 2.1972 exp(A)ans=1.0e+003*0.0027 0.0074 0.0201 0.0546 0.1484 0.4034 1.0966 2.9810 8.1031 sign(A)ans=1 1 1 1 1 1 1 1 1 real(A)ans=1 2 3 4 5 6 7 8 9 angle(A)ans=0 0 0 0 0
15、 0 0 0 0第三章 数组及其运算数值仿真与MATLAB3.3.2 矩阵运算n矩阵运算不同于数组运算,要符合矩阵运算的规则数组运算矩阵运算指令含义指令含义A.非共轭转置A共轭转置A=s把标量s赋给A的每个元素s+B标量s分别与B元素之和s.*A标量s分别与A元素之积s*A标量s分别与A元素之积A.nA的每个元素自乘n次AnA阵为方阵时,自乘n次A+B对应元素相加A+B矩阵相加A.*B对应元素相乘A*B内维相同矩阵的乘积A./BA的元素被B的对应元素除A/BA右除Blog(A)对A的各元素求对数Logm(A)A的矩阵对数函数第三章 数组及其运算数值仿真与MATLABC=-4.0000+1.00
16、00i -3.0000+3.0000i -2.0000+2.0000i -1.0000+3.0000i 0+2.0000i 1.0000+5.0000i 2.0000+2.0000i 3.0000+5.0000i 4.0000+7.0000ians=-4.0000+1.0000i -1.0000+3.0000i 2.0000+2.0000i -3.0000+3.0000i 0+2.0000i 3.0000+5.0000i -2.0000+2.0000i 1.0000+5.0000i 4.0000+7.0000ians=-4.0000-1.0000i -1.0000-3.0000i 2.0000
17、-2.0000i -3.0000-3.0000i 0-2.0000i 3.0000-5.0000i -2.0000-2.0000i 1.0000-5.0000i 4.0000-7.0000iC=A+B*iC.C%例二维数组、矩阵运算A=-4,-3,-2;-1,0,1;2,3,4;B=1,3,2;3,2,5;2,5,7;C=A+B*i%生成复数数组C.,C%非共轭转置和共轭转置第三章 数组及其运算数值仿真与MATLABA./B,A/B%数组、矩阵右除B.A,BA%数组、矩阵左除A.*B,A*B%数组乘和矩阵乘ans=-4.0000 -1.0000 -1.0000 -0.3333 0 0.2000
18、 1.0000 0.6000 0.5714ans=-2.5000 -1.5000 1.5000 -1.0000 -0.5455 0.8182 0.5000 0.4091 0.1364ans=-4.0000 -1.0000 -1.0000 -0.3333 0 0.2000 1.0000 0.6000 0.5714ans=-3.5000 -3.0000 -2.5000 -1.9545 -1.6364 -1.3182 2.6818 2.4545 2.2273A./BA/BB.ABAans=-4 -9 -4 -3 0 5 4 15 28ans=-17 -28 -37 1 2 5 19 32 47,A.
19、*BA*BA=-4,-3,-2;-1,0,1;2,3,4;B=1,3,2;3,2,5;2,5,7;back第三章 数组及其运算数值仿真与MATLAB 在程序流控制和逻辑、模糊推理中,都需要对一类是非问题作出“是真”、“是假”的判断。为此,MATLAB设计了关系操作、逻辑操作和一些相关函数。虽在其它程序语言中也有类似的关系、逻辑运算,但MATLAB作为一种比较完善的科学计算环境,有其自身的特点。MATLAB约定:1)在所有关系、逻辑表达式中,作为输入的任何非0数都被看成是“逻辑真”,只有0被认为是“逻辑假”。2)所有关系表达式和逻辑表达式的计算结果,即输出,是一个由0和1组成的“逻辑数组”(Lo
20、gical Array)。在此数组中的1表示“真”,0表示“假”。3)逻辑数组是一种特殊的数值数组,与“数值类”有关的操作和函数对它也同样适用;但它又不同于普通的“数值”,它还表示着对事物的判断结论“真”与“假”。因此它又有其自身的特殊用途,如数组寻访等。3.4 数组的关系操作和逻辑操作第三章 数组及其运算数值仿真与MATLAB3.4.1 关系操作n 关系操作指令3.4 关系操作和逻辑操作指令含义指令含义=大于等于大于=不等于【说明】1)标量与数组比较 比较在此标量和数组每个元素之间进行,比较结果与被比较数组同维。2)数组与数组比较 两数组的维数必须相同,比较在两数组相同位置上的元素间进行,比
21、较结果与被比数组同维。第三章 数组及其运算数值仿真与MATLAB关系运算示例:A=1:9,B=10-A,r0=(AB)A=1 2 3 4 5 6 7 8 9B=9 8 7 6 5 4 3 2 1r0=1 1 1 0 0 0 0 0 0r1=0 0 0 0 1 0 0 0 0r2=0 0 0 0 0 1 1 1 1第三章 数组及其运算数值仿真与MATLAB3.4.2 逻辑操作n 逻辑操作指令3.4 关系操作和逻辑操作指令含义指令含义指令含义&与、和|或否、非【说明】1)标量与数组逻辑运算 运算在标量与数组每个元素之间进行,结果与数组同维。2)数组与数组逻辑运算 参与运算的数组必须同维,运算在两数
22、组相同位置上的元素间进行,运算结果与数组同维。第三章 数组及其运算数值仿真与MATLAB逻辑操作示例1:A=1:9,B=10-A,r0=(AB)&(AB)|(A3)A=1 2 3 4 5 6 7 8 9B=9 8 7 6 5 4 3 2 1r0=0 0 0 1 1 1 1 1 1判断A中不小于4的元素r1=0 0 0 0 0 1 1 0 0判断A中小于8又比B大的元素r2=1 1 0 0 0 1 1 1 1判断A中小于3或比B大的元素第三章 数组及其运算数值仿真与MATLAB%逻辑操作示例2:逐段解析函数的计算和表现t=linspace(0,3*pi,500);y=sin(t);%产生正弦波z
23、1=(t2*pi).*y;%获得整流半波w=(tpi/3&t7*pi/3&t a=an universitya=an university第三章 数组及其运算数值仿真与MATLAB3.5.1 字符串数组创建与操作2)串数组的大小 串数组中每个字符(包括空格和标点)都占据一个元素位,上面输入的数组a的大小可用下面指令获得:size(a)ans=1 13表示这是一个113的数组。3)串数组的元素标识在一维串数组中,MATLAB按自左至右的次序标识字符的位置,如:b=a(end:-1:1)b=ytisrevinu na第三章 数组及其运算数值仿真与MATLAB3.5.1 字符串数组创建与操作4)中文
24、字符串数组 在中文字符串数组中,每个字符也占一个元素位置,如串数组中每个字符(包括空格和标点)都占据一个元素位,上面输入的数组a的大小可用下面指令获得:A=武汉科技大学,size(A)A=武汉科技大学ans=1 65)由小串构成长串 B=A,机械自动化学院B=武汉科技大学 机械自动化学院第三章 数组及其运算数值仿真与MATLAB3.5.1 字符串数组创建与操作6)多行串数组的创建n直接创建 多行串数组的直接创建时,要保证同一串数组的各行字符数要相等:n利用串操作函数创建串操作函数按最长行设置每行长度,其它行的尾部用空格填充:AB=A,;机械自动化学院,size(AB)AB=武汉科技大学 机械自
25、动化学院ans=2 7 AC=char(A,机械自动化学院),size(AC)AC=武汉科技大学 机械自动化学院ans=2 7第三章 数组及其运算数值仿真与MATLAB3.5.2 串操作函数指令含义指令含义blanks(n)创建n个空格串lower(s)使s里英文字母全部小写deblank(s)删去串尾部的空格符strcat(s1,s2,)把串s1、s2等连接成长串eval(s)把串s当作MATLAB指令运行strncomp(s1,s2,n)若串s1、s2的前n个字符相同,则判“真”给出逻辑1ischar(s)s是字符串,则判“真”给出逻辑1strcomp(s1,s2)若串s1、s2相同,则判
26、“真”给出逻辑1isspace(s)以逻辑1指示s里空格符的位置strrep(s1,s2,s3)串s1中所有出现s2的地方替换为s3isletter(s)以逻辑1指示s里文字符的位置upper(s)使s里英文字母全部大写 a=this is a,b=example;isletter(a)ans=1 1 1 1 0 1 1 0 1以逻辑1指示a里文字符的位置 upper(b)ans=EXAMPLE使b里英文字母全部大写第三章 数组及其运算数值仿真与MATLAB3.5.3 串转换函数指 令含 义指 令含 义abs把串翻译成ASCII码int2str把整数转换为串bin2dec 二进制串转换成十进制
27、整数 num2str把数值转换为串charASCII码及其它非数值类数据转换成字符串setstr把ASCII码翻译成串double把任何类数据转换成双精度数值str2num把串转换为数值%例串转换函数示例a=rand(2,2),b=examplec=abs(b)d=char(c)e=num2str(a),size(e)c=101 120 97 109 112 108 101字符串b转换成ASCII码d=exampleASCII码转换成字符串e=0.9218 0.1762 0.7382 0.4057ans=2 18数组a转换成字符串back第三章 数组及其运算数值仿真与MATLAB3.6.1 非
28、数NANn 非数(Not a Number)指的是 0/0,/,0 之类的运算,在MATLAB中用NaN或nan表示。n NaN具有以下性质:a)NaN参与运算所得的结果也是NaN,即具有传递性;b)非数没有大小的概念,不能比较两个非数的大小。n 非数的功用:a)真实表示0/0,/,0 运算的结果;b)避免因这类异常运算而造成程序中断;c)在数据可视化中,用来裁减图形。3.6 “非数”和“空”数组第三章 数组及其运算数值仿真与MATLABWarning:Divide by zero.a=NaNWarning:Log of zero.n=NaNc=NaNd=NaN【例】非数的产生和性质演示非数具
29、有传递性 a=0/0,n=0*log(0),c=inf/inf,d=sin(a)【说明】inf 在MATLAB中表示第三章 数组及其运算数值仿真与MATLAB【例】非数的产生和处理:求近似极限,修补图形缺口t=-2*pi:pi/10:2*pi;%该自变量数组中存在零值y=sin(t)./t;%在t=0处,计算将产生NaNtt=t+(t=0)*eps;%逻辑数组参与运算,用“机器零”代替0元素yy=sin(tt)./tt;%用数值可算的sin(eps)/eps近似替代sin(0)/0subplot(1,2,1),plot(t,y),axis(-7,7,-0.5,1.2),xlabel(t),yl
30、abel(y),title(残缺图形)subplot(1,2,2),plot(tt,yy),axis(-7,7,-0.5,1.2)xlabel(t),ylabel(yy),title(正确图形)Warning:Divide by zero.第三章 数组及其运算数值仿真与MATLAB3.6.2“空”数组 在MATLAB中,“空”数组除了用 表示外,某维或若干维长度均为0的数组都是“空”数组。%例空数组示例a=,b=ones(0,2),c=zeros(3,0)%创建空数组A=reshape(-4:5,2,5)%生成(2*5)数组A(:,1,3)=%利用空数组进行数组裁减 a=b=Empty mat
31、rix:0-by-2c=Empty matrix:3-by-0A=-4 -2 0 2 4 -3 -1 1 3 5A=-2 2 4 -1 3 5【说明】reshape(Q,m,n)为生成mn数组,且数组元素由Q按列展开。back第三章 数组及其运算数值仿真与MATLAB3.7 构架数组n 构架数组的基本元素是构架,且每个构架是平等的,它们以下标区分。例如设A为(33)构架数组,则A(3,2)表示其中的第八个构架。n 构架必须在划分“域”后才能使用,数据只能存放在域中,如B.p表示构架数组B的域p。构架的域可以存放任何类型,任何大小的数组,而且不同构架的同名域中存放的内容可以不同。n 通常在指令窗
32、键入构架名时只能显示该构架的结构,而不显示该构架域中的具体内容,除非该构架域中的内容是极为简单的数值变量或单行字符串。第三章 数组及其运算数值仿真与MATLAB【例】用下面的语句可以建立一个小型的数据库。student_rec.number=1;student_rec.name=Alan Shearer;student_rec.height=180;student_rec.test=100,80,75;77,60,92;67,28,90;100,89,78;student_rec%显示构架 student_rec.test%显示构架的域test内容 这是一个单构架,共有4个域。执行以上程序后,
33、指令窗中将分别显示构架结构和构架的域test内容:student_rec=number:1 name:Alan Shearer height:180 test:4x3 doubleans=100 80 75 77 60 92 67 28 90 100 89 78 第三章 数组及其运算数值仿真与MATLAB练习1.命令窗口中,键入:demo,出现MATLAB的demo演示窗口,然后选择:MATLAB下的Matrices,依次选取其中的Basic Matrix operation、Matrix manipulation两个示例,进行MATLAB矩阵运算的学习。2.教材3738页:1*、2*、3、4*、5*、7题。(*号题为必做题)