版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章字符串、元胞与构架
数组
1本章学习目标掌握字符串数组、复杂字符串数组的创建及串转换函数与串操作函数掌握元胞数组的创建,元胞数组的显示、寻访、扩充、收缩和重组方法及元胞数组相关函数掌握构架数组的创建、构架数组的相关函数及构架数组的操作掌握几种数组的转换2主要内容3.1字符串数组3.2元胞数组3.3构架数组3.4几种数组的转换33.1字符串数组1.字符串数组的创建创建字符串和创建数值变量类似,只不过需要把待建的字符放在单引号对’’中,例如>>S='HelloWorld'S=HelloWorld创建了一个字符串S,注意该单引号对必须在英文状态下输入。可以对变量S的类别进行判断。
>>class(S)
ans=char
4可见S为一个字符串类型的变量,继续查看变量S的大小。
>>size(S)
ans=111
可以看到S的大小为1×11,而两个单词Hello
World只有10个字符,因为在求S大小的时候把两个单词之间的空格符(Space)也计算在内了。还可用指令whos观察S在内存中所占的字节。>>whosSNameSizeBytesClassS1x1122chararrayGrandtotalis11elementsusing22bytes可以看到S中每个字符占2字节。5同样可以在MATLAB创建中文字符串。>>S1='芝麻开门'S1=芝麻开门串数组的元素标志和数值数组的元素标志方法相近。例如,在一维串数组中,MATLAB按自左至右的次序用自然数数码(1、2、3等)标志字符的位置,例如
>>S2=S(1:7),S3=S1(1:2)S2=HelloWS3=
芝麻6英文字符串的存储是用ASCII码实现的,指令abs和double都可以用来获取字符串数组所对应的ASCII码数值数组,例如>>ascii_S=double(S)%产生ASCII码ascii_S=721011081081113287111114108100指令char可把ASCII码数组变为字符串数组,例如>>char(ascii_S) %把ASCII码变回字符串
ans=HelloWorld中文字符串的存储是用汉字的内码实现的,有些书籍也把汉字的内码称为ASCII码,同样可以获取中文字符串的内码数值数组,例如>>ascii_S1=abs(S1)ascii_S1=33437406352432038376有时需要创建带单引号的字符串,这时每个单引号符可以用连续的2个单引号符来表示,例如>>S4='It''satest'S4=It'satest8有时需要由小串构成长串,这时可以把小串放在[]中,例如>>S_S1=[S,‘’,S1]%这里‘’是一个空格串,单引号对中包含一个空格符,空串‘’不包含空格符,它们两个在MATLAB中是不同的
S_S1=HelloWorld芝麻开门92.复杂字符串数组的创建
①直接创建多行字符串数组可以直接创建多行字符串数组,关键是要保证各行字符数要相等,否则就会提示出错。可以通过插入空格符来实现各行字符数相等,例如>>clear%清空MATLAB工作空间中的变量>>S=[‘天行健,’ %注意第一行和第三行字符串各插入4个空格符
'君子以自强不息。''地势坤,''君子以厚德载物。']10S=天行健,君子以自强不息。地势坤,君子以厚德载物。②利用串操作函数创建多行字符串数组直接创建多行字符串数组时,若各行字符数目不等,不小心会常出现错误,这时可利用串操作函数创建多行字符串数组。这类函数有char、str2mat和strvcat,例如>>S1=char('众里寻他千百度,','蓦然回首,',‘那人却在灯火阑珊处。')11S1=众里寻他千百度,蓦然回首,那人却在灯火阑珊处。>>S2=str2mat('问君能有几多愁,','恰似一江春水向东流。')S2=
问君能有几多愁,恰似一江春水向东流。>>S2=strvcat('莫道不销魂,','帘卷西风,','人比黄花瘦。')S2=莫道不销魂,帘卷西风,人比黄花瘦。
12③利用转换函数把数值数组转换成字符串数组还可利用转换函数把数值数组转换成字符串数组,以方便数据的可视化或计算。最常用的数组/字符串转换函数有int2str、num2str和mat2str,例如>>A=eye(2,3)%创建一个2×3数值数组A=100010>>A_str1=int2str(A)%把整数数组A转换成一个字符串数组A_str1=10001013④利用元胞数组创建复杂字符串前面已经介绍了3种常用的创建复杂字符串数组的方法,还可以利用元胞数组创建复杂字符串,这部分内容放在3.4节介绍。注意:MATLAB语言中没有强调字符标量和字符串的区别,例如>>b=‘A’%给变量b赋字符标量A,相当于创建一个1×1的字符串143.串转换函数与串操作函数
为方便使用,MATLAB还提供了很多的串转换函数与操作函数,下面分别以列表的形式给出。有些函数已经使用过,有些还没有涉及,从指令的含义可以大概了解到这些函数的功能,目前读者不需要把这些函数全部记忆,在需要时知道查表就可以了。表3-1列出常用的字符串转换函数,表3-2列出常用的字符串操作函数。153.2元胞数组
1.元胞数组的创建常用的创建元胞数组的方法有两种:
对元胞元素直接赋值创建;
利用函数cell创建。
①对元胞元素直接赋值创建元胞数组对元胞元素直接赋值创建元胞数组的格式有两种,cell_name(i,j)={value}或cell_name{i,j}=value。16
cell_name是待建元胞数组的名称,value是元素的具体内容。cell_name(i,j)和cell_name{i,j}的意义是不同的cell_name(i,j)表示元胞数组的第i行第j列个元素,被称为“元胞外标志(cellindexing)”;cell_name{i,j}表示元胞数组第i行第j列个元素中的内容,被称为“元胞内编址(contentaddressing)”。下面说明如何创建一个如图3.2所示的元胞数组,设student为待建元胞数组的名称,则下面两组命令都可以完成任务。17
>>clear%清空MATLAB工作空间中的变量>>student(1,1)={['20090102001';'20090102002']};>>student(2,1)={{'张三';'李小红'}};>>student(1,2)={{'数学1''英语1''代数''制图';'数学2''英语2''电路''信号'}};>>student(2,2)={{[80906596;92758078];[78698074;50786880]}};或>>student{1,1}=['20090102001';'20090102002'];>>student{2,1}={'张三';'李小红'};>>student{1,2}={'数学1''英语1''代数''制图';'数学2''英语2''电路''信号'};>>student{2,2}={[80906596;92758078];[78698074;50786880]};18②利用函数cell创建元胞数组利用cell函数预先分配存储空间,然后对细胞的每个元素逐个赋值,方法同对元胞元素直接赋值同,具体不再介绍,留给读者自己通过help学习cell函数。192.元胞数组的显示和寻访刚才在命令窗口输入元胞数组名称,只能看到元胞数组的大致结构,MATLAB提供了一个函数cellplot可以把元胞数组的结构以图形形象化地绘制出来,例如>>cellplot(student)则会弹出一个如图3.3所示的元胞数组student的形象化结构图。2021如果想查看元胞数组的详细数据,可以利用函数celldisp来实现,例如>>celldisp(student)student{1,1}=2009010200120090102002student{2,1}=
张三李小红
student{1,2}{1,1}=
数学1
22student{1,2}{2,1}=
数学2student{1,2}{1,2}=
英语1student{1,2}{2,2}=
英语2student{1,2}{1,3}=
代数
student{1,2}{2,3}=
电路
student{1,2}{1,4}=
制图
23student{1,2}{2,4}=
信号
student{2,2}{1}=8090659692758078student{2,2}{2}=7869807450786880243.元胞数组相关函数MATLAB提供了几个与元胞数组相关的函数,详见表3-3。其中cellplot和celldisp在前面的讲解中已使用过,在3.2.4节中将使用到函数num2cell,别的函数留给读者自己通过help学习。254.元胞数组的扩充、收缩和重组元胞数组的扩充、收缩和重组的方法和数值数组基本相同,下面以简单的指令形式表述。>>clear>>A1=zeros(2,2);A2=zeros(2,2);
%创建两个2×2的全零数组A1、A2>>A1(:)=1:4,A2(:)=5:8%对A1、A2全元素赋值
A1=1324A2=576826>>C1=num2cell(A1),C2=num2cell(A2) %由A1、A2转换生成元胞数组C1、C2C1=[1][3][2][4]C2=[5][7][6][8]>>C1_C2=[C1C2]
%由两个2×2的元胞数组C1、C2扩充一个2×4的元胞数组C1_C2C1_C2=[1][3][5][7][2][4][6][8]
27>>C1_C2(:,4)=[]%将元胞数组C1_C2的第4列置空,元胞数组C1_C2大小变为2×3C1_C2=[1][3][5][2][4][6]注意:收缩元胞数组或者删除元胞元素,必须整行整列地进行,并使用“()”否则会出错。283.3构架数组1.构架数组的创建
创建构架数组的方法有两种:
直接对“域”赋值创建构架数组;利用构造函数struct创建构架数组。①直接对“域”赋值创建构架数组通过对构架数组的各个域进行赋值,即可创建构架数组,其格式为
struct_name(record
index).field_name=data创建单构架数组时,下标(recordindex)可以省略。29例如,下面这组命令就可以创建如图3.4所示的学生信息构架数组。>>student.number='20090102001';>>='张三';>>student.course={'数学1''英语1''代数''制图';…'数学2''英语2''电路''信号'};>>student.score=[80906596;92758078];可以看到这个构架数组不同域中存储的数据类型及维数是不同的,student.number和中存放的是字符串,student.course中存放的是一个2×4的元胞数组,student.score存放的是一个2×4的数值数组。30如果想在构架数组student中增加一个新的构架,那么只需要在构架数组名后添加下标,并向该构架的域中赋值即可。例如,增加一个新构架来保存另一个学生的信息>>student(2).number='20090102002';>>student(2).name='李小红';
>>student(2).course={'数学1''英语1''代数''制图';…'数学2''英语2''电路''信号'};>>student(2).score=[78698074;50786880];31②利用构造函数struct创建构架数组利用构造函数struct创建构架数组的格式为struct_name=struct('field1',VALUES1,'field2',VALUES2,…)式中field1、field2为构架数组struct_name的域,VALUES1、VALUES2为域中要存放的值。各构架中对应的VALUESi(i=1,
2,
…,
n)必须为相同大小的标量元胞数组或单一值,一个特例就是VALUESi为空元胞数组。32例如,利用struct函数创建如图3.4所示student构架数组。>>clear>>student=struct('number',{'20090102001'},'name',{'张三'},…
'course',{{'数学1''英语1''代数''制图';…'数学2''英语2''电路''信号'}},…
'score',{[80906596;…92758078]})student=number:'20090102001'name:'张三'course:{2x4cell}score:[2x4double]332.构架数组的相关函数
MATLAB提供了几个与构架数组相关的函数,详见表3-4。3.构架数组的操作刚才学习了构架数组的两种创建方法及如何向构架数组中增加一个新的构架,下面介绍关于构架数组的其他几个常用操作。①构架数组的收缩有时需要从构架数组中删除一个构架。构架数组的收缩方法与已经学习过数值数组、元胞数组的收缩方法是类似的。34例如,刚才已经创建了一个student构架数,下面的指令把这个单构架数组扩充为1×50的构架数组。
>>student(50).number='20090102050';>>student(50).name='Mary';查看该构架数组:>>studentstudent=1x50structarraywithfields:numbernamecoursescore>>size(student)
ans=150
35可以看到大小为1×50,当然很多构架的域都没有赋值,是空数组。例如>>student(2)
ans=number:[]name:[]course:[]score:[]要想从构架数组中删除一个构架,只需向该构架赋空值即可。36例如>>student(50)=[]student=1x49structarraywithfields:numbernamecoursescore上式表示把构架student(50)赋空值,可以看到构架数组大小变为1×49。37②获取构架数组中的域获取构架数组中的域可以利用函数fieldnames来完成,其格式为NAMES=fieldnames(struct_name)例如,获取构架数组student的域的语句如下>>NAMES=fieldnames(student)NAMES='number''name''course''score'38
③向构架数组中添加新的域有时需要向构架数组添加新的域来存储信息。比如,要向构架数组student中添加一个域department来存储学生的院系信息,可以按如下方式进行>>student(1).department='信息工程'student=1x49structarraywithfields:numbernamecoursescoredepartment可以看到所有的构架中都添加了一个新的域department39有时候构架数组中的某个构架的某个域可能还需要添加一些子域来表示更详细的或附加的信息。例如,构架数组student中不但要存储学生的院系信息,还要存储班级信息,那么可以把班级信息作为院系信息的一个子域,输入
>>student(1).department.Class=‘0901’%域department添加子域Class
student=1x49structarraywithfields:numbernamecoursescoredepartment40可以看到构架数组student域的数目保持不变,接着具体查看两个构架student(1)和student(2)的department域>>student(1).department
ans=Class:'0901'>>student(2).department
ans=[]可以看到两个构架的department域是不同的,student(1)的department域带有子域Class,而student(2)的department域为空值。41④删除构架数组中的域删除构架数组中的域不能利用赋空值的方法进行,要使用函数rmfield,其格式有两种
struct_name=rmfield(struct_name,'field')
struct_name=rmfield(struct_name,{'field1','field2',…})一次可以删除一个或多个域,要想删除多个域,则需要把多个域放在元胞数组里面。例如,要删除构架数组student中的域course和score,可以按以下方式进行42>>student=rmfield(student,{'course','score'})student=1x49structarraywithfields:numbernamedepartment43删除子域的操作和删除域的操作基本相同,区别就是删除子域要指定具体的构架。例如删除构架student(1)的department域的子域Class,可以按以下方式进行。>>student(1).department=rmfield(student(1).department,'Class')student=1x49structarraywithfields:numbernamedepartment44⑤获取构架数组中的域值可以直接引用或利用函数getfield来获取构架数组中的域值,格式如下:直接引用struct_name(i,j).field_name(m,n);利用getfield函数getfield(struct_name,{i,j},'field_name',{m,n})。式中,(i,j)是构架的编号,(m,n)是域的编号,对于单构架数组来说(i,j)可以省略。直接引用法获取构架数组中的域值在前面的叙述中已经多次用到,如获取构架student(1)的number域值,命令如下45>>student(1).numberans=20090102001如果想利用getfield函数获取构架student(1)的number域值,命令如下>>getfield(student,{1},'number')ans=2009010200146⑥设置构架数组中的域值有时需要向构架数组中的域赋值,也有两种方式,直接赋值或利用函数setfield来设置构架数组中的域值,格式如下。a.直接赋值:struct_name(i,j).field_name(m,n)=field_value。b.利用setfield函数:struct_name
=
setfield(struct_name,{i,
j},'field_name',{m,
n},field_value)。具体方法和上面获取构架数组中的域值的方法基本相同,不再详细讲解。
473.4几种数组的转换
1.数值数组与字符串数组的转换由数值数组到字符串数组的转换在3.1.2节已经讲述,由字符串数组到数值数组的转换由函数str2num和str2mat来完成,例如>>S=['12';'34'];%创建字符串数组S>>class(S)
ans=char>>s=str2num(S)
48s=1234>>class(s)
ans=double2.数值数组与元胞数组的转换由数值数组到元胞数组的转换由函数num2cell和mat2cell完成,在前面3.2.4小节中已经运用函数num2cell举例进行了说明。由元胞数组到数值数组的转换由函数cell2mat完成,例如
49>>C={[1][234];[5;9][678;101112]}%创建元
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纺织品物流运输管理办法
- 城市轨道交通预备战略合作合同
- 融资租赁长期经销协议
- 短视频补充装修施工协议
- 神经外科护士药物知识考核试卷
- 酒店重要市场推广合同
- 银行国内销售合同
- 《塞上听吹笛》:意境赏析与朗读指导
- 知识题库-公司副总竞聘试题及答案
- 三上英语期末复习
- 2026年武汉亚洲心脏病医院医护人员招聘考试备考题库及答案详解
- GB/T 47439-2026新能源汽车维修作业安全要求
- 2026年人工智能赋能教育教学培训心得
- 储能项目施工组织方案
- 公司总经理2026年工作总结及2026年工作计划
- 2025年临夏州中小学教师招聘考试真题及答案
- 鲜风生活数字化转型
- 日本佛教革新之光:亲鸾判教思想的深度剖析与时代映照
- 日伪统治下赤峰地区经济的畸变与苦难:1933 - 1945
- ICU多学科协作诊疗模式
- 2026年跨境电商店铺授权合同协议
评论
0/150
提交评论