[农学]ch2数值数组及运算

上传人:汽*** 文档编号:568719880 上传时间:2024-07-26 格式:PPT 页数:79 大小:538.50KB
返回 下载 相关 举报
[农学]ch2数值数组及运算_第1页
第1页 / 共79页
[农学]ch2数值数组及运算_第2页
第2页 / 共79页
[农学]ch2数值数组及运算_第3页
第3页 / 共79页
[农学]ch2数值数组及运算_第4页
第4页 / 共79页
[农学]ch2数值数组及运算_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《[农学]ch2数值数组及运算》由会员分享,可在线阅读,更多相关《[农学]ch2数值数组及运算(79页珍藏版)》请在金锄头文库上搜索。

1、第二章第二章 数值数组及其运算数值数组及其运算 数值数组(Numeric Array)和数组运算(Array Operation)始终是MATLAB的核心内容。自MATLAB5x版突出了其“面向对象”的特征,这种数值数组(以下简称为数组)就成了MATLAB最重要的一种内建数据类型(Build-in Data Type),而数组运算就是定义在这种数据结构上的方法(Method)。 我们学过的C语言为面向过程的语言。其中语言基本上是命令式的,命令是某个程序段,执行这个程序段的目的是为了更新对象,命令执行的时序已在程序中预先做了规定,即语句顺序。这类语言还提供了顺序、循环和选择控制结构。在这种范型中

2、,程序设计的首要问题是设计过程。基于面向过程的程序设计范型和功能分解方法的软件设计技术形成了结构化软件开发方法的基础。 面向对象的程序设计即是以抽象数据类型为基础的。面向对象的程序设计范型就是在以面向过程的程序设计基础之上发展起来的,它的关键在于加入了类及其继承性,对象以类为样板被创建。这种范型将计算视为一个系统开发过程,系统由对象组成,对象经历一系列的状态变化以完成计算任务,在面向对象的程序设计范型中,首要的任务是决定所需要的类,每个类应设置足够的操作,并利用继承机制显式地共享共同的特性。C+12-1 引引 导导什么是数组?数组是指由一组实数或复数排成的长方阵列(Array)。什么是数组运算

3、?无无论论在在数数组组上上施施加加什什么么运运算算(加加减减乘乘除除或或函函数数), 总总 认认 定定 那那 种种 运运 算算 对对 数数 组组 中中 的的 每每 个个 元元 素素(Element)平等地实施操作。平等地实施操作。它可以是一维的“行”或“列”,可以是二维的“矩形”,也可以是三维的“若干同维矩形的堆叠”,甚至更高的任意维。2【例2.1-1】绘制函数 在 时的曲线。 x=0:0.1:1y=x.*exp(-x)plot(x,y),xlabel(x),ylabel(y),title(y=x*exp(-x) %定义自变量的采样点取值数组(长度为11的行数组)%计算各自变量在采样点上的函数

4、值。2.2 一维数组的创建和寻访一维数组的创建和寻访2.2.1 一维数组的创建一维数组的创建(1)逐个元素输入法逐个元素输入法x=2 pi/2 sqrt(3) 3+5i (2)冒号生成法冒号生成法x = a:inc:b通用格式:a是第一元素;b是最后一个元素;inc是步长,可省略,默认值为1。可正可负。可以是a、b间等分点也可以不是。a,inc,b之间必须用冒号“:”分隔。该冒号必须在英文状态下产生。3(3)定数线性采样法)定数线性采样法 通用格式:x = linspace(a,b,n)a、b分别是第一个和最后一个元素。n是采样点总数。x = linspace(0,1,2)例如:该指令生成(1

5、n)的数组,其作用与x = a:(b-a)/(n-1):b相同。42.2.1 一维数组的子数组寻访和赋值一维数组的子数组寻访和赋值【例2.2-1】子数组的寻访(Address)。 rand(state,0) x=rand(1,5) 把均匀分布伪随机发生器置为0状态产生(1x 5)的均匀分布随机数组,用help查阅。x(3) x(1 2 5) x(1:3) x(3:end) x(3:-1:1) x(find(x0.5) x(1 2 3 4 4 3 2 1) 寻访数组x的第三个元素寻访数组x的第一、二、五个元素组成的子数组寻访前三个元素组成的子数组寻访除前2个元素外的全部其他元素。由前三个元素倒排

6、构成的子数组 由大于0. 5的元素构成的子数组对元素可以重复寻访,使所得数组长度允许大于原数组5由以上:寻访什么样的子数组,取决于数组X(index)中下标index。【例2.2-2】子数组的赋值(Assign)。 x(3) = 0 x(1 4)=1 1 把上例中的第三个元素重新赋值为0.把当前x数组的第一 、四个元素都赋值为1。62.3 二维数组的创建二维数组的创建二维数组是由实数或复数排列成矩形而构成的 231 直接输入法直接输入法对于较小数组,从键盘上直接输入最简便。三三 要要 素:素:(1)整个输入数组必须以方括号“ ”为其首尾;(3)数组的行与行之间必须用分号“;”或回车键Enter

7、隔离;(2)数组元素必须由逗号“,”或空格分隔。7【例2.3-1】在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,b赋值这指令用于创建二维数组C【例2.3-2】复数数组的另一种输入方式。 M_r=1,2,3;4,5,6,M_i=11,12,13;14,15,16CN=M_r+i*M_i 由实部、虚部数组构成复数数组 说明分号“;”在“ ”方括号内时,它是数组行间的分隔符分号“;”用作为指令后的结束符时,将不在屏幕上显示该指令执行后的结果 说明

8、在“ ”方括号中,逗号“,”是元素间的分隔符。逗号“,”用于指令后时,该指令执行后的赋值结果将显示在屏幕上82.3.2 利用利用M文件创建和保存数组文件创建和保存数组 对于经常需要调用的数组,尤其是比较大而复杂的数组,为它专门建立一个M文件是方便的。下面通过一个简单例子来说明这种M文件的创建过程。【例2.3-3】创建和保存数组 AM的 MyMatrix.m 文件。 (1)打开文件编辑调试器,输入以下内容% MyMatrix.mCreation and preservation of matrix AMAM=101,102,103,104,105,106,107,108,109;. 201,20

9、2,203,204,205,206,207,208,209;. 301,302,303,304,305,306,307,308,309; (2)保存此文件,命名为MyMatrixm。 (3)以后只要在MATLAB指令窗中,运行MyMatrixm文件,数组AM就会自动生成于MATLAB内存中。924 二维数组元素的标识二维数组元素的标识二维或更高维数组中单个元素标识和寻访有三种方式:241 “全下标全下标”标识标识对于二维数组来说,“全下标”标识由两个下标组成:行下标,列下标。如A(3,5)就表示在二维数组A的“第3行第5列”的元素。优点:几何概念清楚,引述简单。因此最为常用。242 “单下标单

10、下标”标识标识“单下标(Linear Index)”标识就是只用一个下标来指明元素在数组中的位置。10数组元素一维编号的方法: 先设想把二维数组的所有列,按先左后右的次序、首尾相接排成“一维长列”;然后,自上往下对元素位置进行编号。MATLAB有两个指令可以实现“单下标”与“全下标”的转换关系:sub2ind 据全下标换算出单下标。ind2sub 据单下标换算出全下标。sub2ind(size(AM),2,3)i,j=ind2sub(size(AM),8)11243 “逻辑逻辑1”标识标识在实际使用中,常会遇到诸如寻找数组中所有大于(或小于)某值的元素的问题。此时,可用“逻辑1”标识法。【例2

11、.4-1】找出数组 中所有绝对值大于3的元素。 A=zeros(2,5);A(:)=-4:5L=abs(A)3islogical(L)X=A(L) 预生成一个(2x 5)全零数组 运用“全元素单下标”赋值法获得A产生与A同维的“01”逻辑值数组%判断L是否逻辑值数组。输出若为1,则是把L中逻辑值1对应的A元素取出L是逻辑数组,元素为0或1所谓“逻辑1”标识法是:通过与A同样大小的逻辑值数组L中“逻辑值1”所在的位置,指示A中元素的位置。1225 二维数组的子数组寻访和赋值二维数组的子数组寻访和赋值有了元素标识的知识,就容易理解和掌握二维数组的子数组寻访和赋值。现把常用的相关指令形式归纳成下表:

12、13【例2.5-1】不同赋值方式示例。 A=zeros(2,4) 创建(2x4)的全零数组A(:)=1:8 s=2 3 5;A(s)Sa=10 20 30A(s)=Sa 全元素赋值方式 产生单下标数组由“单下标行数组”寻访产生A元素组成的行数组 产生长度为3的“列数组”单下标方式赋值1426 执行数组运算的常用函数执行数组运算的常用函数261 数组运算规则的定义数组运算规则的定义设数组:数组运算规则为:15262 执行数组运算的常用函救执行数组运算的常用函救1617ceil fix floor rounda = -1.9, -0.2, 3.4, 5.6, 7, 2.4+3.6iceil(a)f

13、ix(a)floor(a)round(a)ceil round toward infinityfix round towards zerofloor round towards minus infinityround round towards nearst integerExamples18rem modRemainder after divisionSyntaxR = rem(X,Y)M=mod(X,Y)DescriptionR = rem(X,Y) returns X - fix(X./Y).*Y, where fix(X./Y) is the integer part of the q

14、uotient, X./Y.M = mod(X,Y) returns the remainder X - Y.*floor(X./Y) for nonzero Y. mod(5,2)rem(5,2)mod(-5,-2)rem(-5,-2)mod(-5,2)rem(-5,2)Examples19signSignum functionSyntaxY = sign(X)DescriptionY = sign(X) returns an array Y the same size as X, where each element of Y is:1 if the corresponding eleme

15、nt of X is greater than zero0 if the corresponding element of X equals zero-1 if the corresponding element of X is less than zeroFor nonzero complex X, sign(X) = X./abs(X).Examples(1)x=-2,2,-3,-5,0,0,2; sign(x)(2)sign(3-4*i)20cart2polTransform Cartesian coordinates to polar or cylindricalSyntaxTHETA

16、,RHO,Z = cart2pol(X,Y,Z)THETA,RHO = cart2pol(X,Y)DescriptionTHETA,RHO,Z = cart2pol(X,Y,Z) transforms three-dimensional Cartesian coordinates stored in corresponding elements of arrays X, Y, and Z, into cylindrical coordinates. THETA is a counterclockwise angular displacement in radians from the posi

17、tive x-axis, RHO is the distance from the origin to a point in the x-y plane, and Z is the height above the x-y plane. Arrays X, Y, and Z must be the same size (or any can be scalar).THETA,RHO = cart2pol(X,Y) transforms two-dimensional Cartesian coordinates stored in corresponding elements of arrays

18、 X and Y into polar coordinates.Example: theta,rho=cart2pol(1,1)21222.7 数组运算和矩阵运算数组运算和矩阵运算对于数组,MATLAB规定了两种运算,即数组运算和矩阵运算。数组运算数组运算:是两矩阵中对应元素之间的运算。如:If注意:数组运算中,两矩阵的行数和列数必须相等,否则MATLAB将会产生出错信息。then a+b=a.*b=一一 数组运算和矩阵运算的概念数组运算和矩阵运算的概念23数组运算也可在标量和数组之间运行,这时相当于把标量运算于数组的每个元素上。For example :矩阵运算矩阵运算:遵循线性代数运算法则

19、。For example, 注:a的列数必须与b的行数相等。Ifthen ifandthen24MATLAB中,为区别数组运算与矩阵运算,在运算符前加一.以表示数组运算。如“ .* ”。Table Common Array and Matrix OperationsOperation MATLABForm commentsArray Addition a+b Array addition and matrix addition are identicalArray Subtraction a-b Array subtraction and matrix subraction are ident

20、icalArray Multiplication a .* b Element-by-element multiplication of a and b.Both arrays must be the same shape , or one of them must be a scalar.Matrix Multiplication a * b Matrix multiplication of a and b.The number of columns in a must equal the number of rows in b .25Table Common Array and Matri

21、x OperationsOperation MATLABForm commentsArray Right Divesion a ./ b Element-by-element Array division of a and b :a(i,j)/b(i,j).Both arrays must be the same shape ,or one of them must be a scalar. Array Left Division a .b Element-by-element Array division of a and b ,but with b in the numerator: b(

22、i,j)/a(i,j). Both arrays must be the same shape ,or one of them must be a scalar.Matrix Right Division a / b Matrix division defined by a*inv(b),where inv(b) is the inverse of matrix b. Matrix Left Division a b Matrix division defined by inv(a)*b,where inv(a) is the inverse of matrix a. Array Expone

23、ntiation a . b Element-by-element exponentiation of a and b:a(i,j)b(i,j).Both arrays must be the same shape,or one of them must be a scalar.26数组运算矩阵运算指令含义指令含义A=s把标量s赋给A的每个元素s+B标量分别与B元素之和s-B,B-s标量分别与B的元素之差s.*A标量分别与B的元素之积s*A同数组运算s./B,B.s s分别被B的元素除s*inv(B) B阵的逆乘sA.nA的每个元素自乘n次An方阵A自乘n次A.p对A各元素分别求非整数幂Ap方

24、阵A的非整数乘方p.A以p为底,分别以A元素为指数求幂值。PA标量的矩阵乘方二二 数组运算和矩阵运算指令对照表数组运算和矩阵运算指令对照表标量与数组的运算对照表27数组运算矩阵运算指令含义指令含义A./非共轭转置。相当于conj(A/)A/共轭转置AB对应元素相加、减AB矩阵相加、减A.*B对应元素相乘A*B内维相同矩阵的乘积A./BA的元素被B的对应元素除A/BA右除BB.A同上BAA左除B(与右除不同)exp(A)以自然数e为底,分别以A的元素为指数求幂expm(A)A的矩阵指数函数log(A)对A的各元素求对数logm(A)A的矩阵对数函数sqrt(A)对A的各元素求平方根sqrtm(A

25、)A的矩阵平方根函数f(A)求A各个元素的函数值funm(A,FN)一般矩阵函数A#BA、B对应元素间的关系运算ABA、B对应元素间的逻辑运算矩阵间的运算对照表28数组运算矩阵运算指令含义指令含义A./非共轭转置。相当于求转置再共轭,conj(A/)A/共轭转置AB对应元素相加、减AB矩阵相加、减A.*B对应元素相乘A*B内维相同矩阵的乘积A./BA的元素被B的对应元素除A/BA右除BB.A同上BAA左除B(与右除不同)exp(A)以自然数e为底,分别以A的元素为指数求幂expm(A)A的矩阵指数函数log(A)对A的各元素求对数logm(A)A的矩阵对数函数sqrt(A)对A的各元素求平方根

26、sqrtm(A)A的矩阵平方根函数f(A)求A各个元素的函数值funm(A,FN)一般矩阵函数A#BA、B对应元素间的关系运算ABA、B对应元素间的逻辑运算矩阵间的运算对照表29 1 在带有运算符的运算中,如果这种运算符对数组运算和矩阵运算都有意义,以”.”表示数组运算.在函数运算指令中,不特别申明均指数组运算.矩阵运算的表示,常用的指令在数值运算指令后加字母”m”,一般矩阵函数表示为: Funm(A,FN).几点说明:几点说明: 2 编程时要注意数组运算和矩阵运算的区别,初学者容易混淆。一种情况是:用一种运算替代另一种运算会引起非法运算,MATLAB将给出出错信息。另一种情况,两种运算都是合

27、法的,用一种运算误代另一种运算,MATLAB会执行运算,但结果与实际不符。当矩阵是方阵时,第二种情况最容易发生。因为对于维数相同的两个方阵,数组运算和矩阵运算都是合法的,但是运算结果却大相径庭。这种情况需特别注意。30 3 矩阵左除运算有特殊的意义:如一个3 阶的线性方程组 因此左除运算,只用了一条指令便可求解一个线性方程组。可表示为: Ax=B则 : x = A-1 B = A B(左除的定义)31clear;A=zeros(2,3);A(:)=1:6;A=A*(1+i)A_A=A.A_M=A 【例 2.7-1】两种不同转置的比较 【例 】对矩阵A进行两种sin运算:A=rand(3);si

28、n(A)funm(A,sin)322.8 标准数组生成函数和数组操作函数标准数组生成函数和数组操作函数2.8.1 标准数组生成函数标准数组生成函数指令指令含含 义义zeros生成全0矩阵ones生成全1 矩阵eye生成单位矩阵(对高维数组不适用)diag提取或生成对角阵(对高维数组不适用)magic生成魔方矩阵(对高维数组不适用)rand生成均匀分布随机矩阵randn生成正态分布随机矩阵 生成数组或对数组初始化时,常用到一些标准数组生成函数。这些函数均为MATLAB的内建函数(Built-in Functions)33标准数组生成函数的使用方法:例如:c=1,2;3,4,d=zeros(siz

29、e(c)将产生与c同样大小的全零矩阵。同样地,ones( )函数产生全1 矩阵;eye( )函数产生单位矩阵。rand( ) ;randn( )产生随机矩阵;用法与zeros相同。zeros 函数能生成任意大小的全零矩阵。以全零数组生成函数zeros为例:若函数只有一个输入变量,将产生一个行列数与输入变量相同的方阵。例如a=zeros(2),将产生一个2阶方阵。若函数有两个输入变量,则第一个变量指明行数,第二个变量指明列数。例如b=zeros(2,3),将产生一个2行3列的全零矩阵。由于size ( )函数返回输入矩阵的行数和列数。因此它可以与zeros函数配合使用生成与另一个矩阵同维的全零矩

30、阵。34例:生成以下数组:35m1=1; m2=1; l=1; theta=pi/3;M=zeros(8);M(1,1)=m1;M(2,2)=m1;M(3,3)=m2;M(4,4)=m2;M(5,5)=1/12*m2*l2;M(6,1)=1;M(6,3)=-1;M(6,5)=l/2*cos(theta);M(7,4)=1;M(7,5)=-l/2*sin(theta);M(8,2)=1;M36Examples:D=eye(3)diag(D)diag(diag(D)magic(3)magic(4)diag函数magic函数372.8.2 数组操作函数数组操作函数指令含义A/矩阵的转置flipud交

31、换上下对称位置上的数组元素fliplr交换左右对称位置上的数组元素kron按Kronecker乘法规则产生“积”数组cat把大小相同的若干数组,沿指定维方向,串接成高维数组reshape在总元素不变的前提下,改变数组的“行数、列数”repmat按指定的行数、列数铺放模块数组,以形成更大的数组说明除repmat和reshape外,以上指令只适用于二维数组的操作 通过直接输入数组元素,或者通过标准数组生成函数可创建一个新的数组,此外也可以通过对已有数组的操作生成一个新的数组。38【例 2.8-2】reshape的使用演示。 a=-4:4A=reshape(a,3,3) 【例2.8-3】数组转置、对

32、称交换和旋转操作后果的对照比较。 A A. flipud(A) fliplr(A) 39【例2.8-4】演示Kronecker乘法不具备“可交换规律”。 B=eye(2)C=reshape(1:4,2,2)kron(B,C)kron(C,B)Kronecker乘积:若存在两个矩阵 和 ,则A与B矩阵的Kronecker乘积运算定义为:不要求任何意义下的维数匹配40catConcatenate arraysSyntaxC = cat(dim,A,B)C = cat(dim,A1,A2,A3,A4.)DescriptionC = cat(dim,A,B) concatenates the arra

33、ys A and B along dim.C = cat(dim,A1,A2,A3,A4,.) concatenates all the input arrays (A1, A2, A3, A4, and so on) along dim.cat(2,A,B) is the same as A,B and cat(1,A,B) is the same as A;B.第一维第二维4142repmatReplicate and tile an arraySyntaxB = repmat(A,m,n)B = repmat(A,m n)B = repmat(A,m n p.)repmat(A,m,n)

34、DescriptionB = repmat(A,m,n) creates a large matrix B consisting of an m-by-n tiling of copies of A. The statement repmat(A,n) creates an n-by-n tiling.B = repmat(A,m n) accomplishes the same result as repmat(A,m,n).B = repmat(eye(2),3,4)Examples:432.9 数组构作技法综合数组构作技法综合【例2.9-1】数组的扩展。 (1)数组的赋值扩展法A=res

35、hape(1:9,3,3)A(5,5)=111A(:,6)=222AA=A(:,1:6,1:6)B=ones(2,6)AB_r=A;BAB_c=A,B(:,1:5) 44【例2.9-2】单下标寻访和reshape指令演示。 clearA=reshape(1:16,2,8) reshape(A,4,4) s=1 3 6 8 9 11 14 16;A(s)=0 【例2.9-3】逻辑函数的运用示例。 randn(state,1),R=randn(3,6) L=abs(R)1.5R(L)=0s=(find(R=0) R(s)=111 ii,jj=find(R=111);disp(ii),disp(jj

36、)452.10 高维数组高维数组 除了标准的二维矩阵之外,MATLAB从5.0版本开始定义三维或多维数组。 对于二维数组有行,列两维之分。至于第三维称谓不很统一 ,有的称为“页”有的称之为“层”。 三维数组很好理解,假设有若干个维数相同的二维矩阵A1、A2、 An那么把这若干个矩阵一页一页地叠起来,就可以构成一个三维数组。三维数组的示意图如图所示。A1A2An第1 维第2 维第3维从这里讲46AnA1A2第1 维第2 维第3维 可以看成由“小方格”拼成的矩形面那样,三维数组可以被看成由“小方块”组成的“长方体”。对于三维数组来说,无论哪一“页”上的 “行,列”应该是同样大小的;无论哪一“行”上

37、“列、页”也应该是同样大小的;无论哪一“列”上的“行、页”也是同样大小的,否则,就不可能是长方体形的三维数组。47类似地,四维矩阵有四个指标,第四个指标不妨称之为块。每一块都有数目相同的若干三维矩阵。第五维不妨称之为堆中有若干块如此类推。482.10.1 高维数组的创建高维数组的创建 创建高维数组最常用的有四种方法,以下通过例子说明。【例2.10-1】“全下标”元素赋值方式创建高维数组。 A(2,2,2)=1 B(2,5,:)=1:3 【例2.10-2】低维数组合成高维数组。 clear,A=ones(2,3);A(:,:,2)=ones(2,3)*2;A(:,:,3)=ones(2,3)*3

38、 49【例2.10-3】由函数ones, zeros, rand, randn直接创建标准高维数组。rand(2,4,3) 【例2.10-4】借助cat, repmat, reshape等函数构作高维数组。 cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3) repmat(ones(2,3),1,1,3) ,矩阵由1*1*3个ones(2,3)构成构成reshape(1:12,2,2,3) ,把1*12的矩阵改成2*2*3的高阶矩阵reshpe重组时,元素放置遵循“单下标”编号规则:第一页第一列下接该页的第二列,下面再接第三列,依次类推。第一页的最后列下面接第二页

39、第一列,如此进行,直至结束。502.10.2 高维数组的标识高维数组的标识 指令ndims、size、length数组的维数、大小和长度。【例2.10-5】维数、大小和长度clear;A=reshape(1:24,2,3,4);dim_A=ndims(A)size_A=size(A)L_A=length(A) %给出各维的大小%给出所有维中最大的长度%给出总的维数51指令含义指令含义cat把大小相同的若干数组,沿指定维串接成高维数组randn产生正态分布随机数组flipdim以指定维的平分面翻转对称位置上的元素repmat按指定的行数、列数铺放模块数组,以形成更大数组impermute 广义反

40、转置,permute 反操作reshape在总元素不变的前提下,改变数组的行数、列数ones产生全1数组shiftdim数组的维序号左移重组permute广义非共轭转置squeeze撤消长度为1的孤维,使数组降维rand产生均匀分布随机数组zeros产生全0数组高维数组操作函数和标准数组生成函数表高维数组操作函数和标准数组生成函数表2.10.3 高维数组构作和操作函数汇总高维数组构作和操作函数汇总 52flipdimFlip array along a specified dimensionSyntaxB = flipdim(A,dim)DescriptionB = flipdim(A,dim

41、) returns A with dimension dim flipped.When the value of dim is 1, the array is flipped row-wise down. When dim is 2, the array is flipped columnwise left to right. flipdim(A,1) is the same as flipud(A), and flipdim(A,2) is the same as fliplr(A).Examplesflipdim(A,1) whereA = 1 4 2 5 3 6produces 3 6

42、2 5 1 453【例2.10-6】“孤维”的撤消和降维(squeeze指令)。B=cat(4,A(:,:,1),A(:,:,2),A(:,:,3) size(B) C=squeeze(B) size(C) 【例2.10-7】赋“空阵”值操作。 A=reshape(1:18,2,3,3) A(:,2:3,:)=B=A; size(A) A_1=squeeze(A) size(B) B(:,1,:)= A=reshape(1:18,2,3,3) 542.11 “非数非数”和和“空空”数组数组 2.11.1 非数非数NaN NaN的功用:(1)真实记述0/0,/,0等运算的结果;(2)避免可能因0

43、/0,/,0运算而造成程序执行的中断。(3)在数据可视化中,用来裁剪图形。根据数学规范,NaN具有以下性质:(1)NaN参与运算所得的结果依然是NaN,即具有传递性。(2)非数没有“大小”的概念,因此不能比较两个非数的大小。55【例2.11-1】非数的产生和性质演示。 a=0/0,b=0*log(0),c=inf-inf 0*a,sin(a) class(a)isnan(a) isnan(R)rand(state,0)R=rand(2,5);R(1,5)=NaN;R(2,3)=NaN 【例2.11-2】非数元素的寻访 Linear_index=find(isnan(R)r_index,c_in

44、dex=ind2sub(size(R),Linear_index);disp(r_index c_index),disp(r_index c_index) 56 2.12 .2 “空空”数组数组 空数组是MATLAB为操作和表述需要而专门设计的一种数组。它用一对方括号表示。 空数组主要功能: (1)删除矩阵的某行(列)改变矩阵的大小.(亦可用于高维数组).(2)元胞和构架数组的预先定维57 X = . 16.0 3.0 2.0 13.0 5.0 10.0 11.0 8.0 9.0 6.0 7.0 12.0 4.0 15.0 14.0 1.0 X(:,2) = 例例:X(2:2:10) = ,左

45、侧为单下标表示下的左侧为单下标表示下的X中某些的单个元素中某些的单个元素X(1,2) = %删除某单个元素时删除某单个元素时,给出错误信息给出错误信息X = 16 2 13 5 11 8 9 7 12 4 14 1注注:运用空数组可以改变数组的大小运用空数组可以改变数组的大小,但不能改变数组的维数,但不能改变数组的维数,如,如, X=reshape(1:24,2,3,4), X(:,:,:)=,ndims(X);58【例2.11-3】关于“空”数组的算例。 a=,b=ones(2,0),c=zeros(2,0),d=eye(2,0),f=rand(2,3,0,4) class(a)isnume

46、ric(a)isempty(a) which a ndims(a) A=reshape(-4:5,2,5) A(:,2,4)= 59 2.12 关系运算和逻辑运算关系运算和逻辑运算 matlab编程中,许多分支结构是通过一种运算结果或真(1)或假(0)的表达式进行控制的。 matlab中有两种类型的运算产生的结果为真/假结果。这就是关系运算和逻辑运算。MATLAB约定约定:(1)在关系表达式和逻辑表达式中,所有非零数值被认为为真,而零为假。因此 5 的结果为0;而 0 的结果为1。(2)所有关系表达式和逻辑表达式的计算结果即输出是一个由0和1组成的逻辑数组.此数组中,1表示真,0表示假.602

47、.12.1 关系运算关系运算 关系运算是指在两个操作数中产生真假结果的运算,真假结果取决于两个操作数的大小关系。格式为: a1 op a2其中a1和a2是表达式、变量或字符串,而op是下列表中的关系运算之一。操作符操作符定义定义= =等于=不等于大于=大于等于小于=b的运算结果为:62for example:Operation Result 34 0 4=4 1 AA 1aZ 1A B C Z a b c z字母的大小顺序:63关系运算也可在标量与数组之间进行。例如:关系运算同样可在两个矩阵之间进行,只要两个矩阵是同阶的。642 在运算的优先顺序上,关系运算在所有其它运算之后,如下列两个表达式

48、是相同的。1 特别注意:关系运算中相等是用两个等号“= =”;而赋值运算用一个等号“=”;都是“相等”,但本质上截然不同。“= =”是比较运算,返回一个逻辑运算结果;而“=”是将等号右侧表达式的值赋给等号左侧的变量。容易出错的是“=”去比较两个操作数。关系运算的几点说明:653 “= =”和“=”运算的注意事项:“= =”运算:当两个值相等时,返回值为“1”;不等时,为“0” “=”运算:当两个值不等时,返回值为“1”;相等时,为“0”以上两种运算在进行字符串比较时是没问题的,但当比较两个数值时,有时出现奇怪的结果。如:a=0;b=sin(pi);a = = b a b 在理论上是相等的,但M

49、ATLAB的实际运算结果是不相等的。问题的原因:MATLAB计算sin(pi)的结果是1.2246e-16.而PC机上的eps(epsilon)的值为1.2204e-16。66问题的解决:可根据需要,自己调整精度。如abs(a-b)1.0e-14【例2.12-1】关系运算示例。A=1:9,B=10-A,r0=(A4),r1=(A=B) % r0,r1赋值语句中,括号是为赋值语句中,括号是为A=1:9,B=10-A,r0=A,=,,=) (同一等级自左到右)3 逻辑“”运算4 逻辑“&”运算5 逻辑“|”运算括号可更改默认的运算顺序注意:MATLAB6之前,&和|属同一运算等级,运算中按自左至右

50、的顺序执行。从MATLAB6开始,&先于|执行。因此表达式“a|b&c”在MATLAB6之前和之后的版本中是不同的。为为安安全全起起见,最好根据需要用括号决定运算顺序。见,最好根据需要用括号决定运算顺序。73【例2.9-3】逻辑函数的运用示例。 R(L)=0 s=(find(R=0) R(s)=111 ii,jj=find(R=111);disp(ii),disp(jj) randn(state,1),R=randn(3,6) L=abs(R)1.574xorExclusive orSyntaxC = xor(A,B)DescriptionC = xor(A,B) performs an ex

51、clusive OR operation on the corresponding elements of arrays A and B. The resultingelement C(i,j,.) is logical true (1) if A(i,j,.) or B(i,j,.), but not both, is nonzero.A B CZero zero 0Zero nonzero 1Nonzero zero 1Nonzero nonzero 075ExamplesGiven A = 0 0 pi eps and B = 0 -2.4 0 1, thenC = xor(A,B)C

52、= 0 1 1 076【例2.12-4】逻辑操作应用之一:逐段解析函数的计算和表现。本例演示削顶整流正弦半波的计算和图形绘制。t=linspace(0,3*pi,500);y=sin(t); z1=(t2*pi).*y;w=(tpi/3&t7*pi/3&t5)L2=(A3)&(A7) 772.12.3 关系逻辑函数关系逻辑函数 除了关系运算和逻辑运算之外,MATLAB还提供了许多返回值为0或1的逻辑函数。逻辑函数当条件测试结果为真时返回值为1,当条件测试结果为假时返回值为0。逻辑函数与关系运算和逻辑运算一起,可控制分支和循环结构。逻辑函数举例:函数函数 含义含义ischar(a) 若a为字符串结果为1isempty(a) 若 为空结果为1isinf(a) a中无穷大元素的位置取1其余为0isnan(a) a中非数NaN元素的位置取1其余为0isnumeric(a) 若a为数值结果为1。7879

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号