1 / 41

字符数组 Character Array ( Char Array )

字符数组 Character Array ( Char Array ). 一、创建字符数组 二、字符数组的操作 三、字符串和数值之间的转换函数 四、不同数制之间的转换函数. 在 MATLAB 中,字符串 ( string ) 是作为 字符数组 来引入的。字符串按 行向量 进行存储,每一字符以其在字符集中的内部编码的形式存放。. 一、创建字符数组. 1 、 用单引号对‘ ’ 创建字符串(一维字符数组). 必须将待建字符串放在 单引号对 中; 每个字符占一个元素位,两个字节; 当字符串中本身包含单引号时,每个单引号符用 连续的两个单引号 表示;.

joelle
Download Presentation

字符数组 Character Array ( Char 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 ( Char 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、使用 内部编码 创建字符串 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

  5. 获取字符数组的内部编码 x =double(s)或 x = abs(s)把字符数组s转换为对应的内部编码数值数组x。可以对内部编码数值数组x进行数值数组的各种运算。但其结果就变成一般数值向量的运算,而不再是字符串的运算,可使用char( ) 函数把运算结果转化为对应字符串。 t = 'matlab' x = double(t) - 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. s = 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. 5、 利用函数创建字符数组 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) s2 = Hello, Nice to meet you! s1 = Hello, Nice to meet you!

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

  12. 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!

  13. 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)

  14. 二、字符数组的操作 • 字符数组中元素及子数组的访问与赋值 • 一些通用函数 • 字符串检测函数 • 简单的字符串处理函数 • 字符串比较函数 • 字符串替换和查找函数 • 字符串执行函数

  15. 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中进行验证。

  16. 2、一些通用函数 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中进行验证。

  17. 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中进行验证。

  18. 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中进行验证。

  19. 3、字符串检测函数 tf = ischar(A) 判断输入A是否为字符数组 ,如果输入数组A是字符数组,则返回逻辑1(真),否则返回逻辑0(假)。 tf = isletter('str') 返回大小和str一致的逻辑数组tf,当str中元素为英文字母时,tf对应的元素为1,否则为0 tf = isspace('str') 返回大小和str一致的逻辑数组tf,当str中元素为空格、回车、制表、换行符等时,tf对应的元素为1,否则为0。 t1 = '1234abcdef' t2 = 'Mat 矩阵' t3 = 'Matlab' s = char(t1, t2, t3) L1 = ischar(s) L2 = isletter(s) L3 = isspace(s)

  20. 4、简单的字符串处理函数 blanks(n)创建有n个空格组成的字符串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中进行验证。

  21. 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') 若字符串前部或尾部没有空格,则左对齐、右对齐、居中的效果完全相同。

  22. 5、字符串比较函数 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个字符是否相等,忽略字母大小写

  23. 6、字符串替换和查找函数 strrep( ) 字符串替换 strfind( ) 查找字符串 findstr( ) 查找字符串 strmatch( ) 寻找符合条件的行 strtok( ) 在字符串里找出指定标记之前的子字符串 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.

  24. 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 = ?

  25. 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')

  26. 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中进行验证。

  27. 7、字符串执行函数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

  28. [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) 不建议使用这种方式

  29. clc clear all for n = 1:5 s=['x',int2str(n),'=n;']; eval(s); end clc clear all for n = 1:5 xn=n; end 这些语句执行完后,matlab的工作区中共有几个变量?变量名是什么?变量的值是什么?若换成右边的语句情况如何? clc clear all x = eye(3); for r = 1:3 for c = 1:3 s = ['x(' , int2str(r) , ',' , int2str(c) , ') = ' , int2str(x(r,c))]; disp(s); end end 这些matlab语句在屏幕上输出的结果是什么?在matlab中验证你的想法是否正确。

  30. 三、字符串和数值之间的转换函数 int2str( ) 整数转换为字符串 num2str( ) 数值转换为字符串 mat2str ( ) 矩阵转换为字符串 str2double( ) 字符串转换为双精度 str2num( ) 字符串转换为数值 str = int2str(N)将整数转换为整数格式的字符串。输入参数N可以是单一的整数、整数向量或整数矩阵。非整型值在转换前都会被四舍五入取整。 s = 2 3 6 0 1 x = [2, 3, 5.7, 1/3, 2/3] s = int2str(x)

  31. str = num2str (A)对数组A中元素取四位精度,并转换为相对应的字符串str ,末尾多余的0将省略 str = num2str(A, precision) 对数组A中元素按照指定的精度precision取值,并转换为相对应的字符串str, 末尾多余的0将省略 。参数precision指定输出字符str的位数。 str = num2str(A, format) 按照指定的格式format来转化,具体的format可参考fprintf函数的帮助中的相关说明。 x = [2, 3, 5.7, 1/3, 2/3] s1 = num2str(x) s2 = num2str(x,4) s3 = num2str(x,'%11.4f') s1 = 2 3 5.7 0.33333 0.66667 s2 = 2 3 5.7 0.3333 0.6667 s3 = 2.0000 3.0000 5.7000 0.3333 0.6667

  32. str = mat2str(A) 将矩阵A转化为字符,包含括号[ ],这样可以使用eval(str) 命令产生原始矩阵(使用15位精度)。 str = mat2str(A,n) 使用 n 位精度将矩阵A转化为字符 t = magic(3) s = mat2str(t) A = eval(s) s = [8 1 6;3 5 7;4 9 2] A = 8 1 6 3 5 7 4 9 2 format long t = randn(3) s1 = mat2str(t) s2 = mat2str(t, 4) t1 = eval(s1) t2 = eval(s2)

  33. X = str2double(‘str’ ) 把字符串str转换为双精度数值 若str2double()无法返回有效的双精度数值,则返回NaN。 字符串str内可以包含下列字符: digits, a comma (thousands separator), a decimal point, a leading + or - sign, an e preceding a power of 10 scale factor, and an i for a complex unit. a = str2double('123.45e7') b = str2double('123 + 45i') c = str2double('3.14159') d = str2double('2.7i - 3.14') e = str2double('1,200.34') f = str2double('3.4a') s = '12' d1 = double(s) d2 = str2double(s) d1 = ? d2 = ?

  34. X = str2double(C) C为cell数组,用大括号{ }创建,其元素为字符串 X为与C同维的数值数组,其元素为C数组中的每个字符串转换后的双精度数值,若str2double()无法返回有效的双精度数值,则返回NaN。 C1 = {'12', '3.45'; '-5.6e-1', '7+8i'} C2 = {'b12', '3 4'; '5.6', '7'} X1 = str2double(C1) X2 = str2double(C2) X2 = NaN NaN 5.6000 7.0000 X1 = 12.0000 3.4500 -0.5600 7.0000 + 8.0000i

  35. X = str2num(‘str’ ) 把字符串str转换为双精度数值(组),若str2num()无法返回有效的数值,则返回空数组[] 字符串str内可以包含如下字符: * Digits(数字) * A decimal point(小数点) * A leading + or – sign(正号、负号) * A letter e or d preceding a power of 10 scale factor(字母e或d,表示10的幂) * A letter i or j indicating a complex or imaginary number(字母i或j,表示虚数单位) s1 = ['1 2' ; '3 4'] s2 = ['1 2m' ; '3 4i'] d1 = str2num(s1) d2 = str2num(s2) d1 = ? d2 = ?

  36. 四、不同数制之间的转换函数 进位计数制,简称数制,是人们利用符号来计数的方法。二进制、十进制、八进制和十六进制是学习计算机知识应该掌握的数制。 R进制的数,都有以下三个要点: (1) 基数为R,即使用R个数码。 (2) 进位规则为逢R进一 (3) 第i个数位上的数码所具有的位权为Ri。 数值可用下面的通式表示: N = an-1Rn-1 + an-2Rn-2 + … + a1R1 + a0R0 + … + amR-m

  37. bin2dec( ) 二进制字符串转换为十进制整数 dec2bin( )十进制非负整数转换为二进制字符串 b1 = '01010101'; d1 = 123; d2 = bin2dec(b1) b2 = dec2bin(d1) d2 = 85 b2 = 1111011

  38. hex2dec( )十六进制字符串转换为十进制整数 dec2hex( ) 十进制非负整数转换为十六进制字符串 h1 = 'a1'; d1 = 1000; d2 = hex2dec(h1) h2 = dec2hex(d1) d2 = 161 h2 = 3E8

  39. d = base2dec('strn', base) 把base进制字符串strn转换为十进制整数base 为2和36之间的整数 d2 = 7 d3 = 13 s = '111'; d2 = base2dec(s,2) d3 = base2dec(s,3) str = dec2base(d, base) str = dec2base(d, base, n) 把非负十进制整数d转换为base进制字符串 , d< 2^52 若指定n,且n比实际输出的字符数目大的话,则在输出的字符串前面补“0”字符,若n小于输出字符的数目,则n不起作用。 s = 100111 s = 00100111 d = 39; s = dec2base(d,2) s = dec2base(d,2,8)

  40. 36进制的基(A和a都表示10): 0 1 2 3 4 5 6 7 8 9 A B C …… X Y Z 10 11 12 ……33 34 35 base不能大于36的一个原因: s1 = 'z1'; d1 = 12345 d2 = base2dec(s1,36) s2 = dec2base(d1,36) d2 = ? s2 = ?

  41. 00111111 3 f d 0 0 0 0 0 0 0 0 0 0 0 0 0 hex2num( )十六进制字符串转换为IEEE双精度数 num2hex( )单、双精度数转换为16进制字符串 h = 3fd0000000000000 dd = 0.250000000000000 d = 0.25; h = num2hex(d) dd = hex2num(h)

More Related