MATLAB字符和字符串

3.字符和字符串

在MATLAB中,几个字符(Character)可以构一个字符串(String)。一个字符串被视为一个行向量,而字符串中的每一个字符(含空格符),则是以其ASCII的形式存放于此向量的每一个元素中,只是它的外显形式仍然是可读的字符。字符串类型在数据的可视化、应用程序的交互方面有着非常重要的作用。

3.1 创建字符串

1.一般字符串的创建

在MATLAB中,所有的字符串都用两个单引号括起来,进行输入赋值。如在MATLAB命令窗口中输入:

>> a='matlab'

a =

matlab

字符串的每个字符(空格也是字符)都是相应矩阵的一个元素,上述变量a是1×6阶的矩阵,可以用size(a)命令查得:

>> size(a)

ans =

1     6       %  1行6列

2.中文字符串的创建

中文也可以作为字符串的内容。但需要注意的是:在中文字符串的输入过程中,两边的单引号必须是英文状态的单引号。例如:

>> A='中文字符串输入演示'

A =

中文字符串输入演示

3.字符串的寻访

在MATLAB中,字符串的寻访可以通过其坐标来实现。在一个字符串中,MATLAB按照从左至右的顺序对字符串中的字符依次编号(1,2,3,…)。进行字符串的寻访,只需要像寻访一般矩阵那样即可。例如在前面创建了中文字符串A之后可以得到:

>> A(3:5)

ans =

字符串

4.字符串数组的创建

二维字符串(数组)的建立也非常简单。可以像数值数组的建立那样直接输入,也可以使用str2mat等函数建立。

【例3-6】  多行串数组的直接输入示例。

>> clear

>> S=['This string array '

'has multiple rows.']

S =

This string array

has multiple rows.

>> size(S)

ans =

     2    18

需要注意的是:在直接输入多行字符串数组的时候,每一行的字符个数必须相同。

【例3-7】  使用函数str2mat创建多行串数组示例。

>> a=str2mat('这','字符','串数组','','由5 行组成')

a =

字符

串数组


由5 行组成

>> size(a)

ans =

     5    6

在使用函数str2mat创建字符串数组的时候,不用担心每一行的字符个数是否相等,函数在运行中会以字符最多的一行为准,而将其他行中的字符以空格补齐。

3.2  字符串比较

在MATLAB中,有多种对字符串进行比较的功能:

(1)比较两个字符串或者子串是否相等;

(2)比较字符串中的单个字符是否相等;

(3)对字符串内的元素分类,判断每个元素是否是字符或者空格。

用户可以使用下面4个函数中的任意一个,来判断两个输入字符串是否相等。

(1)strcmp:判断两个字符串是否相等。

(2)strncmp:判断两个字符串的前n个字符是否相等。

(3)strcmpi和strncmpi:这两个函数的作用分别与strcmp和strncmp相同,只是在比较的过程中忽略了字母大小写。

考虑有这两个字符串:

>>str1 = 'hello';

>>str2 = 'help';

字符串str1和str2并不相等,所以使用strcmp函数来判断的话,将会返回逻辑0(false)。例如:

>>C = strcmp(str1,str2) 

C =

    0

由于字符串str1和str2的前3个字符相等,所以用strncmp函数来比较前3个以内字符,将会返回逻辑1(true)。例如:

>>C = strncmp(str1, str2, 2)      % 比较前两个字符

C =

    1

下面介绍如何对大小写不同的情况进行比较。

>> str3 = 'Hello';

>> D = strncmp(str1, str3,2)                % 对大小写敏感

D =

     0

>> F = strncmpi(str1, str3,2)               % 对大小写不敏感

F =

     1

用户可以使用关系运算符进行字符串的比较,只要比较的数组具有相同的尺寸,或者其中一个是标量即可。例如,可以使用(==)运算符来判断两个字符串中有哪些字符相等。

>>A = 'fate';

>>B = 'cake';

>>A == B

ans =

    0   1  0   1

所有的关系运算符都可以用来比较字符串相对应位置上的字符。

3.3 字符串查找与替换

MATLAB提供了很多函数供用户进行字符串的查找与替换。更加强大的是,MATLAB也支持在字符串的查找与替换中使用正则表达式。通过灵活使用正则表达式,可以对字符串进行各种形式的查找与替换。至于正则表达式的应用,用户可以查询帮助文档中的Regular Expressions部分。

【例3-8】  使用strrep函数进行字符串查找替换示例。

考虑有这样一个标签:

>> label = 'Sample 1, 03/28/15'

label =

Sample 1, 03/28/15

函数strrep用于实现一般的查找与替换功能。本例中使用strrep函数,将日期从"03/28"替换为"03/30"。命令如下:

>> newlabel = strrep(label, '28', '30')

newlabel =

Sample 1, 03/30/15

【例3-9】  使用findstr函数进行字符串查找示例。

findstr函数用于返回某一子串在整个字符串中的开始位置。例如在字符串中查找字母a和oo出现的位置,可以使用如下命令:

>> strtemp='have a good time!'

strtemp =

have a good time!

>> position1= findstr('a', strtemp)

position1 =

     2     6

>> position2 = findstr('oo', strtemp)

position2 =

     9

从本例可以看出,字母a出现在第2和第6两个位置,这说明findstr函数返回的位置信息包括所有出现的子串的位置。而字母'oo'字串只出现了一次,所以只返回一个位置信息。

strtok 函数用于返回分隔字符第1次出现之前的字符。如果不自行指定分隔字符,默认的分隔字符则是泛空格符字符,因此用户可以使用strtok函数将一个句子按照单词分开。

【例3-10】  使用strtok函数进行字符串查找示例。

>> t='I have walked out on a handful ofmovies in my life.';  % 测试字符串

>> remain = t;

>> while true                                               %使用while循环结构

[str, remain] = strtok(remain);                          % 以默认的空格为分隔符查找

if isempty(str), break;  end                          % 循环跳出控制

disp(sprintf('%s', str))                                % 显示结果

end

以下就是使用strtok函数进行多次查找得到的结果:

I

have

walked

out

on

a

handful

of

movies

in

my

life.

函数strmatch用于查找一个字符数组中以指定子串开始的字符串,该函数返回的是以指定子串开始的行编号。

【例3-11】  使用strmatch函数进行字符串查找示例。

>> maxstrings = strvcat('max', 'minimax','maximum') % 测试字符串数组

maxstrings =

   max   

   minimax

   maximum

>> strmatch('max', maxstrings)       % 在测试字符串数组中查找以max开头的字符串

ans =

     1

     3

在本例中第二行minimax虽然也包含max子串,但是这个子串的并不是以max开始的,所以在查找过程中没有返回第2行为结果。

3.4 类型转换

在MATLAB中允许不同类型的数据和字符串类型的数据之间进行转换,这种转换需要使用不同的函数完成。另外,同样的数据,特别是整数数据,有很多种表示的格式,例如十进制、二进制或者十六进制。在C语言中,需要使用printf函数通过相应的格式字符串就可以输出不同格式的数据。而在MATLAB中,则直接提供了相应的函数可以完成数制的转换。表3-2和表3-3分别列举了这些函数。

表3-2 数字与字符串之间的转换函数

函     数说    明函    数说    明

num2str将数字转换为字符串str2num将字符串转换为数字

int2str将整数转换为字符串sprintf格式化输出数据到命令行窗口

mat2str将矩阵转换为eval函数可以使用的字符串sscanf读取格式化字符串

str2double将字符串转换为双精度类型的数据

表3-3 不同数值之间的转换函数

函    数说    明函    数说    明

hex2num将十六进制整数字符串转换为双精度数据dec2bin将十进制整数转换为二进制整数字符串

hex2dec将十六进制整数字符串转换为十进制数据base2dec将指定数制类型的数字字符串转换为十进制整数

dec2hex将十进制数据转换为十六进制整数字符串dec2base将十进制整数转换为指定数制类型的数字字符串

bin2dec将二进制整数字符串转换为十进制整数

在表3-2列举的数字与字符串之间的转换函数中,常用的是num2str和str2num。这两个函数在MATLAB的图形用户界面编程中应用较多。

【例3-12】  num2str和str2num函数用法实例。

>> a=['1 2';'3 4']        % 创建一个字符串数组

a =

1 2

3 4

>> b=str2num(a)        % 将字符串转换为数值形式

b =

     1     2

     3     4

>> c=str2num('1+2i')         %将字符串转换为数值形式

c =

   1.0000 +2.0000i

>> d=str2num('1 +2i')         %将字符串转换为数值形式

d =

1.0000 +0.0000i   0.0000 + 2.0000i>>e=num2str(rand(3,3),6)         % 将数值转换为字符串形式

e =

0.814724    0.913376     0.278498

0.905792    0.632359     0.546882

0.126987   0.0975404     0.957507

>> whos

  Name      Size            Bytes  Class    Attributes

  a         2x3                12  char               

  b         2x2                32  double             

  c         1x1                16  double   complex  

  d         1x2                32  double   complex  

  e         3x35              210  char               

本例中转换生成变量c和d时得到了不同的结果,主要原因是在变量d中,数字 “1”和字符“+2i”之间存在空格,而加号“+”和数字“2”之间没有空格,所以转换的结果与生成变量c时不同,创建变量c的时候,在数字“1”、加号“+”和数字“2”之间都存在空格。为了避免出现上述问题,可以使用str2double函数,但是该函数仅能转换标量,不能转换矩阵或者数组。

使用num2str函数将数字转换为字符串时,可以指定字符串所表示的有效数字位数,详细信息可以查阅MATLAB的help文档。

3.5  字符串应用函数小结

MATLAB主要以矩阵计算闻名于世,除此以外该软件在字符串处理方面也提供了一系列非常强大的函数。表3-4对常用字符串函数进行了分类小结。

表3-4 字符串函数

函    数说    明

字符串创建函数'str'由单引号(英文状态)创建字符串

blanks创建空格字符串

sprintf将格式化数据写入字符串

strcat字符串组合

strvcat竖直方向字符串组合

字符串修改函数deblank删除尾部空格

lower将所有字符小写

sort将所有元素升序或降序排列

strjust字符串对齐

strrep字符串替换

strtrim删除开始和尾部的泛空格符

upper将所有字符大写

字符串的读取和操作eval将一个字符串作为MATLAB命令执行

sscanf格式读入字符串

续表

函    数说    明

字符串查找替换函数findstr查找子串

strcmp字符串比较

strcmpi字符串比较,忽略大小写

strmatch查找符合要求的行

strncmp比较字符串的前N个字符

strncmpi比较字符串的前N个字符,忽略大小写

strtok查找某个字符最先出现的位置

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

推荐阅读更多精彩内容