1第2章MATLAB数据及其运算2.1数据类型2.2矩阵描述2.3数据运算2.4字符串2.5单元数组2.6结构型变量矩阵是MATLAB最基本、最重要的数据对象,大部分运算或命令都是在矩阵运算的意义下执行的。向量和单个数据都可以作为矩阵的特例来处理。常量和变量浮点数和复数字符串数组结构体(Structure)和单元(Cell)数据类型。逻辑型数据。在MATLAB中,以数值1(非零)表示“真”,以数值0表示“假”。2.1MATLAB数据类型2.1.1常量在MATLAB中有一些特定的变量,已经被预定义了某个特定的值,这些变量被称为常量。MATLAB7中的常量主要有pi、inf和eps等。在使用时,应尽量避免对这些变量重新赋值。常量常量的功能常量常量的功能ans用作结果的默认变量名nargin函数的输入参数个数beep使计算机发出“嘟嘟”声nargout函数的输出参数个数pi圆周率varagin可变的函数输入参数个数eps浮点数相对误差varagout可变的函数输出参数个数inf无穷大realmin最小的正浮点数NaN或nan不定数realmax最大的正浮点数i或j复数单位bitmax最大的正整数2.1.2变量变量是MATLAB7的基本元素之一,MATLAB7语言不要求对所使用的变量进行事先说明,而且无需指定变量的类型,系统会根据该变量被赋予的值或对该变量所进行的操作来自动确定变量的类型。变量名是以字母开头,后接字母、数字或下划线的字符序列,但不允许出现标点符号,最多63个字符变量名区分大小写数据类型表示范围类型转换函数无符号8位整数uint80~28-1uint8()无符号16位整数uint160~216-1uint16()无符号32位整数uint320~232-1uint32()无符号64位整数uint640~264-1uint64()有符号8位整数int82-7~27-1int8()有符号16位整数int162-15~215-1int16()有符号32位整数int322-31~231-1int32()有符号64位整数int642-63~263-1int64()2.1.3浮点数几乎在所有的情况下,MATLAB7的数据都是以双精度数值来表示的,这些双精度数在系统内部用二进制来表示。有很多实数不能被精确地表示,对能够表示的值也有一个限制,并且还存在一个浮点相对误差限所谓相对误差限是指MATLAB7语言能够区分两个不同大小的数时,这两个数之间的最小差值。数据类型存储空间表示范围类型转换函数单精度型single4字节-3.40282×1038~+3.40282×1038single()双精度型double8字节-1.79769×10308~+1.79769×10308double()浮点数举例例2-1下边3个式子的计算结果是相同的,但是由于这些数字都是使用二进制存储的,在使用双精度数来表达这些数时,往往就会出现一些误差a=0.33-0.5+0.17a=2.7756e-017b=0.33+0.17-0.5b=0c=0.17-0.5+0.33c=5.5511e-0172.1.4复数MATLAB7语言对复数的处理也是十分简便的,在处理复数问题时,不需要进行其他任何的附加操作。a2=pi+3.14ja2=3.1416+3.1400ib=4*(1+3/sqrt(-1))b=4.0000-12.0000i复数举例a=1+2*ia=1.0000+2.0000ib=3-4ib=3.0000-4.0000ic=pi+sin(pi/2)*ic=3.1416+1.0000id=a+bd=4.0000-2.0000i2.2矩阵描述将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔。A=[123;456;789];C=[A,eye(size(A));ones(size(A)),A]123100456010789001111123111456111789冒号表达式冒号表达式可以产生一个行向量,一般格式是:e1:e2:e3其中:e1为初始值,e2为步长,e3为终止值。在MATLAB中,还可以用linspace函数产生行向量。其调用格式为:linspace(a,b,n)其中a和b是生成向量的第一个和最后一个元素,n是元素总数。显然,linspace(a,b,n)与a:(b-a)/(n-1):b等价。矩阵的表示通过下标引用矩阵的元素,例如:A(3,2)=200采用矩阵元素的序号来引用矩阵元素。矩阵元素的序号就是相应元素在内存中的排列顺序。在MATLAB中,矩阵元素按列存储,先第一列,再第二列,依次类推。例如:A=[1,2,3;4,5,6];A(3)ans=2矩阵元素序号(Index)与下标(Subscript)是一一对应的,以m×n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i。其相互转换关系也可利用sub2ind和ind2sub函数求得。(1)利用冒号表达式获得子矩阵①A(:,j)表示取A矩阵的第j列全部元素;A(i,:)表示A矩阵第i行的全部元素;A(i,j)表示取A矩阵第i行、第j列的元素。②A(i:i+m,:)表示取A矩阵第i~i+m行的全部元素;A(:,k:k+m)表示取A矩阵第k~k+m列的全部元素,A(i:i+m,k:k+m)表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素。矩阵的拆分矩阵的拆分(2)利用空矩阵删除矩阵的元素在MATLAB中,定义[]为空矩阵。给变量X赋空矩阵的语句为X=[]。注意,X=[]与clearX不同,clear是将X从工作空间中删除,而空矩阵则存在于工作空间中,只是维数为0。1.基本算术运算MATLAB的基本算术运算有:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)。3/5=0.60003\5=1.66672.点运算在MATLAB中,有一种特殊的运算,因为其运算符是在有关算术运算符前面加点,所以叫点运算。点运算符有.*、./、.\和.^。两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵的维参数相同。2.3数据运算3.关系运算6种关系运算符:(小于)、=(小于或等于)、(大于)、=(大于或等于)、==(等于)、~=(不等于)。两个维数相同的矩阵比较,是对两矩阵相同位置的元素按标量关系运算规则逐个进行,运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。标量与矩阵比较时,把标量与矩阵的每一个元素按标量关系运算规则逐个比较,运算的结果是一个维数与原矩阵相同的矩阵,它的元素由0或1组成。4.逻辑运算&(与)、|(或)和~(非)。在算术、关系、逻辑运算中,算术运算优先级最高,逻辑运算优先级最低。5.MATLAB常用数学函数数学函数使用说明:(1)三角函数以弧度为单位计算。(2)abs函数可以求实数的绝对值、复数的模、字符串的ASCII码值。(3)用于取整的函数有fix、floor、ceil、round(4)求余的函数rem与mod函数。rem(x,y)和mod(x,y)要求x,y必须为相同大小的实矩阵或标量。mod(23,-3)=-1,rem(23,-3)=2mod(23,3)=rem(23,3)=2例2-2建立5阶方阵A,判断A的元素是否能被3整除。A=[24,35,13,22,63;23,39,47,80,80;...90,41,80,29,10;45,57,85,62,21;37,19,31,88,76]P=rem(A,3)==0其中,rem(A,3)是矩阵A的每个元素除以3的余数矩阵。此时,0被扩展为与A同维数的零矩阵,P是进行等于(==)比较的结果矩阵。例2-3在[0,3π]区间,求y=sin(x)的值。要求:(1)消去负半波,即(π,2π)区间内的函数值置0。(2)(π/3,2π/3)和(7π/3,8π/3)区间内取值均为sinπ/3。先根据自变量向量x产生函数值向量y,然后按要求对y进行处理。处理的思路有两个:一是从自变量着手进行处理,二是从函数值着手进行处理。方法1:x=0:pi/100:3*pi;y=sin(x);y1=(xpi|x2*pi).*y;%消去负半波q=(xpi/3&x2*pi/3)|(x7*pi/3&x8*pi/3);qn=~q;y2=q*sin(pi/3)+qn.*y1;%按要求处理第(2)步方法2:x=0:pi/100:3*pi;y=sin(x);y1=(y=0).*y;%消去负半波p=sin(pi/3);y2=(y=p).*p+(yp).*y1;例2-4建立矩阵A,然后找出在[10,20]区间的元素的位置。(1)建立矩阵A。A=[4,15,-45,10,6;56,0,17,-45,0](2)找出在区间[10,20]的元素的位置。find(A=10&A=20)A=415-4510656017-450ans=3672.4字符串字符串是用单撇号括起来的字符序列。MATLAB将字符串当作一个行向量,每个元素对应一个字符,其标识方法和数值向量相同。也可以建立多行字符串矩阵。字符串是以ASCII码形式存储的。abs和double函数都可以用来获取字符串矩阵所对应的ASCII码数值矩阵。相反,char函数可以把ASCII码矩阵转换为字符串矩阵。例2-5建立一个字符串向量,然后对该向量做如下处理:(1)取第1~5个字符组成的子字符串。(2)将字符串倒过来重新排列。(3)将字符串中的小写字母变成相应的大写字母,其余字符不变。(4)统计字符串中小写字母的个数。命令如下:ch=‘ABc123d4e56Fg9’;subch=ch(1:5)%取子字符串revch=ch(end:-1:1)%将字符串倒排k=find(ch=‘a’&ch=‘z’);%找小写字母的位置ch(k)=ch(k)-(‘a’-‘A’);%将小写字母变成大写字母char(ch)length(k)%统计小写字母的个数A的ASCII码:65或41H;a的ASCII码:97或61H小写字母比大写字母的ASCII码大322.4.1字符串的操作字符串元素的读取利用数组操作工具进行读取使用disp函数显示字符串str='今天,是2005年10月25日,我们班一起去上海旅游。'str=今天,是2005年10月25日,我们班一起去上海旅游。str(6)ans=0常见字符串的操作函数名函数用途函数名函数用途strcat链接字符串strvcat垂直链接字符串strcmp比较字符串大小strncmp比较字符串的前n个字符findstr在其他的字符串中寻找该字符串strjust证明字符数组strmatch查找可能匹配的字符串strrep用其他字符串代替改串strtok查找字符串中的记号blanks生成空的字符串deblank删除字符串内的空格ischar字符串检验iscellstr字符串的单元检验isletter字母检验isspace空格检验stringsstrings函数的帮助字符串的合并strcat函数用于将字符串水平连接合并成一个新字符串,合并的同时会将字符串尾的空格删除。语法格式如下:strcat(s1,s2,…)%将s1,s2…合并成一个长字符串char(s1,s2,…)%将s1,s2…合并成一个字符数组strvcat(s1,s2,…)%将s1,s2…合并成一个字符数组s1='a+b,';s2='C+D';strcat(s1,s2)=a+b,C+Dchar(s1,s2)=a+b,C+Dstrvcat运行结果与char相同str1='a+b,'str1=a+b,str1=strrep(str1,',','*2')%将,用*2替换str1=a+b*2a=5b=2eval(str1)%执行字符串str1ans=9