分享

MATLAB字符和字符串

 goandlove 2019-01-22

3.字符和字符串

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

3.1 创建字符串

1.一般字符串的创建

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

>> a='matlab'

a =

matlab

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

>> size(a)

ans =

     1     6       %  16

2.中文字符串的创建

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

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

A =

中文字符串输入演示

3.字符串的寻访

MATLAB中,字符串的寻访可以通过其坐标来实现。在一个字符串中,MATLAB按照从左至右的顺序对字符串中的字符依次编号(123,…)。进行字符串的寻访,只需要像寻访一般矩阵那样即可。例如在前面创建了中文字符串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';

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

>>C = strcmp(str1,str2) 

C =

    0

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

>>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函数用于返回某一子串在整个字符串中的开始位置。例如在字符串中查找字母aoo出现的位置,可以使用如下命令:

>> 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列举的数字与字符串之间的转换函数中,常用的是num2strstr2num。这两个函数在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               

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

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

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

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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多