1 / 73

字符数组 Character Array

字符数组 Character Array.   字符串在数据的可视化、应用程序的交互等方面有重要的作用。 MATLAB 中,字符串 ( string ) 是作为 字符数组 来引入的。字符串按 行向量 进行存储,每一字符以其在字符集中的内部编码的形式存放。. 一、创建字符数组 二、字符数组在绘图中的简单应用 三、字符数组的基本操作 四、字符串元胞数组 五、常用字符串函数. 一、创建字符数组. 1 、 用单引号对 ’ ’ 创建字符串(一维字符数组). 必须将待建字符串放在 单引号对 中; 每个字符占一个元素位,两个字节;

jael-glenn
Télécharger la présentation

字符数组 Character Array

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 字符数组Character Array   字符串在数据的可视化、应用程序的交互等方面有重要的作用。MATLAB中,字符串(string)是作为字符数组来引入的。字符串按行向量进行存储,每一字符以其在字符集中的内部编码的形式存放。 一、创建字符数组 二、字符数组在绘图中的简单应用 三、字符数组的基本操作 四、字符串元胞数组 五、常用字符串函数

  2. 一、创建字符数组 1、 用单引号对 ’ ’ 创建字符串(一维字符数组) • 必须将待建字符串放在单引号对中; • 每个字符占一个元素位,两个字节; • 当字符串中本身包含单引号时,每个单引号符用连续的两个单引号表示; s1 = ''%生成一个空字符串 s2 = 'M' s3 = 'MathWorks' s4 = 'Accelerating the pace of engineering and science' s5 = 'You''re right!' s6 = '矩阵实验室' 注意:必须在英文状态下输入“单引号对”。

  3. 2、函数char():使用内部编码创建字符串 s = char(x)用字符的内部编码 x 创建相应的字符数组s,x为非负整数数组,实际的字符显示和给定的字符编码有关。x的范围为从0到65535,任何在此范围外的数据都没有定义。 字符编码的前128个编码即为ASCII码 x = 19968:19968+99 X = reshape(x,10,10) X = X' s = char(X) s1 = char() %生成空字符串 s2 = char(97) s3 = char(97:122) s4 = char([97:122;65:90])

  4. 附:ASCII码表(7位) 高三位b6b5b4 低四位 b3b2b1b0 字符0的编码:48 字符A的编码:65 字符a的编码:97

  5. 获取字符数组的内部编码 x =double(s)或 x = abs(s)把字符数组s转换为对应的内部编码数值数组x。可以对内部编码数值数组x进行数值数组的各种运算。但其结果就变成一般数值向量的运算,而不再是字符串的运算,可使用char( ) 函数把运算结果转化为对应字符串。 t = 'matlab' x = double(s1) - 32 s = char(x)

  6. 恺撒密码 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,它的基本思想是:通过把字母移动一定的位数来实现加密和解密。例如,如果密匙是把明文字母的位数向后移动三位,那么明文字母B就变成了密文的E,依次类推,X将变成A,Y变成B,Z变成C,由此可见,位数就是凯撒密码加密和解密的密钥。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。 miwen = 'Rfyqfg%2%Ymj%Qfslzflj%Tk%Yjhmsnhfq%Htruzynsl' 练习:上面的密文是将明文的每个字符(包括字母、空格、符号)按acsii码表后移5位得到的,请破译这段密文。

  7. 3、用 [ , ]创建字符串(一维字符数组) 利用方括号[ ],可将多个字符串变量用逗号“ , ”连接,构成一个长的单行字符串。 t1 = ''; t2 = 'MATLAB - '; t3 = 'The Language Of Technical Computing'; t4 = '科学计算语言'; s1 = [t1, t2, t3] s2 = [t2, t3] s3 = [t1, t2, t4] s4 = [t2, t1, t4]

  8. 4、用[ ; ]创建多行(二维)字符数组 利用方括号[ ],可将多个字符串变量用分号“ ; ” 连接,构成一个多行字符串(二维字符数组),但是必须保证各行等长(每行的字符数目相等)。空字符串会被忽略掉。 t1 = 'Hello,' ; t2 = 'Nice to meet you!'; s=[t1; t2] ??? Error using ==> vertcat CAT arguments dimensions are not consistent. 错误原因: t1 6个字符 t2 17个字符 解决办法:必须保证各行等长,可在较短字符串的末尾增加适当数量的 “空格” 。

  9. 5、函数blanks(n):创建包含 n 个空格的字符串s t1 = 'Hello,' ; t2 = blanks(11); t3 = ''; t4 = 'Nice to meet you!'; s1 = [t1, t2; t4] s2 = [t1, t2; t3; t4] s1 = Hello, Nice to meet you! s2 = Hello, Nice to meet you!

  10. 6、 创建字符数组的一些常用函数 (1) S = strvcat (t1, t2, t3, ...) 把t1,t2,t3,...作为行,空字符串会被忽略掉,生成二维字符数组S,不必考虑每行的字符数是否相等, S的行数等于t1,t2,...的行数之和, S的列数等于最长的字符串的字符数目,较短字符串的末尾用空格补齐。每个字符参数 ti,本身是字符数组。 t1 = 'Hello,' ; t2 = ''; t3 = 'Nice to meet you!'; s1 = strvcat(t1, t3) s2 = strvcat(t1, t2, t3) s1 = Hello, Nice to meet you! s2 = Hello, Nice to meet you!

  11. (2) t = strcat(s1, s2, s3, ...)将字符数组s1,s2,s3的对应行级联(在水平方向上)。所有输入数组必须具有相同的行数。输入字符数组中尾部的空格被忽略,不出现在输出中。 a = 'hello ' b = 'goodbye' c = strcat(a, b) c = hellogoodbye s1 = strvcat('MathWorks - ','Matlab - ') s2 = ' Accelerating the pace of engineering and science' s3 = ' The Language Of Technical Computing' s4 = strvcat(s2,s3) s5 = strcat(s1,s4)

  12. (3) S = char(t1, t2, t3, ...)把t1,t2,t3,...作为行 ,空字符串不会被忽略,生成二维字符数组S,不必考虑每行的字符数是否相等,S的行数等于t1,t2,...的行数之和,S的列数等于最长的字符串的字符数目,较短字符串的末尾用空格补齐。每个字符参数 ti,本身是字符数组。 t1 = 'Hello,' ; t2 = ''; t3 = 'Nice to meet you!'; s1 = char(t1, t3) s2 = char(t1, t2, t3) s1 = Hello, Nice to meet you! s2 = Hello, Nice to meet you!

  13. (4) S = str2mat (t1, t2, t3, ...)把t1,t2,t3,...作为行,空字符串不会被忽略,生成二维字符数组S,不必考虑每行的字符数是否相等, S的行数等于t1,t2,...的行数之和,S的列数等于最长的字符串的字符数目,较短字符串的末尾用空格补齐。每个字符参数 ti,本身是字符数组。 t1 = 'Hello,' ; t2 = ''; t3 = 'Nice to meet you!'; s1 = str2mat(t1, t3) s2 = str2mat(t1, t2, t3) str2mat(t1,t2,...)的功能与char(t1,t2,...)一样,matlab在帮助中说明: This routine will become obsolete(已不用的;已废弃的;过时的 ) in a future version. Use char instead s2 = Hello, Nice to meet you! s1 = Hello, Nice to meet you!

  14. 二、字符数组在绘图中的简单应用 1、 plot(x,y,LineSpec) 用字符数组 LineSpec 指定线型,点标记和画线的颜色 LineSpec的三种属性可以全部指定,也可以只指定其中某一个或两个,排列顺序任意。

  15. x = 0:0.2:2*pi y = sin(x) plot(x,y,'ro') x = 0:0.2:2*pi y = sin(x) plot(x,y,'r-o') 指定不指定线型的话,plot( )只绘制点标记

  16. filled markers circle, square, diamond, pentagram, hexagram, and the four triangles) 2、plot(x,y,LineSpec,‘PropertyName’,PropertyValue)对plot生成的图形对象,用指定的properties进行设置。 用字符数组‘PropertyName’指定具体的属性 PropertyName Color 非标准颜色可用[r,g,b]指定,r,g,b取0和1之间的数值 LineWidth 线宽 LineStyle 线型 Marker 点标记 MarkerEdgeColormarker的颜色(或 filled markers边的颜色) MarkerFaceColor the face of filled markers的颜色 MarkerSize点标记的大小

  17. x = -pi:pi/10:pi; y = tan(sin(x)) - sin(tan(x)); plot(x,y,'--rs','LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',10)

  18. 3、title(’text’) 添加图形标题 例:

  19. 4、xlabel( ) / ylabel( ) / zlabel( ) xlabel(’text’) 添加 X 坐标轴标注 ylabel(’text’) 添加 Y 坐标轴标注 zlabel(’text’) 添加 Z 坐标轴标注 例:

  20. 5、legend(string1,string2, ...) 在图形中添加图例 x = 0:0.05: 7 y1 = log10(x) y2 = sin(x) plot(x,y1,'b',x,y2,'r') axis([0,7,-2,2]) legend('Log(x)','Sin(x)')

  21. 6、text( ) 在图形中指定位置添加文本 text(x,y,string) 在点 (x,y) 处添加文本 text(x,y,string,'PropertyName',PropertyValue...) x = 0:0.05: 7 y = log10(x) plot(x,y) s = '\leftarrow Log(x)' text(2, 0.2, s, 'fontsize',20)

  22. 7、使用TeX / LaTeX在图形中添加希腊字母、数学符号及公式 在Matlab的text对象的函数中(函数 title、xlabel、ylabel、zlabel、text、legend),说明文字除使用标准的ASCII字符外,还可使用 TeX / LaTeX 格式的控制字符,这样就可以在图形中添加希腊字母、数学符号及公式等内容。Matlab支持两个层次的 TeX ,通过 text的 Interpreter属性来设置: ‘tex’ — 默认设置,支持 TeX 的一个子集 ‘latex’ — 支持 LaTeX ‘none’ — 不支持 TeX是D.E.Knuth 开发的免费的功能强大的排版系统,是公认的数学公式排得最好的系统。 LaTeX是由L.Lamport编写的一个目前最流行的TeX宏包(宏集、扩展),特别适合数学类论文、书籍的排版,也可以排版普通的文章和书籍。

  23. (1)TeX Character Sequence

  24. (2)Tex字符的字体设置 \bf:设置字体为粗体字。 \it:设置字体为斜体字。 \sl:设置字体为斜体字,很少使用。 \rm:设置字体为正常字体。 \fontname{字体名}:设置字体名。例如:\fontname{宋体} \fontsize{字体大小}:设置字体大小。例如:\fontsize{16} _{下标} 表示下标,若下标只有一个字符,可省略{ } ^{上标} 表示上标,若上标只有一个字符,可省略{ }

  25. 例:使用TeX输入数学表达式 title('{\itAe}^{-\alpha\itt}sin\beta{\itt} \alpha<<\beta') xlabel('Time \musec.') ylabel('Amplitude')

  26. (3)Tex字符的颜色设置 \color{颜色名}颜色名 颜色名有12种,分别为red、green、yellow、magenta、blue、black、white、cyan、gray、barkGreen、orange和lightBlue。 例如:\color{magenta}magenta \color[rgb]{a b c} 设置字体颜色为RGB矩阵[a b c]所表示的颜色。 a、b和c都在[0 1] 范围内。 例如:color[rgb]{0 .5 .5}

  27. 例:使用TeX指定字符颜色 str = '黑{\color{red}红\color{green}绿\color[rgb]{0 0 1}蓝}黑' text(0.1,0.5,str,'fontsize',24,'fontname','黑体')

  28. (4)使用Latex 在matlab中,使用Latex命令可用下面的方法: \( LaTeX命令 \) $ LaTeX命令$ $$ LaTeX命令$$ s1 = '$y_1=e^xsin(x)$' s2 = '$$y_2=\frac{1}{2}\sqrt[3]{x}$$' str = char(s1,s2) text(0.2, 0.5, str, 'Interpreter', 'latex', 'FontSize',16) legend( )函数必须先获得句柄,才可以设置Interpreter属性 h = legend(str1, str2, … ) set(h,'interprete','latex')

  29. (5)常用 LaTeX 命令 上标用 ^{上标},下标用 _{下标},希腊字母与TeX一样,用 \alpha 等表示 分式 $$\frac{分子}{分母}$$ 根式 $$\sqrt{x}$$ 、$$\sqrt[n]{x}$$ 求和 $$\sum_{i=1}^{n} x_{i}$$ 积分 $$\int_{0}^{1}$$ 偏微分 $$ \frac {\partial{y} }{\partial{x} } $$ 极限 $$\lim_{n \rightarrow \infty}$$ %n趋于无穷符号在lim正下方 $\lim_{n \rightarrow \infty}$ %n趋于无穷符号在lim右下角 上划线 $$\overline{x}$$ 下划线 $$\underline{x}$$ %下划线在x的正下方 卧式花括号命令 $$\overbrace{x+y+z+w}$$ 仰式花括号命令 $$a+\underbrace{b+c+d} $$ 更多的 LaTeX 命令请参考相关的 LaTeX 资料

  30. 三、字符数组的基本操作 1、字符数组中元素及子数组的访问与赋值 与数值数组一样,可用双下标,也可用单下标访问字符数组中的元素和子数组。 s = strvcat('MathWorks','Matlab') ch1 = s(2,5) ch2 = s(11) s1 = s(:,end:-1:1) s(16) = 'x' s(2,9) = 'y' s(:,1) = [] s(:,end) = 'z' d = s(:) 练习:试写出这些matlab语句的输出结果,并在matlab中进行验证。

  31. 2、字符数组的关系运算   可以使用关系运算符进行字符数组的比较,但是要求比较的两个数组维数相同,或者其中一个是标量。 >> A = 'fate'; >> B = 'cake'; >> A == B ans = 0 1 0 1 >> A > B ans = 1 0 1 0

  32. 3、一些通用函数 size( ) 获得字符数组的大小(行数、列数) length( ) 获得字符数组的长度(行数、列数中的较大值) numel( ) 获得字符数组的字符总数(总数 =行数×列数) disp( ) 在command windows中显示字符数组的内容 sort( )按照字符的内部编码值对字符串排序 s = strvcat('MathWorks','Matlab'); len = length(s) [r,c]=size(s) n = numel(s) disp(s) s1 = sort(s) s2 = sort(s,2) s2 = sort(s,'descend') s2 = sort(s,2,'descend') 练习:试写出这些matlab语句的输出结果,并在matlab中进行验证。

  33. S.' 或 S' 对字符数组S进行转置操作 reshape(S,m,n) 总元素数目不变,改变字符数组的行、列 repmat(S,m,n ) 按指定行、列平铺字符数组 rot90(S,k) 逆时针旋转字符数组 fliplr(S) 左右翻转字符数组 flipud (S ) 上下翻转字符数组 s = char(65:89) s1 = reshape(s, 5, 5) s2 = s1.' s3 = rot90(s2) s4 = fliplr(s3) s5 = flipud(s4) s6 = repmat(s5,2,2) 练习:试写出这些matlab语句的输出结果,并在matlab中进行验证。

  34. diag(S,k) 提取二维字符数组S的第k条对角线元素 diag(t,k) 构成二维字符数组,其第k条对角线的元素由一维字符数组 t 中的元素构成 ,其余位置元素为字符char(0) tril(S) 、triu(S) 提取字符数组的下(上)三角元素,其余位置元素以字符char(0)替换 x = reshape(65:89, 5, 5) s = char(x) s1 = tril(s) s2 = triu(s) s3 = diag(s,1) s4 = diag(s3) 练习:试写出这些matlab语句的输出结果,并在matlab中进行验证。

  35. 四、字符串元胞数组Cell Arrays of Strings   字符串元胞数组叫字符数组而言,其优点是不要求每个字符串的长度相同,给用户的数据输入和整合提供了方便。 1、使用{ }创建字符串元胞数组 >> cs1={'China','City','ShangHai'} cs1 = 'China' 'City' 'ShangHai' >> cs2={'China';'City';'ShangHai'} cs2 = 'China' 'City' 'ShangHai'

  36. 2、cellstr( ):将普通字符数组转为字符串元胞数组 >> data = ['Allison Jones';'Development ';' Phoenix ']; >> celldata = cellstr(data) celldata = 'Allison Jones' 'Development' ' Phoenix' cellstr()会删除字符串尾部的空格 char( ):可将字符串元胞数组转为普通字符数组 >> str = char(celldata) str = Allison Jones Development Phoenix char()会在字符串尾部添加空格,使得每个字符串长度相同

  37. 3、iscellstr( ):判断一个数组是否为字符串元胞数组 tf = iscellstr(A) >> A = ['ab','cd']; >> B = {'ab','cd'}; >> iscellstr(A) ans = 0 >> iscellstr(B) ans = 1

  38. 五、常用字符串函数 1、字符串检测函数 2、简单的字符串处理函数 3、字符串比较函数 4、字符串替换和查找函数 5、字符串执行函数eval( ) 6、字符串和数值之间的转换函数 7、不同数制之间的转换函数 8、格式化输入输出

  39. 1、字符串检测函数 t1 = '1234abcdef' t2 = 'Mat 矩阵' t3 = 'Matlab' s = char(t1, t2, t3) L1 = ischar(s) L2 = isletter(s) L3 = isspace(s)

  40. 2、简单的字符串处理函数 deblank(s)删除字符串尾部的空格strtrim(s)删除字符串的开头和尾部的空格,制表,回车符lower(s)将字符串中的字母转换成小写upper(s)将字符串中的字母转换成大写 b = blanks(10) t = 'Matlab 2008a' s = [b, t ,b, t, b] L = length(s) s1 = deblank(s) L1 = length(s1) s2 = strtrim(s1) L2 = length(s2) s3 = lower(s2) s4 = upper(s3) 练习:试写出这些matlab语句的输出结果,并在matlab中进行验证。

  41. strjust() 调整字符串排列位置 T = strjust(S) 左对齐 T = strjust(S, ‘right’) 右对齐 T = strjust(S, ‘left’) 左对齐 T = strjust(S, ‘center’) 居中 S = [blanks(10), 'a b c d e', blanks(30)] T1 = strjust(S) T2 = strjust(S, 'right') T3 = strjust(S, 'left') T4 = strjust(S, 'center') 若字符串前部或尾部没有空格,则左对齐、右对齐、居中的效果完全相同。

  42. 3、字符串比较函数 TF = strcmp('str1', 'str2') 比较字符串str1和str2是否完全相等,是,返回逻辑1(真),否,返回逻辑0(假) TF = strcmpi('str1', 'str2') 比较字符串str1和str2是否完全相等,忽略字母大小写 TF = strncmp('str1', 'str2', n) 比较字符串str1和str2前n列字符是否相等, TF = strncmpi('str1', 'str2', n ) 比较字符串str1和str2前n个字符是否相等,忽略字母大小写

  43. (1) 比较两个字符串 >> strcmp('Yes' ,'No') ans = 0 (2) 比较一个字符串和一个字符串元胞数组 >> a = 'upon'; >> b = {'Once' 'upon'; 'a' 'time'}; >> strcmp(a, b) ans = 0 1 0 0

  44. (3) 比较两个字符串元胞数组 >> c = {'Time' 'flies' 'when'; 'you''re' 'having' 'fun.'}; >> d = {'Time' 'drags' 'when'; 'you''re' 'anxiously' 'waiting.'}; >> strcmp(c, d) ans = 1 0 1 1 0 0

  45. 4、字符串替换和查找函数 strrep( ) 字符串替换 strfind( ) 查找字符串 findstr( ) 查找字符串 strmatch( ) 寻找符合条件的行 strtok( ) 在字符串里找出指定标记之前的子字符串   这些函数均可用于字符串元胞数组,具体用法请参考matlab帮助文件。 str = strrep(str1, str2, str3) 进行字符串替换,区分大小写。把str1中所有的子字符串str2用str3来替换 s1 = 'This is a good example.'; str = strrep(s1, 'good', 'great') str = This is a great example.

  46. k = strfind(str, pattern) 在长字符串 str 中查找是否包含有短字符串 pattern。 若包含,返回数组k,其元素为pattern出现在str中的位置 若不包含,则返回空数组。 k = findstr(str1,str2) 查找str1和str2中,较短字符串在较长字符串中出现的位置,没有出现返回空数组。结果与str1、str2的顺序无关。 s1 = 'Find the starting indices of the pattern string'; s2 = 'in'; k1 = strfind(s1, s2) k2 = strfind(s2, s1) k3 = findstr(s1, s2) k4 = findstr(s2, s1) k1 = 2 15 19 45 k2 = ? k3 = ? k4 = ?

  47. x = strmatch(‘str’, STRS) 检查字符数组STRS的每一行,若该行是以字符串str开始的,就把该行的行号输出至列数组x中。 x = strmatch(‘str’, STRS, ‘exact’)检查字符数组STRS的每一行,若该行与str完全相同,就把该行的行号输出至列数组x中。 t1 = 'max' t2 = 'minimax' t3 = 'maximum' t4 = 'max imum' t5 = 'max就是最大的意思' S = char(t1,t2,t3,t4,t5) x1 = strmatch(t1,S) x2 = strmatch(t1,S,'exact')

  48. token = strtok('str', delimiter) [token, remain] = strtok('str', ...) str:字符串 delimiter:指定的分隔符,未指定delimiter的话,默认为空格char(32), 水平制表符char(9) 和回车char(13)。 从str的第一个元素开始,第一个非分隔字符与其之后的第一个分隔符之间的字符串返回至token,之后的部分返回至remain;若第一个非分隔字符之后没有分隔符,则从第一个非分隔字符直到str的最后一个字符都被返回至token,remain则为空串。 s = ['aaabcd',char(32),'matlab',char(32),'矩阵实验室'] [t1, r1] = strtok(s) [t2, r2] = strtok(s,'a') [t3, r3] = strtok(s,'b') [t4, r4] = strtok(s,'w') 练习:试写出这些matlab语句的输出结果,并在matlab中进行验证。

  49. 5、字符串执行函数eval( ) 使用eval( )命令“执行”某一字符串,就如同用户在MATLAB的Command窗口中输入此字符串并执行一样。 eval(expression)在matlab中执行expression clc clear all s1 = 'a = 2'; s2 = '3*a'; eval(s1) b = eval(s2) s3 = ['c = ',s2]; eval(s3) whos Name Size Bytes Class a 1x1 8 double b 1x1 8 double c 1x1 8 double s1 1x5 10 char s2 1x3 6 char s3 1x7 14 char

  50. [a1, a2, a3, ...] = eval('myfun(b1, b2, b3, ...)') 执行函数myfun,输入参数为b1,b2,...,输出参数为a1,a2,... x = pi s = 'sin(x)' y = eval(s) eval(‘[a1, a2, a3, ...] = myfun(b1, b2, b3, ...)') 也可以执行函数myfun,输入为b1,b2,...,输出为a1,a2,... 这种方式的语法检查不是很严格,可能会产生未曾捕获过的错误或不可预期的行为。 x = pi s = 'y = sin(x)' eval(s) 不建议使用这种方式

More Related