C6文本.docx

上传人:b****5 文档编号:28809244 上传时间:2023-07-19 格式:DOCX 页数:13 大小:20.56KB
下载 相关 举报
C6文本.docx_第1页
第1页 / 共13页
C6文本.docx_第2页
第2页 / 共13页
C6文本.docx_第3页
第3页 / 共13页
C6文本.docx_第4页
第4页 / 共13页
C6文本.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

C6文本.docx

《C6文本.docx》由会员分享,可在线阅读,更多相关《C6文本.docx(13页珍藏版)》请在冰豆网上搜索。

C6文本.docx

C6文本

第6章文本

MATLAB真正强有力的地方在于它的数值处理能力。

然而,经常希望操作文本,例如把标号和标题放在图上。

在MATLAB里,文本当作特征字符串或简单地当作字符串。

6.1字符串

在MATLAB中的字符串一般是ASCII值的数值数组,它作为字符串表达式进行显示。

例如,

»t='Howaboutthischaracterstring?

'

t=

Howaboutthischaracterstring?

»size(t)

ans=

132

»whos

NameSizeElementsBytesDensityComplex

ans1by2216FullNo

t1by3232256FullNo

一个字符串是由单引号括起来的简单文本。

在字符串里的每个字符是数组里的一个元素,字符串的存储要求每个字符8个字节,如同MATLAB的其它变量。

因为ASCII字符只要求一个字节,故这种存储要求是浪费的,7/8所分配的存储空间无用。

然而,对字符串保持同样的数据结构简化MATLAB的内部数据结构。

所给出的字符串操作并不是MATLAB的基本特点,但这种表达是方便和可接受的。

为了了解下面字符串的ASCII表达,只需对字符串执行一些算术运算。

最简单和计算上最有效的方法是取数组的绝对值。

例如,

»u=abs(t)

u=

Columns1through12

7211111932979811111711632116104

Columns13through24

1051153299104971149799116101114

Columns25through32

3211511611410511010363

»u=t+0

u=

Columns1through12

7211111932979811111711632116104

Columns13through24

1051153299104971149799116101114

Columns25through32

3211511611410511010363

在上面后一个例子里,加零到字符串也改变了它的ASCII的表示。

函数setstr提供了逆转换。

»v=setstr(u)

v=

Howaboutthischaracterstring?

因为字符串是数值数组,它们可以用MATLAB中所有可利用的数组操作工具进行操作。

例如,

»u=t(16:

24)

u=

character

字符串象数组一样进行编址。

这里元素16到24包含单词character

»u=t(24:

-1:

16)

u=

retcarahc

这是单词character的反向拼写。

»u=t(16:

24)'

u=

c

h

a

r

a

c

t

e

r

用转置算子将单词character变换成一个列。

»v='Ican''tfindthemanual!

'

v=

Ican'tfindthemanual!

字符串内的单引号是由两个连续的单引号来表示。

字符串连接可以直接从数组连接中得到。

»u='Ifawoodchuckcouldchuckwood,';

»v='howmuchwoodwouldawoodchuckchuck?

';

»w=[uv]

w=

Ifawoodchuckcouldchuckwood,howmuchwoodwouldawoodchuckchuck?

函数disp允许不打印它的变量名而显示一个字符串。

例如,

»disp(u)

Ifawoodchuckcouldchuckwood,

注意u=语句被去掉了。

这对脚本文件内显示帮助的文本有用。

如同矩阵,字符串可以有多个行,但每行必须有相同数目的列数。

因此,显然要用空格以使所有行有相同长度,例如,

»v=['Characterstringshavingmorethan'

'onerowmusthavethesamenumber'

'ofcolumnjustlikematrices!

']

v=

Characterstringshavingmorethan

onerowmusthavethesamenumber

ofcolumnjustlikematrices!

考虑下面例子,它把一个字符串转换成大写。

首先,函数find用来找出小写字符的下标值,然后,从小写元素中只减去小写与大写之差,最后,用setstr把求得的数组转换成它的字符串表示。

»disp(u)

Ifawoodchuckcouldchuckwood,

»i=find(u>='a'&u<='z');%findisaverypowerfulfunction!

»u(i)=setstr(u(i)-('a'-'A'))

u=

IFAWOODCHUCKCOULDCHUCKWOOD,

事实上,如在3.7节所描述的,矩阵能由单个下标标识。

而不是由行和列下标标识,所以上面例子对字符串矩阵v也同样适用:

»disp(v)

Characterstringshavingmorethan

onerowmusthavethesamenumber

ofcolumnjustlikematrices!

»i=find(v>='a'&v<='z');%hereiisasingleindexvectorintov,

»v(i)=setstr(v(i)-('a'-'A'))%andmatrixkeepsthesameorientation.

v=

CHARACTERSTRINGSHAVINGMORETHAN

ONEROWMUSTHAVETHESAMENUMBER

OFCOLUMNJUSTLIKEMATRICES!

最后,当使用前面脚本文件这一章节中的函数input时,字符串是很有用的。

»t='Enternumberofrollsoftape>';

»tape=input(t)

Enternumberofrollsoftape>5

tape=

5

另外,函数input能输入一个字符串:

»x=input('Enteranything>','s')

Enteranything>anythingcanbeentered

x=

anythingcanbeentered

这里,在函数input里的附加参量’s’告诉MATLAB,作为一个字符串,只要把用户输入传送到输出变量,就不需要引号。

事实上,如果将引号包括进去,它们就变成返回字符串的一部分。

6.2字符串转换

除了上面讨论的,字符串和它的ASCII表示之间转换外,MATLAB还提供了大量的其它的有用的字符串转换函数。

它们包括:

表6.1

字符串转换

abs

字符串到ASCII转换

dec2hex

十进制数到十六进制字符串转换

fprintf

把格式化的文本写到文件中或显示屏上

hex2dec

十六进制字符串转换成十进制数

hex2num

十六进制字符串转换成IEEE浮点数

int2str

整数转换成字符串

lower

字符串转换成小写

num2str

数字转换成字符串

setstr

ASCII转换成字符串

sprintf

用格式控制,数字转换成字符串

sscanf

用格式控制,字符串转换成数字

str2mat

字符串转换成一个文本矩阵

str2num

字符串转换成数字

upper

字符串转换成大写

在许多情况下,希望把一个数值嵌入到字符串中。

几个字符串转换可完成这个任务。

»rad=2.5;area=pi*rad^2;

»t=['Acircleofradius'num2str(rad)'hasanareaof'num2str(area)'.'];

»disp(t)

Acircleofradius2.5hasanareaof19.63.

这里函数num2str用来把数值转换成字符串,字符串连接用来把所转换的数嵌人到一个字符串句子中。

按类似方式,int2str把整数转换成字符串。

无论是num2str还是int2str都调用函数sprintf,它用类似C语言语法把数值转换成字符串。

函数fprintf经常是函数disp的一个有用替换,由于它提供了对结果更多的控制。

当准备把格式化的数据写到一个文件中去时,按缺省它在命令窗口显示结果。

例如,

»fprintf('Seewhatthisdoes')

Seewhatthisdoes»

»fprintf('Seewhatthisdoes\n')

Seewhatthisdoes

在上面第一个例子里,fprintf显示字符串,然后立即给出MATLAB提示符。

相反,在第二个例子里,\n插入一个新行字符,在MATLAB提示符出现之前创建一个新行。

无论fprintf还是sprintf以同样方式处理输入参量,但fprintf把输出送到显示屏或文件中,而sprintf把输出返回到一个字符串中。

例如,上面的例子用num2str可重写为

»t=sprintf('Acircleofradius%.4ghasanareaof%.4g.',rad,area);

»disp(t)

Acircleofradius2.5hasanareaof19.63.

»fprintf('Acircleofradius%.4ghasanareaof%.4g.\n',rad,area)

Acircleofradius2.5hasanareaof19.63.

这里%.4g是用在函数num2str中的数据格式。

%.4g就是用指数或定点标记,不管哪一种更短些,只显示至4位数字。

除了g格式,还可用e(指数)和f(定点)转换。

表6.2表明在各种不同转换下,如何显示pi结果。

表6.2

数值格式转换例子

命令

结果

fprintf('%.0e\n',pi)

3e+00

fprintf('%.1e\n',pi)

3.1e+00

fprintf('%.3e\n',pi)

3.142e+00

fprintf('%.5e\n',pi)

3.14159e+00

fprintf('%.10e\n',pi)

3.1415926536e+00

fprintf('%.0f\n',pi)

3

fprintf('%.1f\n',pi)

3.1

fprintf('%.3f\n',pi)

3.142

fprintf('%.5f\n',pi)

3.14159

fprintf('%.10f\n',pi)

3.1415926536

fprintf('%.0g\n',pi)

3

fprintf('%.1g\n',pi)

3

fprintf('%.3g\n',pi)

3.14

fprintf('%.5g\n',pi)

3.1416

fprintf('%.10g\n',pi)

3.141592654

fprintf('%.8.0g\n',pi)

3

fprintf('%.8.1g\n',pi)

3

fprintf('%.8.3g\n',pi)

3.14

fprintf('%.8.5g\n',pi)

3.1416

fprintf('%.8.10g\n',pi)

3.141592654

注意,对e和f格式,小数点右边的十进制数就是小数点右边要显示的多少位数字。

相反,在g的格式里,小数点右边的十进制数指定了显示数字的总位数。

另外,注意最后的五行,其结果指定为8个字符长度,且是右对齐。

在最后一行,8被忽略,因为指定超过了8位。

概括起来,当需要比缺省函数disp,num2str和int2str所提供的更多的控制时,fprintf和sprintf是有用的。

函数str2mat把一列的几个字符串转换成一个字符串矩阵。

例如,

»a='one';b='two';c='three';

»disp(str2mat(a,b,c,'four'))

one

two

three

four

尽管从上面看不明显,上面的每行有同样数目的元素。

较短行用空格补齐,使结果形成一个有效的矩阵

在逆方向转换中,有时是很方便的。

»s='[12;pi4]'%astringofaMATLABmatrix

s=

[12;pi4]

»str2num(s)

ans=

1.00002.0000

3.14164.0000

»s='123e+5'%astringcontainingasimplenumber

s=

123e+5

»str2num(s)

ans=

12300000

函数str2num不能接受用户定义的变量,也不能执行转换过程的算术运算。

更多的信息,请看在线帮助。

6.3字符串函数

MATLAB提供了大量的字符串函数,包括列在表6.3当中的。

表6.3

字符串函数

eval(string)

作为一个MATLAB命令求字符串的值

eval(try,catch)

blanks(n)

返回一个n个零或空格的字符串

deblank

去掉字符串中后拖的空格

feval

求由字符串给定的函数值

findstr

从一个字符串内找出字符串

isletter

字母存在时返回真值

isspace

空格字符存在时返回真值

isstr

输入是一个字符串,返回真值

lasterr

返回上一个所产生MATLAB错误的字符串

strcmp

字符串相同,返回真值

strrep

用一个字符串替换另一个字符串

strtok

在一个字符串里找出第一个标记

列在上面的第一个函数eval给MATLAB提供宏的能力。

其中,该函数提供了将用户创建的函数名传给其它函数能力,以便求值。

它的应用例子包括:

»a=eval('sqrt

(2)')

a=

1.4142

»eval('a=sqrt

(2)')

a=

1.4142

上面的例子演示了函数eval。

显然,它们不是计算2的平方根的最简单方法。

当被求值的字符串是由子字符串连接而成,或将字符串传给一个函数以求值时,eval非常有用。

说明这种用途例子本书的以后会提及。

如果字符串传递到eval不能被辨认,MATLAB提供下列语法:

»eval('a=sqrtt

(2)','a=[]')

a=

[]

这里第二个参量被执行。

由于第一个参量有误,即sqrtt不是一个有效的MATLAB函数。

这种形式经常被描述为eval(try,catch)。

函数feval与eval类似,但在用法上有更多的限制。

feval('fun',x)求由字符串'fun'给定的函数值,其输入参量是变量x。

即feval('fun',x)等价于求fun(x)值。

例如,

»a=feval('sqrt',2)

a=

1.4142

函数eval,feval的基本用途限在用户创建的函数内。

一般地,feval可求出有大量输入参量的函数值,例如,feval('fun',x,y,z)等价于求fun(x,y,z)值。

列在上面表中的许多字符串函数提供了基本的字符串语法分析能力。

例如,findstr返回一个在另一个字符串内字符串的起始下标值。

»b='PeterPiperpickedapeckofpickledpeppers';

»findstr(b,'')%findspace

ans=

6121921262937

»findstr(b,'p')%findtheletterp

ans=

9132230384041

»find(b=='p')%forsinglecharactersearchesthefindcommandworkstoo

ans=

9132230384041

»findstr(b,'cow')%findthewordcow

ans=

[]

»findstr(b,'pick')%findthestringpick

ans=

1330

注意这个函数对大小写是敏感的,当不匹配时,返回空矩阵。

findstr对字符串矩阵不起作用。

»strrep(b,'p','P')%capitalizeallp's

ans=

PeterPiPerPickedaPeckofPickledPePPers

»strrep(b,'Peter','Pamela')%changePetertoPamela

ans=

PamelaPiperpickedapeckofpickledpeppers

正如上面所看到的,strrep执行简单的字符串替代。

strrep对字符串矩阵不起作用。

函数strtok找出由特定字符指定的字符串内的标记,空格是缺省限定字符。

例如,

»disp(b)

PeterPiperpickedapeckofpickledpeppers

»strtok(b)%findfirsttokeninabovestringseparatedbywhitespace

ans=

Peter

»[c,r]=strtok(b)%returntheremainderofthestringarrayinr

c=

Peter

r=

Piperpickedapeckofpickledpeppers

»[d,s]=strtok(r)%findthenexttokenbyusingthepreviousremainder

d=

Piper

s=

pickedapeckofpickledpeppers

用空格作为限定符,strtok找出在数组中的单词。

strtok对字符串矩阵不起作用。

»[d,s]=strtok(b,'pP')%letdelimiterbeloweroruppercaseP

d=

eter

s=

Piperpickedapeckofpickledpeppers

如果提供一个可选的字符串,它的字符是限定符。

注意在标记里,不返回限定符,但返回所有限定符之前的字符。

也就是,在上面的字符串d=eter末端有一个空格。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 小学教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1