740 likes | 1.05k Views
字符数组 Character Array. 字符串在数据的可视化、应用程序的交互等方面有重要的作用。 MATLAB 中,字符串 ( string ) 是作为 字符数组 来引入的。字符串按 行向量 进行存储,每一字符以其在字符集中的内部编码的形式存放。. 一、创建字符数组 二、字符数组在绘图中的简单应用 三、字符数组的基本操作 四、字符串元胞数组 五、常用字符串函数. 一、创建字符数组. 1 、 用单引号对 ’ ’ 创建字符串(一维字符数组). 必须将待建字符串放在 单引号对 中; 每个字符占一个元素位,两个字节;
E N D
字符数组Character Array 字符串在数据的可视化、应用程序的交互等方面有重要的作用。MATLAB中,字符串(string)是作为字符数组来引入的。字符串按行向量进行存储,每一字符以其在字符集中的内部编码的形式存放。 一、创建字符数组 二、字符数组在绘图中的简单应用 三、字符数组的基本操作 四、字符串元胞数组 五、常用字符串函数
一、创建字符数组 1、 用单引号对 ’ ’ 创建字符串(一维字符数组) • 必须将待建字符串放在单引号对中; • 每个字符占一个元素位,两个字节; • 当字符串中本身包含单引号时,每个单引号符用连续的两个单引号表示; s1 = ''%生成一个空字符串 s2 = 'M' s3 = 'MathWorks' s4 = 'Accelerating the pace of engineering and science' s5 = 'You''re right!' s6 = '矩阵实验室' 注意:必须在英文状态下输入“单引号对”。
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])
附:ASCII码表(7位) 高三位b6b5b4 低四位 b3b2b1b0 字符0的编码:48 字符A的编码:65 字符a的编码:97
获取字符数组的内部编码 x =double(s)或 x = abs(s)把字符数组s转换为对应的内部编码数值数组x。可以对内部编码数值数组x进行数值数组的各种运算。但其结果就变成一般数值向量的运算,而不再是字符串的运算,可使用char( ) 函数把运算结果转化为对应字符串。 t = 'matlab' x = double(s1) - 32 s = char(x)
恺撒密码 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,它的基本思想是:通过把字母移动一定的位数来实现加密和解密。例如,如果密匙是把明文字母的位数向后移动三位,那么明文字母B就变成了密文的E,依次类推,X将变成A,Y变成B,Z变成C,由此可见,位数就是凯撒密码加密和解密的密钥。这个加密方法是以恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。 miwen = 'Rfyqfg%2%Ymj%Qfslzflj%Tk%Yjhmsnhfq%Htruzynsl' 练习:上面的密文是将明文的每个字符(包括字母、空格、符号)按acsii码表后移5位得到的,请破译这段密文。
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]
4、用[ ; ]创建多行(二维)字符数组 利用方括号[ ],可将多个字符串变量用分号“ ; ” 连接,构成一个多行字符串(二维字符数组),但是必须保证各行等长(每行的字符数目相等)。空字符串会被忽略掉。 t1 = 'Hello,' ; t2 = 'Nice to meet you!'; s=[t1; t2] ??? Error using ==> vertcat CAT arguments dimensions are not consistent. 错误原因: t1 6个字符 t2 17个字符 解决办法:必须保证各行等长,可在较短字符串的末尾增加适当数量的 “空格” 。
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!
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!
(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)
(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!
(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!
二、字符数组在绘图中的简单应用 1、 plot(x,y,LineSpec) 用字符数组 LineSpec 指定线型,点标记和画线的颜色 LineSpec的三种属性可以全部指定,也可以只指定其中某一个或两个,排列顺序任意。
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( )只绘制点标记
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点标记的大小
x = -pi:pi/10:pi; y = tan(sin(x)) - sin(tan(x)); plot(x,y,'--rs','LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g',... 'MarkerSize',10)
3、title(’text’) 添加图形标题 例:
4、xlabel( ) / ylabel( ) / zlabel( ) xlabel(’text’) 添加 X 坐标轴标注 ylabel(’text’) 添加 Y 坐标轴标注 zlabel(’text’) 添加 Z 坐标轴标注 例:
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)')
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)
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宏包(宏集、扩展),特别适合数学类论文、书籍的排版,也可以排版普通的文章和书籍。
(2)Tex字符的字体设置 \bf:设置字体为粗体字。 \it:设置字体为斜体字。 \sl:设置字体为斜体字,很少使用。 \rm:设置字体为正常字体。 \fontname{字体名}:设置字体名。例如:\fontname{宋体} \fontsize{字体大小}:设置字体大小。例如:\fontsize{16} _{下标} 表示下标,若下标只有一个字符,可省略{ } ^{上标} 表示上标,若上标只有一个字符,可省略{ }
例:使用TeX输入数学表达式 title('{\itAe}^{-\alpha\itt}sin\beta{\itt} \alpha<<\beta') xlabel('Time \musec.') ylabel('Amplitude')
(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}
例:使用TeX指定字符颜色 str = '黑{\color{red}红\color{green}绿\color[rgb]{0 0 1}蓝}黑' text(0.1,0.5,str,'fontsize',24,'fontname','黑体')
(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')
(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 资料
三、字符数组的基本操作 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中进行验证。
2、字符数组的关系运算 可以使用关系运算符进行字符数组的比较,但是要求比较的两个数组维数相同,或者其中一个是标量。 >> A = 'fate'; >> B = 'cake'; >> A == B ans = 0 1 0 1 >> A > B ans = 1 0 1 0
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中进行验证。
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中进行验证。
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中进行验证。
四、字符串元胞数组Cell Arrays of Strings 字符串元胞数组叫字符数组而言,其优点是不要求每个字符串的长度相同,给用户的数据输入和整合提供了方便。 1、使用{ }创建字符串元胞数组 >> cs1={'China','City','ShangHai'} cs1 = 'China' 'City' 'ShangHai' >> cs2={'China';'City';'ShangHai'} cs2 = 'China' 'City' 'ShangHai'
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()会在字符串尾部添加空格,使得每个字符串长度相同
3、iscellstr( ):判断一个数组是否为字符串元胞数组 tf = iscellstr(A) >> A = ['ab','cd']; >> B = {'ab','cd'}; >> iscellstr(A) ans = 0 >> iscellstr(B) ans = 1
五、常用字符串函数 1、字符串检测函数 2、简单的字符串处理函数 3、字符串比较函数 4、字符串替换和查找函数 5、字符串执行函数eval( ) 6、字符串和数值之间的转换函数 7、不同数制之间的转换函数 8、格式化输入输出
1、字符串检测函数 t1 = '1234abcdef' t2 = 'Mat 矩阵' t3 = 'Matlab' s = char(t1, t2, t3) L1 = ischar(s) L2 = isletter(s) L3 = isspace(s)
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中进行验证。
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') 若字符串前部或尾部没有空格,则左对齐、右对齐、居中的效果完全相同。
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个字符是否相等,忽略字母大小写
(1) 比较两个字符串 >> strcmp('Yes' ,'No') ans = 0 (2) 比较一个字符串和一个字符串元胞数组 >> a = 'upon'; >> b = {'Once' 'upon'; 'a' 'time'}; >> strcmp(a, b) ans = 0 1 0 0
(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
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.
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 = ?
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')
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中进行验证。
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
[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) 不建议使用这种方式