MATLAB数据类型及运算2014_第1页
MATLAB数据类型及运算2014_第2页
MATLAB数据类型及运算2014_第3页
MATLAB数据类型及运算2014_第4页
MATLAB数据类型及运算2014_第5页
已阅读5页,还剩160页未读 继续免费阅读

下载本文档

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

文档简介

MATLAB数据类型及运算MATLAB的保留常量常量取值ans结果的缺省变量名i,j虚数单位,定义为i=j=pi圆周率,3.1415926eps机器零阈值,当和1相加就产生一个比1大的数。eps=2.2204x10-16realmax最大正浮点数,realmax=1.7977x10308realmin最小正浮点数,realmin=2.2251x10-308Inf(inf)无穷大,包含正无穷和负无穷,如1/0NaN(nan)不定值,包含0/0和∞/∞MATLAB的保留常量常量取值nargin函数输入参数个数nargout函数输出参数个数lasterr存放最新的错误信息lastwarn存放最新的警告信息例:最小复数单位的使用。>>x=ix=0+1.0000i>>i=1i=1>>y=i+jy=1.0000+1.0000i>>clear>>z=i+jz=0+2.0000i7+5i7+5*iMATLAB语言中的变量(1)变量不需要事先声明,也不需要指定维数,MATLAB在遇到新的变量名时,会自动建立变量并分配内存;(2)给变量赋值时,如果变量不存在,会创建它;如果变量存在,会更新它的值;(3)赋值时,右边的表达式必须有一个值(即使值为空)。MATLAB语言中的变量MATLAB语言的变量命名规则是:(1)变量名必须是不含空格的单个词;(2)变量名必须以字母打头,之后可以是任意字母、数字或下划线,变量名中不允许使用标点符号(3)变量名可任意长,但使用前N个字符。N与硬件有关,由函数namelengthmax返回,一般N=63;(4)变量名区分大小写;(5)不能使用函数名和系统保留字;如要察看变量a的值,只需要在命令窗口中输入变量的名称即可:>>a任何MATLAB的语句的执行结果都可以在屏幕上显示,同时赋值给指定的变量,没有指定变量时,赋值给一个特殊的变量ans,数据的显示格式由format命令控制。format只是影响结果的显示,不影响其计算与存储;MATLAB总是以双字长浮点数(双精度)来执行所有的运算。>>Abc_1=10Abc_1=10>>a=[123];>>aa=123>>abc_1???Undefinedfunctionorvariable'abc_1'.>>Abc_1Abc_1=10例:计算表达式的值,并显示计算结果。

在MATLAB命令窗口输入命令:>>x=1+2i;>>y=3-sqrt(17);>>z=(cos(abs(x+y))-sin(78*pi/180))/(x+abs(y))z=-0.3488+0.3286iMATLAB中每一个数据元素都是双精度表示和存储的。如果输出矩阵的每个元素都是纯整数,MATLAB就用不加小数点的纯整数格式显示结果。只要矩阵中有一个元素不是纯整数,MATLAB就按当前的输出格式显示计算结果。数据输出时可用format命令设置或改变输出格式,format命令的格式为:

format格式符格式符决定数据的输出格式。指令含义举例说明formatshort输出小数点后4位有效数字,最多不超过7位;对于大于1000的实数,用5位有效数字的科学计数形式显示314.159被显示为314.1590;3141.59被显示为3.1416e+003formatlong15位有效数字数字表示3.14159265358979formatshorte5位有效数字的科学记数表示3.1416e+00formatlonge15位有效数字的科学记数表示3.14159265358979e+00formatshortg从formatshort和formatshorte中自动选择最佳输出方式3.1416formatlongg从formatlong和formatlonge中自动选择最佳输出方式3.14159265358979formatrat近似有理数表示355/113指令含义举例说明formathex十六进制表示4009211h54442d18format+正数、负数、零分别用+、-、空格表示+formatbank(金融)元、角、分表示3.14formatcompact显示变量之间没有空行formatloose在显示变量之间有空行默认的显示格式是short该表中实现的所有格式设置仅在MATLAB的当前执行过程中有效。>>x=[4/31.2345e-6]x=1.33330.0000>>formatshort>>xx=1.33330.0000>>formatshorte>>xx=1.3333e+0001.2345e-006>>formatlong>>xx=1.3333333333333330.000001234500000>>formatlonge>>xx=1.333333333333333e+0001.234500000000000e-006>>formatbank>>xx=1.330.00>>formathex>>xx=3ff55555555555553eb4b6231abfd271>>format+>>xx=++矩阵矩阵是Matlab的基本处理对象,Matlab的大部分运算或命令都是在矩阵运算的定义下执行的。生成矩阵时无须对矩阵的维数和类型进行说明,Matlab会根据用户输入的内容自动进行设置。矩阵中的元素可以采用具体数值或表达式,可以通过下标对元素进行访问、输入或修改。矩阵的创建直接输入利用已建好的矩阵建立更大的矩阵利用MATLAB内部函数利用M文件建立矩阵外部数据文件装载对于较大矩阵的输入,可采用变量编辑器。

矩阵的建立

1、直接输入法

从键盘直接输入矩阵的元素。矩阵元素可以是实数,复数,也可以是表达式。但表达式中不可包含未知的变量,MATLAB用表达式的值为该位置的矩阵元素赋值。当矩阵中没有任何元素时,该矩阵被称作“空阵”(EmptyMatrix)。具体方法如下:(1)全部矩阵元素必须用方括号([])括起来,按矩阵行的顺序输入各元素。(2)同一行的各元素之间用空格或逗号分隔。不同行的元素之间用分号或回车符分隔。(3)矩阵元素可为运算表达式,若不想获得中间结果,可以用“;”结束。例如,在CommandWindow窗口中输入如下形式:

A=[2345;1357;0369]

或A=[234513570369]

结果为:

A=234513570369直接输入复数矩阵:两种方式:

B=[123;456]+i*[123;456]或B=[1+i2+2i3+3i;4+4i5+5i6+6i]

结果为:

B=1.0000+1.0000i2.0000+2.0000i3.0000+3.0000i4.0000+4.0000i5.0000+5.0000i6.0000+6.0000i

矩阵的建立

>>y=[2,4,5368]>>y=245368>>a=1;b=2;c=3;>>x=[5bc;a*ba+cc/b]>>x=5.00002.00003.00002.00004.00001.5000>>z=[2pi/2;sqrt(3)3+5i]>>z=2.00001.57081.73213.0000+5.0000i在命令窗口中输入矩阵的建立多维矩阵的创建>>a=[123;456;789]a=123456789>>a(:,:,2)=[001;010;100]a(:,:,1)=123456789a(:,:,2)=00101010022由向量构成矩阵向量是组成矩阵的基本元素之一。向量元素需要用方括号括起来。元素之间用空格和逗号分隔生成行向量,用分号隔开生成列向量。可以把行向量看成1n阶矩阵,把列向量看成n1

阶矩阵。向量的构造方法:直接输入向量利用冒号生成向量利用linspace/logspace生成向量矩阵的建立例:在命令窗口输入:>>a=[0123456789]或>>a=[0,1,2,3,4,5,6,7,8,9]按“Enter”键确认后,在命令窗口中显示a=0123456789冒号表达式在MATLAB中,冒号是一个重要的运算符,利用它可以产生行向量。(1)“初值:终值”方式。创建以初值开始以终值结束且间隔为1的行向量。例:在命令窗口输入:>>a=1:5按“Enter”键确认后,在命令窗口中显示a=12345(2)“初值:间隔:终值”方式。创建以初值开始以终值结束且以给定间隔为增量的行向量。例:在命令窗口输入:>>a=0:5:30按“Enter”键确认后,在命令窗口中显示a=

051015202530>>v1=0:0.2:piv1=Columns1through900.20000.40000.60000.80001.00001.20001.40001.6000Columns10through161.80002.00002.20002.40002.60002.80003.0000>>

v2=0:-0.1:pi%步距为负,不能生成向量,得出空矩阵v2=Emptymatrix:1-by-0>>v3=0:piv3=0123>>v4=pi:-1:0%逆序排列构成新向量v4=3.14162.14161.14160.1416>>v5=[0:0.4:pi,pi]v5=00.40000.80001.20001.60002.00002.40002.80003.1416(3)利用linspace创立。在命令窗口输入“a=linspace(初值,终值,n)”,则会创建以初值开始以终值结束且共有n个元素的行向量a。缺省n为100。显然,linspace(a,b,n)与a:(b-a)/(n-1):b等价。例:在命令窗口输入:>>a=linspace(1,10,10)按“Enter”键确认后,在命令窗口中显示a=12345678910(4)利用logspace创立。在命令窗口输入“a=logspace(n1,n2,n)”,则会创建以10n1值开始以10n2值结束且共用n个对数分割量的行向量a。缺省n为50。例:在命令窗口输入:>>a=logspace(1,3,3)按“Enter”键确认后,在命令窗口中显示a=101001000>>b=logspace(0,2,4)b=

1.00004.641621.5443100.0000>>x=0:0.5:2

x=00.50001.00001.50002.0000>>y=linspace(0,2,7)y=

00.33330.66671.00001.33331.66672.0000>>z=[-1x3]z=-1.000000.50001.00001.50002.00003.0000>>u=[y;z]u=00.33330.66671.00001.33331.66672.0000-1.000000.50001.00001.50002.00003.0000利用已建好的矩阵建立更大的矩阵大矩阵可由已建好的小矩阵拼接而成。例如:>>A=[1,2,3;4,5,6;7,8,9];>>B=[11,12,13;14,15,16;17,18,19];>>C=[A,B;B,A]C=123111213456141516789171819111213123141516456171819789矩阵的建立2、利用MATLAB函数建立数值矩阵MATLAB提供了许多生成和操作矩阵的函数,可以利用它们建立矩阵。例:利用reshape函数建立数值矩阵>>a=1:9;>>b=reshape(a,3,3)b=147258369%生成空阵>>K=[]

K=

[]利用diag函数建立对角矩阵>>A=rand(4,4)%产生4x4的“0-1”分布的矩阵AA=0.81470.63240.95750.95720.90580.09750.96490.48540.12700.27850.15760.80030.91340.54690.97060.1419>>B=diag(A)%利用矩阵A的主对角线的元素建立矩阵BB=0.81470.09750.15760.1419>>C=diag(B)%利用矩阵B中元素构建对角矩阵CC=0.814700000.097500000.157600000.14193利用M文件建立矩阵对于比较大且比较复杂的矩阵,可以为它专门建立一个M文件。例:在M文件窗口中输入

A=[2345;1357;0369]

如果文件test.m保存在MATLAB搜索路径中,在MATLAB命令窗口中输入test就可产生矩阵A,可供以后使用。

矩阵的建立

运行test文件结果如下:>>testA=23451357036936利用M文件产生矩阵A=[1,2,3,4,56,7,8,9,1011,12,13,14,1516,17,18,19,2021,22,23,24,25]4利用外部数据文件装入到指定矩阵:(1)通过MATLAB提供的文件输入、输出函数来实现。例:将图像penquan.jpg读入到矩阵中,在CommandWindow窗口输入如下语句:

>>I=imread('penquan.jpg');>>whosNameSizeBytesClassAttributesI1944x2592x315116544uint8

矩阵的建立(2)通过load命令,将外部数据文件中的内容调入到工作空间中创建矩阵,外部文件的扩展名为.dat。例如:>>loadtest.dat>>test从外部数据文件调入矩阵用load命令输入用Import菜单输入矩阵的寻址与赋值全下标方式指出某一元素在第几行第几列。单下标方式只用一个下标来指明元素在数组中的位置。要对二维数组的所有元素进行“一维编号”。矩阵元素

(1)MATLAB允许对一个矩阵的单个元素进行赋值和操作。通过下标引用矩阵的元素,例如

A(3,2)=200

只改变该元素的值,不影响其他元素的值。42矩阵元素的修改>>A=[1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16]

A=

12345678910111213141516>>A(1,1)ans=1>>A(2,3)ans=7>>A(1,1)=0;A(2,2)=A(1,2)+A(2,1);A(4,4)=cos(0);>>AA=

0234577891011121314151矩阵元素

如果给出的行下标或列下标大于原来矩阵的行数和列数,则MATLAB将自动扩展原来的矩阵,并将扩展后未赋值的矩阵元素置为0。 >>A=[1,2,3;4,5,6]; >>A(4,6)=100 A= 123000 456000 000000 00000100矩阵元素

(2)采用矩阵元素的序号来引用矩阵元素。矩阵元素的序号就是相应元素在内存中的排列顺序。在MATLAB中,矩阵元素按列存储,先第一列,再第二列,依次类推。例如

A=[1,2,3;4,5,6];

A(3)

ans=

2

显然,序号(Index)与下标(Subscript)是一一对应的,以m×n矩阵A为例,矩阵元素A(i,j)的序号为(j-1)*m+i。矩阵元素的引用>>rand('state',0)>>x=rand(1,5)x=0.95010.23110.60680.48600.8913>>x(3)ans=0.6068>>x([125])%位置坐标中间可以用逗号分隔ans=0.95010.23110.8913>>x(1:3)ans=0.95010.23110.6068矩阵元素的引用>>rand('state',0)>>x=rand(1,5)%生成均匀分布的随机矩阵x=0.95010.23110.60680.48600.8913>>x(3:end)ans=0.60680.48600.8913>>x(3:-1:1)ans=0.60680.23110.9501>>x(find(x>0.5))ans=0.95010.60680.8913>>a=[123;456]a=123456>>a(2,2)ans=5>>a(1,3)=0a=120456>>b=a(4)b=5如果矩阵中只有部分元素需要改动,则可以通过对矩阵的赋值来完成。>>rand('state',0)>>x=rand(1,5)x=0.95010.23110.60680.48600.8913>>x(3)=0x=0.95010.231100.48600.8913>>x([14])=[11]x=1.00000.231101.00000.8913A(i,j):提取A矩阵第i行,第j列的元素(从1开始计数)A(:,j):表示取A矩阵第j列的全部元素A(i,:):表示取A矩阵第i行的全部元素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列中的所有元素。A(m1:m2,n1:n2):提取第m1行到第m2行内,并在第n1列到第n2列中的所有元素(提取子块);A(k):提取矩阵A按列存储的第k个元素。例如,对于4x4矩阵A,A(8)是指矩阵A中的元素A(4,2);A(:):得到一个长列矢量,该矢量的元素将矩阵的列按先左后右的顺序排成一维长列,再对元素位置编号;可利用一般向量和end运算符来表示矩阵下标,从而获得子矩阵。end表示某一维的末尾元素下标。矩阵的拆分50矩阵的引用选出矩阵指定行、列及元素(创建子矩阵);

>>b=a(1:2,2:3)b=2356使矩阵中所有元素变为一列。

>>c=b(:)c=2536例:>>A=[1,2,3,4;3,4,5,6;5,6,7,8;7,8,9,0]A=1234345656787890>>B1=A(1:2:end,:)%提取全部奇数行、所有列。B1=12345678子矩阵提取

%提取3,2,1行、2,3,4列构成子矩阵。

>>B2=A([3,2,1],[2,3,4])A=B2=1234678345645656782347890%将A矩阵左右翻转,即最后一列排在最前面。>>B3=A(:,end:-1:1)B3=4321654387650987矩阵下标如果在提取矩阵值时,行或列的值大于矩阵的大小,则出错;例:对于矩阵A,给出结果。>>A=[246;357;189]A=246357189A(2,:)A(:,3)A(1:2,2:3)A(2:3,1:3)A(:)>>A(2,:)ans=357>>A(:,3)ans=679>>A(1:2,2:3)ans=4657>>A(2:3,1:3)ans=357189>>A(:)ans=231458679矩阵元素的删除利用空矩阵删除矩阵的元素空矩阵是指无任何元素的矩阵。在MATLAB中,定义[]为空矩阵。给变量X赋空矩阵的语句为X=[]。注意:X=[]与clearX不同,clear是将X从工作空间中删除,而空矩阵则存在于工作空间中,只是维数为0。消除子块:如果将矩阵的子块赋值为空矩阵[],则相当于消除了相应的矩阵子块。如果删除了矩阵中的单个元素,矩阵将不再是矩阵。A(1,2)=[]将给出出错信息。使用单下标可以删除矩阵单个元素,剩下的元素排成一个行向量。例:>>A=[2345;1357;0369]A=234513570369>>A([12],[12])=[]???Subscriptedassignmentdimensionmismatch.>>A([12],:)=[]A=0369>>A=[2345;1357;0369]A=234513570369>>A(:,[12])=[]A=455769>>A=[2345;1357;0369]A=234513570369>>A(1,2)=[]???Subscriptedassignmentdimensionmismatch.字符串字符串中的每一个字符(含空格符)以其ASCII形式存放。所有字符串都用单引号括起来。>>s='matlab'一个字符串被视为一个行向量,字符串中的每个字符(包括空格)都是字符串变量(矩阵或向量)中的一个元素。字符串中的字符以ASCII码形式储存并区分大小,用函数abs可以看到字符的ASCII码。在Matlab中,字符串和字符矩阵基本上是等价的。>>s=['matlab']等价于>>s='matlab'创建字符串MATLAB中所有字符串使用单引号界定后输入或赋值。例如:>>a='matlab'a=matlab字符串的每个字符(含空格)都是相应矩阵的一个元素>>size(a)ans=16%一行六列创建字符串字符变量可以通过中括号合并成更大的字符串>>a='MAT'a=MAT>>b=[a,'LAB']b=MATLAB从字符串中提取小字符串>>c=b(2:5)c=ATLA直接输入建立二维字符串数组>>str=['one';'two';'three']???Errorusing==>vertcatCATargumentsdimensionsarenotconsistent.直接输入方法中每一行的字符数必须一致>>str=['one';'two';'six']str=onetwosix利用‘str2mat’函数建立二维字符串数组>>str=str2mat('one','two','three')str=onetwothree例:建立一个字符串向量,然后对该向量做如下处理:

(1)取第1~5个字符组成的子字符串。

(2)将字符串倒过来重新排列。

(3)将字符串中的小写字母变成相应的大写字母,其余字符不变。

(4)统计字符串中小写字母的个数。>>ch='ABc123d4e56Fg9';>>subch=ch(1:5)%取子字符串subch=ABc12>>revch=ch(end:-1:1)%将字符串倒排revch=9gF65e4d321cBA>>k=find(ch>='a'&ch<='z')%找小写字母的位置k=37913>>ch(k)=ch(k)-('A'-'a')%将小写字母变成相应的大写字母ch=ABC123D4E56FG9>>length(k)%统计小写字母的个数ans=4类型转换int2str四舍五入为整数转换为字符串num2str将数字转换为字符串mat2str将矩阵的数据转换为字符串str2num将字符串转变为数字‘num2str’和‘str2num’函数的用法实例。>>a=['12';'34']a=1234>>b=str2num(a)b=1234>>c=str2num('1+2i')c=1.0000+2.0000i>>d=str2num('1+2i')

%注意空格d=1.00000+2.0000i‘num2str’和‘str2num’函数的用法实例。>>e=num2str(rand(3,3),6)%可指定有效数字位数e=0.8147240.9133760.2784980.9057920.6323590.5468820.1269870.09754040.957507>>whosNameSizeBytesClassAttributesa2x312charb2x232doublec1x116doublecomplexd1x232doublecomplexe3x34204char

字符串函数eval(string)作为一个MATLAB命令求字符串的值blanks(n)返回一个n个空格的字符串deblank去掉字符串中后拖的空格feval求由字符串给定的函数值findstr从一个字符串内找出字符串isletter字母存在时返回真值isspace空格字符存在时返回真值isstr输入是一个字符串,返回真值lasterr返回上一个所产生MATLAB错误的字符串strcmp字符串相同,返回真值strrep用一个字符串替换另一个字符串strtok在一个字符串里找出第一个标记字符串比较>>str1='matlab'str1=matlab>>str2='matrix'str2=matrix>>strcmp(str1,str2)ans=0>>strncmp(str1,str2,2)%比较两个字符串的前两个字符ans=1>>A=str1==str2%应用‘==’比较字符串A=111000>>B=str1~=str2B=000111字符串分类>>str='MATLAB'str=MATLAB>>isletter(str)%判断字符串中字符是否是字母ans=10101010101>>isspace(str))%判断字符串中字符是否是空白字符ans=01010101010查找与替换>>str1='Iamastudent'str1=Iamastudent>>strrep(str1,'s','S')ans=IamaStudent查找与替换>>str1='Iamastudent'str1=Iamastudent>>str2='student';>>str3='teacher';>>str4=strrep(str1,str2,str3)str4=Iamateacher查找与替换>>str1='Iamastudent'str1=Iamastudent>>str2='student';>>position=findstr(str1,str2)%找出str2处于str1的位置position=8结构数组结构是包含一组记录的数据类型,而记录则是存储在相应的字段中。结构的元素可以是不同的数据类型,它能将一组具有不同属性的数据纳入到一个统一的变量名下进行管理。结构数组的引用通过属性名来实现。结构数组的创建有两种方法:语句直接创建和由struct函数创建。结构型变量的生成直接输入法:采用直接输入法时,在给结构体成员元素直接赋值的同时定义该元素的名称,并使用点儿将结构型变量和成员元素名连接。创建结构数组>>='henry';>>employee.sex='male';>>employee.age='25';>>employee.number='123456789';>>employeeemployee=name:'henry'sex:'male'age:'25'number:'123456789'可以通过以下形式语句添加新的结构变量(另外的学生数据)。系统将默认之前的employee为employee(1)>>employee(2).name='lee';>>employee(2).sex='female';>>employee(2).age='23';>>employee(2).number='987654321';>>employee(2)ans=name:'lee'sex:'female'age:'23'number:'987654321'此时,输入employee将只得到该结构的成员变量名而不显示内容>>employeeemployee=1x2structarraywithfields:namesexagenumber创建结构数组使用struct函数创建结构数组:根据指定的字段及其相应的值创建结构体数组。格式:str-array=struct(‘field’,val1,’field’,val2…);>>student=struct('name','henry','age',25,'grade',uint16(1))student=name:'henry'age:25grade:1>>whosNameSizeBytesClassAttributesstudent1x1392struct

>>student=struct('name',{'richard','jacson'},'age',{23,24},'grade',{2,3})student=1x2structarraywithfields:nameagegrade>>whosNameSizeBytesClassAttributesstudent1x2610struct>>student=struct('name',{},'age',{},'grade',{})student=0x0structarraywithfields:nameagegrade>>whosNameSizeBytesClassAttributesstudent0x0192struct>>student=repmat(struct('name','henry','age',25,'grade',1),1,3)student=1x3structarraywithfields:nameagegrade>>student(3)ans=name:'henry'age:25grade:1结构数组中的数据获取>>clear>>a(2)=struct('tag','openbutton','name','open','color','red');>>a(3)=struct('tag','exitbutton','name','exit','color','green');>>x=a(2).tag%利用“.”获取结构数组中的数据x=openbutton>>y=a(3).colory=green结构数组的数据获取和设置>>a(2)=struct('tag','openbutton','name','open','color','red');>>a(3)=struct('tag','exitbutton','name','exit','color','green');%通过getfield函数获得结构数组中的数据>>z=getfield(a,{2},'name')z=open%通过setfield函数设置结构数组中的数据>>a=setfield(a,{2},'color','black');>>a(2).colorans=black结构数组操作添加结构数组中的结构域要给结构矩阵a增加一个成员x4,可给a中任意一个元素增加成员x4:a(1).x4=‘410075’;但其他成员均为空矩阵,可以使用赋值语句给它赋确定的值。>>clear>>a(2)=struct('tag','openbutton','name','open','color','red');>>a(2).position=[2552552550];%添加结构域>>a(2)ans=tag:'openbutton'name:'open'color:'red'position:[2552552550]结构数组操作删除结构数组中的结构域>>clear>>a(2)=struct('tag','openbutton','name','open','color','red');%调用rmfield函数删除结构数组中的结构域color>>a=rmfield(a,'color')a=1x2structarraywithfields:tagname结构数组操作结构数组运算>>student(1)=struct('NO',06129,'name','john','score',[869176;859483])student=NO:6129name:'john'score:[2x3double]%调用mean函数计算结构数组student的平均分数>>aver=mean(student(1).score)aver=85.500092.500079.5000元胞数组元胞数组可看作一种无所不包的特殊矩阵。元胞数组的每一个元素称为一个cell,每个cell自己本身又是一个数组。元胞数组中可以存放各种不同类型数据,各元胞的内容和维数可以不相同。访问元胞数组的元素可以使用单下标或全下标方式元胞数组的创建使用“{}”。元胞数组占用的内存空间和元胞数组的内容相关,不同元胞数组占用内存空间不同。结构体是根据属性名组织起来的不同类型数据的集合。结构体和单元数组的共同之处在于它们都提供了一种分级存储机制来存储不同类型的数据,不同之处是组织数据的方式不一样。结构体数组里的数据是通过属性名来引用的,而在单元数组里,数据是通过单元数组下标引用来操作的。创建元胞数组由语句直接生成>>A={'test',[12;34],{'Good','Thanks'},rand(3)}A='test'[2x2double]{1x2cell}[3x3double]>>whosNameSizeBytesClassAttributesA1x4492cell

在显示元胞数组内容时,对于内容较多的元胞,显示的内容为元胞的数据类型和尺寸。>>a={'matlab',20;ones(2,3),1:10}a='matlab'[20][2x3double][1x10double]>>b=[{'matlab'},{20};{ones(2,3)},{1:10}]b='matlab'[20][2x3double][1x10double]>>isequal(a,b)ans=1创建元胞数组由各元胞创建>>B{1,1}=[123;456;789];>>B{1,2}='kitty';>>B{2,1}=3+7i;>>B{2,2}=eye(3);>>BB=[3x3double]'kitty'[3.0000+7.0000i][3x3double]>>whosNameSizeBytesClassAttributesA1x4492cellB2x2410cell

>>c={10}c=[10]>>c(1,2)={2}c=[10][2]>>c(2,2)={5}c=[10][2][][5]MATLAB能够自动扩展数组的尺寸,没有被明确赋值的元素作为空元胞数组存在。创建元胞数组cell函数创建元胞数组>>a=cell(1)a={[]}>>b=cell(1,2)b=[][]>>c=cell(3,3)c=[][][][][][][][][]创建元胞数组cell函数创建元胞数组>>d=cell(2,2,2)d(:,:,1)=[][][][]d(:,:,2)=[][][][]>>whosNameSizeBytesClassAttributesA1x4492cellB2x2410cella1x14cellans1x11logicalb1x28cellc3x336celld2x2x232cell

元胞数组中的数据获得要显示单元数组可以直接在命令窗口中输入单元数组的名字,也可以使用函数celldisp(c)来输出;想得到单元数组中某一个单元的值时,可以采用c(m,n)或c{m,n}的格式输出。但是它们得到的结果表示形式是不同的。大括号用于表示元胞的内容,小括号表示指定的元胞。分别用它们赋值产生的数据类型也不同。要访问指定元胞中的具体元素,可以在元胞数组内容下标的后面加上指定数组元素的下标。如a{1,2}(1,2)表示元胞a{1,2}的元素(1,2)。“{}”和“()”直接相连,并且两种括号不能写混。元胞数组中的数据获得>>a={20,'matlab';ones(2,3),1:3}a=[20]'matlab'[2x3double][1x3double]>>str=a{1,2}%a{1,2}表示对应元胞的内容str=matlab>>class(str)%查看变量str的数据类型,为字符型ans=char>>str2=a(1,2)%返回元胞数组,a(1,2)表示元胞数组中的一个元胞str2='matlab'>>class(str2)%查看变量str2的数据类型,为元胞ans=cell元胞数组中的数据获得元胞中具体元素的访问:>>a={20,'matlab';rand(2,3),1:3}a=[20]'matlab'[2x3double][1x3double]>>a{2,1}(2,2)ans=0.9572>>a{2,1}(2,3)ans=0.8003>>a{1,2}(2,3)???Indexexceedsmatrixdimensions.%a{1,2}为‘matlab’,无元素(2,3),故出错>>a{1,2}(2)ans=a>>a{2,2}(2)ans=2元胞数组中的数据获得使用元胞的下标创建新的元胞数组>>a=[{1},{2},{3};{4},{5},{6};{7},{8},{9}]a=[1][2][3][4][5][6][7][8][9]>>b=a(2:3,2:3)b=[5][6][8][9]>>c=a(1:3,2:3)c=[2][3][5][6][8][9]元胞数组显示使用celldisp函数显示元胞数组内容。函数celldisp()更适用于具有大量数据的单元数组的显示。>>celldisp(a)a{1,1}=20a{2,1}=111111a{1,2}=matlaba{2,2}=123a{1,3}=3.0000-7.0000ia{2,3}=0c{m,n}和celldisp(c)显示的结果形式相同。元胞数组显示通过cellplot函数以图形的方式显示元胞数组内容h=cellplot(c)返回一个向量,这个向量综合体现了表面、线和句柄。h=cellplot(c,’legend’)返回一个向量,这个向量综合体现了表面、线和句柄,并有图形注释。>>cellplot(a,'legend')元胞数组和数值数组之间的转换数值数组转换成元胞数组>>A=magic(3);>>C=num2cell(A,2)%2代表“直行被切割”,1代表“横列被切割”

C=[1x3double][1x3double][1x3double]>>celldisp(C)C{1}=816C{2}=357C{3}=492元胞数组和数值数组之间的转换元胞数组转换成数值数组>>C={[1][234];[5;9][678;101112]}C=[1][1x3double][2x1double][2x3double]>>C(1,1)ans=[1]>>C(2,1)ans=[2x1double]>>M=cell2mat(C)M=123456789101112元胞数组的删除要删除元胞数组中的行或列,可以用冒号表示单元数组中的行或列,对其赋空矩阵。删除后的单元数组的行或列减一。删除元胞数组中元胞的表达式不能用大括号。删除元胞数组的一个单元时,可认为元胞的编号是按列计数的。指定的元胞被删除后,单元数组变为行矢量的形式。元胞数组的删除>>a={20,'matlab';ones(2,3),1:3}a=[20]'matlab'[2x3double][1x3double]>>a(1,:)=[]a=[2x3double][1x3double]>>a(1,2)=[]???Anullassignmentcanhaveonlyonenon-colonindex.元胞数组的删除>>a={20,'matlab';ones(2,3),1:3};>>a{1}=[]a=[]'matlab'[2x3double][1x3double]>>a(1)=[]a=[2x3double]'matlab'[1x3double]>>a(2)=[]a=[2x3double][1x3double]元胞数组的删除>>a={20,'matlab';ones(2,3),1:3}a=[20]'matlab'[2x3double][1x3double]>>a(1:2)=[]a='matlab'[1x3double]

1.基本算术运算

MATLAB的基本算术运算有:+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)。

注意,运算是在矩阵意义下进行的,单个数据的算术运算只是一种特例。

MATLAB运算矩阵加减法

C=A+BD=A-B相加减的两矩阵必须有相同的行和列,两矩阵对应元素相加减;如果A与B的维数不相同,则MATLAB将给出错误信息,提示用户两个矩阵的维数不匹配。允许参与运算的两矩阵之一是标量,标量与矩阵的所有元素分别进行加减操作。

>>a=[1,2;3,4];b=[9,8;7,6];c=a+bc=10101010

矩阵的加减运算>>A=[1,2,3,4;5,6,7,8;9,10,11,12;13,14,15,16];>>B=[1,sqrt(25),9,132,6,107*23+sin(pi),7,11,154,abs(-8),12,16];>>C=A+B

C=

27121771217221217222717222732>>D=A-BD=0-3-6-930-3-6630-39630>>E=A+3

E=

45678910111213141516171819矩阵乘法若A为n×m矩阵,B为m×r矩阵,则C=A*B为n×r矩阵。各个元素为MATLAB表示

C=A*B对于矩阵乘运算,A矩阵的列数必须等于B矩阵的行数;标量可与任何矩阵相乘。>>A=[1,2,3;4,5,6;7,8,9];>>B=[-1,0,1;1,-1,0;0,1,1];>>C1=A*BC1=11411101116>>C2=B*AC2=666-3-3-3111315>>A=[1,2,3;4,5,6];>>B=A*A???Errorusing==>mtimesInnermatrixdimensionsmustagree.矩阵除法矩阵左除\:AX=B,求XMATLAB求解:X=A\B若A为非奇异方阵,则X=A-1B,即inv(A)*B最小二乘解(若A不是方阵)矩阵右除/:XA=B,求XMATLAB求解:X=B/A若A为非奇异方阵,则X=BA-1,即B*inv(A)最小二乘解(若A不是方阵)矩阵除法对于含有标量的运算,两种除法运算的结果相同,如3/4和4\3有相同的值,都等于0.75。又如,设a=[10.5,25],则a/5=5\a=[2.10005.0000]。对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系。对于矩阵运算,一般A\B≠B/A。>>A=[1,2,3;4,2,6;7,4,9];>>B=[4,3,2;7,5,1;12,7,92];>>C1=A\BC1=0.5000-0.500044.50001.00000.000046.00000.50001.1667-44.8333>>C2=B/AC2=-0.1667-3.33332.5000-0.8333-7.66675.500012.833363.6667-36.5000

矩阵乘法>>C=A*BC=307011015070174278382110278446614150382614846>>D=A*3D=36912151821242730333639424548矩阵除法左除A\B=inv(A)*B>>A=[8,1,6;3,5,7;4,9,2]A=

816

357

492>>B=[1,1,1;1,2,3;1,3,6]

B=

111123136>>A\Bans=0.06670.05000.09720.06670.30000.63890.06670.0500-0.0694>>C=inv(A)C=

0.1472-0.14440.0639-0.06110.02220.1056-0.01940.1889-0.1028>>C*B

ans=

0.06670.05000.09720.06670.30000.63890.06670.0500-0.0694右除A/B=A*inv(B)>>A/Bans=

27-3112

12

温馨提示

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

评论

0/150

提交评论