MATLAB编程与应用系列-第4章 字符、元胞和结构数组(1)

本系列教程来源于出版设计《基于MATLAB编程基础与典型应用书籍》,如涉及版权问题,请联系:156204968@qq.com。 出版社:人民邮电出版社, 页数:525。

本系列教程目前基于MATLABR2006a,可能对于更高级版本的功能和函数有差异,教程中如有问题,请联系:156204968@qq.com

MATLAB具有强大的数据处理功能,这些强大功能实现的基础是MATLAB提供的各种数据类型。MATLAB本身提供了5种以上的内建数据类型,在前面章节中主要介绍了数组及矩阵的创建及其相关操作,数组和矩阵是读者使用比较多,而且比较熟悉的数据类型。在本章中将要介绍MATLAB的另外3类数据类型:字符数组、元胞数组和结构数组。MATLAB的元胞数组和结构数组都能在一个数组里存放各种不同类型的数据,但是两者处理数据的灵活程度不同,读者在学习这两种数据类型时应该注意区分。本章的主要内容如下:

  • 字符数组
  • 元胞数组
  • 结构数组

4.1 字符数组

在MATLAB中,字符数组就是字符串,字符串中的每个字符在系统内部都是使用数值进行表示,并且以行向量的方式进行存储,因此可以通过使用下标访问数值数组元素的方式对字符串中的每个字符进行访问。与数组和矩阵相比,字符串的操作比较简单。

4.1.1 字符数组的创建

一个字符串由多个字符组成,用单引号(’’)来界定。字符串是按行向量的方式进行存储的,每一字符(包括空格)以ASCII码的形式存放。可以在屏幕上操作字符串,但一般不访问内部表示的数值。

【例4.1】字符数组的创建
常用的创建字符串的方法就是直接输入,并以单引号来界定。在命令窗口输入以下内容:
>> na1='hello'
生成字符数组na1如下:
na1 = hello
同样,在命令窗口中输入以下内容:
>> na2='this one is''a3'''
生成字符数组na2如下:
na2 = this one is'a3'
MATLAB的字符数组支持中文,在命令窗口中输入以下内容:
>> na3='还支持中文呢!'
生成字符数组na3如下:
na3 = 还支持中文呢!
使用whos命令可以查看字符数组的详细信息。在命令窗口中输入:
>> whos
返回各字符数组的详细信息如下:
Name Size Bytes Class
na1 1x5 10 char array
na2 1x15 30 char array
na3 1x7 14 char array
Grand total is 27 elements using 54 bytes

例4.1中直接定义的字符数组变量,这些变量的类型是已知的。如果工作空间中已有的变量类型未知,如何断定变量是否是字符串呢?MATLAB提供了两个函数class和ischar,使用这两个函数可以判断变量的类型。

以例4.1中变量na1为例,判断该变量的类型。在命令窗口输入:
>> class(na1) %返回nal的数据类型
函数class返回的结果如下:
ans = char
或者在命令窗口中输入:
>> ischar(na1) %返回0或1,如为1则是字符串,如为0则是非字符串
函数class返回的结果如下:
ans = 1

前面介绍的是直接输入字符创建字符数组的方法,MATLAB还提供了一个函数strcat用来创建字符数组。该函数的功能是将已知的两个或多个字符串组合在一起形成一个新的字符串。

例如使用例4.1中变量na1和变量na2创建一个新的字符数组,在命令窗口中输入:
>> strcat(na1,',',na2)
创建的新字符数组如下:
ans = hello,this one is'a3'

4.1.2 字符与数值的相互转化

字符数组在计算机内容的存储方式是将它所包含的每个字符用16位数字的方式进行保存。MATLAB提供了字符数组与数值数组进行相互转换的函数。转换函数的使用格式如下所示。

double(str) 将字符串str转换成数值数组
char(var) 将数值数组var转换成字符串

【例4.2】字符与数值的相互转化
>> na3='还支持中文呢!'
上述语句生成的字符数组na3如下:
na3 = 还支持中文呢!
使用double函数将na3转换成数值型,在命令窗口中输入以下命令:
>> na4=double(na3)
转换后的结果如下:
na4 =
Columns 1 through 6
36824 25903 25345 20013 25991 21602
Column 7
65281
使用char函数再将na4转换回原来的字符型,在命令窗口中输入以下命令:
>> na5=char(na4)
转换后的结果如下:
na5 = 还支持中文呢!

4.1.3 创建复杂字符数组

MATLAB不仅提供了简单字符串的创建方法,而且还提供了对字符串进行各种操作的函数,接下来介绍MATLAB提供的创建复杂的字符串的操作方法。

(1)创建二维字符数组
将多个字符串变量直接用“,”连接,构成一个行向量,就可以得到一个新字符串变量。也可将每个字符串放在一行,多个字符串可以构成一个二维字符数组。采用这种直接创建多行字符串数组方法时,一定要确保每个字符串(即每一行)的长度一样,否则MATLAB会提示出错。因此,在采用该方式创建字符串数组时必须先在短字符串结尾补上空格符,以确保每个字符串(即每一行)的长度一样。

【例4.3】创建二维字符数组
在命令窗口中输入以下内容,创建三个字符数组na1、na2和na3。
>> na1='hello';
>> na2='this one is''a3''';
>> na3='还支持中文呢!';
①使用两个长度不同的字符串组成一个列字符数组时将出错。例如输入如下内容:
>> na4=[na1;na2]
结果如下:
??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

上述返回结果表明创建二维字符串数组失败,返回的错误提示信息为字符串na1和na2的长度不相同。
②使用两个长度不同的字符串组成一个列字符数组,并使用空格将短的字符补齐,数组可以创建成功。例如输入如下内容:
>> na4=['hello ';'this one is''a3''';'还支持中文呢! ']
生成的列字符数组如下:
na4 =
hello
this one is'a3'
还支持中文呢!
③将几个字符串连成一个行字符数组时,可以不考虑字符串的长度。例如输入:
>> na5=[na1,'!',na2,na3]
生成的行字符数组如下:
na5 =
hello!this one is'a3'还支持中文呢!

(2)使用串操作函数创建多行字符数组
使用直接输入法创建字符串数组,需要考虑字符串长度是否相等的问题,比较麻烦还很容易出错。为了解决这个问题MATLAB提供了专门函数构造出字符串矩阵,而不必考虑每行的字符数是否相等,它总是按最长的设置,不足的末尾用空格补齐。常用的几个函数的调用格式如下:

str2mat(s1,s2,…) 把字符串s1、s2等逐个写成行,形成多行字符数组
strvcat(s1,s2,…) 把字符串s1、s2等逐个写成行,形成多行字符数组,并删除全部空行
char(s1,s2,…) 把字符串s1、s2等逐个写成行,形成多行字符数组

【例4.4】串操作函数创建多行字符数组
首先在命令窗口中输入以下内容,创建三个字符数组na1、na2和na3。
>> na1='hello';
>> na2='this one is''a3''';
>> na3='还支持中文呢!';
①使用函数str2mat创建字符数组,在命令窗口中输入:
>> na6=str2mat(na1,na2,na3)
生成的字符数组如下:
na6 =
hello
this one is'a3'
还支持中文呢!
②使用函数char创建字符数组,在命令窗口中输入:
>> na7=char(na1,na2,na3)
生成的字符数组如下:
na7 =
hello
this one is'a3'
还支持中文呢!
③使用函数strvcat创建字符数组,在命令窗口中输入:
>> na8=strvcat(na1,na2,na3)
生成的字符数组如下:
na8 =
hello
this one is'a3'
还支持中文呢!
④创建字符数组后,使用whos指令察看工作空间中字符数组的使用存储空间的情况。在命令窗口中输入命令:
>> whos
返回结果如下:
Name Size Bytes Class
ans 1x21 42 char array
na1 1x5 10 char array
na2 1x15 30 char array
na3 1x7 14 char array
na6 3x15 90 char array
na7 3x15 90 char array
na8 3x15 90 char array
Grand total is 256 elements using 512 bytes

作者:德特数据
联系方式:156204968@qq.com

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容