收藏 分享(赏)

03-Matlab字符数组.ppt

上传人:hyngb9260 文档编号:7294496 上传时间:2019-05-14 格式:PPT 页数:41 大小:234KB
下载 相关 举报
03-Matlab字符数组.ppt_第1页
第1页 / 共41页
03-Matlab字符数组.ppt_第2页
第2页 / 共41页
03-Matlab字符数组.ppt_第3页
第3页 / 共41页
03-Matlab字符数组.ppt_第4页
第4页 / 共41页
03-Matlab字符数组.ppt_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、,字符数组 Character Array ( Char Array ),一、创建字符数组 二、字符数组的操作 三、字符串和数值之间的转换函数 四、不同数制之间的转换函数,在MATLAB中,字符串(string)是作为字符数组来引入的。字符串按行向量进行存储,每一字符以其在字符集中的内部编码的形式存放。,1、 用单引号对 创建字符串(一维字符数组),s1 = %生成一个空字符串 s2 = M s3 = MathWorks s4 = Accelerating the pace of engineering and science s5 = Youre right! s6 = 矩阵实验室,必须将待

2、建字符串放在单引号对中; 每个字符占一个元素位,两个字节; 当字符串中本身包含单引号时,每个单引号符用连续的两个单引号表示;,注意:必须在英文状态下输入“单引号对”。,一、创建字符数组,2、使用 内部编码 创建字符串,s = char(x) 用字符的内部编码 x 创建相应的字符数组s,x为非负整数数组,实际的字符显示和给定的字符编码有关。x的范围为从0到65535,任何在此范围外的数据都没有定义。,字符编码的前128个编码即为ASCII码,s1 = char() %生成空字符串 s2 = char(97) s3 = char(97:122) s4 = char(97:122;65:90),x

3、= 19968:19968+99 X = reshape(x,10,10) X = X s = char(X),附:ASCII码表(7位),高三位 b6b5b4,低四位 b3b2b1b0,获取字符数组的内部编码,x =double(s) 或 x = abs(s) 把字符数组s转换为对应的内部编码数值数组x。可以对内部编码数值数组x进行数值数组的各种运算。但其结果就变成一般数值向量的运算,而不再是字符串的运算,可使用char( ) 函数把运算结果转化为对应字符串。,t = matlab x = double(t) - 32 s = char(x),miwen = Rfyqfg%2%Ymj%Qfs

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

5、个字符串变量用逗号“ , ”连接,构成一个长的单行字符串。,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 consisten

6、t.,利用方括号 ,可将多个字符串变量用分号“ ; ” 连接,构成一个多行字符串(二维字符数组),但是必须保证各行等长(每行的字符数目相等)。,解决办法:必须保证各行等长,可在较短字符串的末尾增加适当数量的 “空格” 。,错误原因: t1 6个字符 t2 17个字符,t1 = Hello, ; t2 = blanks(11); t3 = ; t4 = Nice to meet you!; s1 = t1, t2; t4 s2 = t1, t2; t3; t4,s = blanks(n) : 生成一个包含 n 个空格的字符串s,s1 =Hello, Nice to meet you!,s2 =H

7、ello, Nice to meet you!,空字符串会被忽略掉,5、 利用函数创建字符数组,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!,S = char(t1, t2, t3, .) 把t1,t2,t3,.作为行 ,空字符串不会被忽略,生成二维字符数组S,不必考虑每行的字符数是否相等,S的行数等于t1,t2,.的行数之和,S的列数等于最长的字符串的字符

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

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

10、的字符数是否相等, S的行数等于t1,t2,.的行数之和, S的列数等于最长的字符串的字符数目,较短字符串的末尾用空格补齐。每个字符参数 ti,本身是字符数组。,t1 = Hello, ; t2 = ; t3 = Nice to meet you!; s1 = strvcat(t1, t3) s2 = strvcat(t1, t2, t3),t = strcat(s1, s2, s3, .) 将字符数组s1,s2,s3的对应行级联(在水平方向上)。所有输入数组必须具有相同的行数。输入字符数组中尾部的空格被忽略,不出现在输出中。,a = hello b = goodbye c = strcat(

11、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),二、字符数组的操作,字符数组中元素及子数组的访问与赋值 一些通用函数 字符串检测函数 简单的字符串处理函数 字符串比较函数 字符串替换和查找函数 字符串执行函数,1、字符数组中元素及子数组的访问与赋值,与数值数组一

12、样,可用双下标,也可用单下标访问字符数组中的元素和子数组。,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、一些通用函数,size( ) 获得字符数组的大小(行数、列数) length( ) 获得字符数组的长度(行数、列数中的较大值) numel( ) 获得字符数组的字符总数(总数 =行数列数) disp( ) 在c

13、ommand 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

14、(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 中的

15、元素构成 ,其余位置元素为字符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中进行验证。,tf = ischar(A) 判断输入A是否为字符数组 ,如果输入数组A是字符数组,则返回逻辑1(真),否则返回逻辑0(假)。 tf = isletter(str) 返回大小和str一致的逻辑

16、数组tf,当str中元素为英文字母时,tf对应的元素为1,否则为0 tf = isspace(str) 返回大小和str一致的逻辑数组tf,当str中元素为空格、回车、制表、换行符等时,tf对应的元素为1,否则为0。,3、字符串检测函数,t1 = 1234abcdef t2 = Mat 矩阵 t3 = Matlab s = char(t1, t2, t3) L1 = ischar(s) L2 = isletter(s) L3 = isspace(s),blanks(n) 创建有n个空格组成的字符串 deblank(s) 删除字符串尾部的空格 strtrim(s) 删除字符串的开头和尾部的空格,

17、制表,回车符 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中进行验证。,4、简单的字符串处理函数,strjust() 调整字符串排列位置T = strjust(S) 右对齐

18、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),若字符串前部或尾部没有空格,则左对齐、右对齐、居中的效果完全相同。,TF = strcmp(str1, str2 ) 比较字符串str1和str2是否完全相等,是,返回逻辑1(真),否,返回逻辑0(假) TF

19、 = strcmpi(str1, str2 ) 比较字符串str1和str2是否完全相等,忽略字母大小写 TF = strncmp(str1, str2, n ) 比较字符串str1和str2前n列字符是否相等, TF = strncmpi(str1, str2 , n ) 比较字符串str1和str2前n个字符是否相等,忽略字母大小写,5、字符串比较函数,str = strrep(str1, str2, str3) 进行字符串替换,区分大小写。把str1中所有的子字符串str2用str3来替换,6、字符串替换和查找函数,s1 = This is a good example.; str =

20、strrep(s1, good, great),str =This is a great example.,strrep( ) 字符串替换 strfind( ) 查找字符串 findstr( ) 查找字符串 strmatch( ) 寻找符合条件的行 strtok( ) 在字符串里找出指定标记之前的子字符串,k = strfind(str, pattern) 在长字符串 str 中查找是否包含有短字符串 pattern。 若包含,返回数组k,其元素为pattern出现在str中的位置 若不包含,则返回空数组。,s1 = Find the starting indices of the patte

21、rn string; s2 = in; k1 = strfind(s1, s2) k2 = strfind(s2, s1) k3 = findstr(s1, s2) k4 = findstr(s2, s1),k1 =2 15 19 45,k = findstr(str1,str2) 查找str1和str2中,较短字符串在较长字符串中出现的位置,没有出现返回空数组。结果与str1、str2的顺序无关。,k2 = ? k3 = ? k4 = ?,x = strmatch(str, STRS) 检查字符数组STRS的每一行,若该行是以字符串str开始的,就把该行的行号输出至列数组x中。x = str

22、match(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:指定的分隔符,未指定delimit

23、er的话,默认为空格char(32), 水平制表符char(9) 和回车char(13)。,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中进行验证。,从str的第一个元素开始,第一个非分隔字符与其之后的第一个分隔符之间的字符串返回至token,之后的部分返回至remain;若第一个非分隔字符之后没有分隔符,则从第一个非分隔字符直到st

24、r的最后一个字符都被返回至token,remain则为空串。,使用eval( )命令“执行”某一字符串,就如同用户在MATLAB的Command窗口中输入此字符串并执行一样。,7、字符串执行函数eval( ),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 Classa 1x1 8 doubleb 1x1 8 doublec 1x1 8 double s1 1x5

25、10 chars2 1x3 6 chars3 1x7 14 char,a1, a2, a3, . = eval(myfun(b1, b2, b3, .) 执行函数myfun,输入参数为b1,b2,.,输出参数为a1,a2,.,eval(a1, a2, a3, . = myfun(b1, b2, b3, .) 也可以执行函数myfun,输入为b1,b2,.,输出为a1,a2,.,x = pi s = y = sin(x) eval(s),x = pi s = sin(x) y = eval(s),这种方式的语法检查不是很严格,可能会产生未曾捕获过的错误或不可预期的行为。,不建议使用这种方式,cl

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

27、验证你的想法是否正确。,三、字符串和数值之间的转换函数,int2str( ) 整数转换为字符串 num2str( ) 数值转换为字符串 mat2str ( ) 矩阵转换为字符串 str2double( ) 字符串转换为双精度 str2num( ) 字符串转换为数值,str = int2str(N) 将整数转换为整数格式的字符串。输入参数N可以是单一的整数、整数向量或整数矩阵。非整型值在转换前都会被四舍五入取整。,x = 2, 3, 5.7, 1/3, 2/3 s = int2str(x),s =2 3 6 0 1,str = num2str (A) 对数组A中元素取四位精度,并转换为相对应的字

28、符串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

29、.66667 s2 = 2 3 5.7 0.3333 0.6667 s3 = 2.0000 3.0000 5.7000 0.3333 0.6667,str = mat2str(A) 将矩阵A转化为字符,包含括号 ,这样可以使用eval(str) 命令产生原始矩阵(使用15位精度)。,str = mat2str(A,n) 使用 n 位精度将矩阵A转化为字符,t = magic(3) s = mat2str(t) A = eval(s),format long t = randn(3) s1 = mat2str(t) s2 = mat2str(t, 4) t1 = eval(s1) t2 = ev

30、al(s2),s =8 1 6;3 5 7;4 9 2A =8 1 63 5 74 9 2,X = str2double(str ) 把字符串str转换为双精度数值 若str2double()无法返回有效的双精度数值,则返回NaN。,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 = str2dou

31、ble(s),d1 = ? d2 = ?,字符串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.,X = str2double(C) C为cell数组,用大括号 创建,其元素为字符串 X为与C同维的数值数组,其元素为C数组中的每个字符串转换后的双精度数值,若str2double()无法返回有效的双精度数值,则返回NaN

32、。,C1 = 12, 3.45; -5.6e-1, 7+8i C2 = b12, 3 4; 5.6, 7 X1 = str2double(C1) X2 = str2double(C2),X1 =12.0000 3.4500 -0.5600 7.0000 + 8.0000i,X2 =NaN NaN5.6000 7.0000,X = str2num(str ) 把字符串str转换为双精度数值(组),若str2num()无法返回有效的数值,则返回空数组,s1 = 1 2 ; 3 4 s2 = 1 2m ; 3 4i d1 = str2num(s1) d2 = str2num(s2),d1 = ? d

33、2 = ?,字符串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,表示虚数单位),四、不同数制之间的转换函数,进位计数制,简称数制,是人们利用符号来计数的方法。二进制、十进制、八进制和十六进制是学习计算机知识应该掌握的数制。

34、R进制的数,都有以下三个要点: (1) 基数为R,即使用R个数码。 (2) 进位规则为逢R进一 (3) 第i个数位上的数码所具有的位权为Ri。 数值可用下面的通式表示:N = an-1Rn-1 + an-2Rn-2 + + a1R1 + a0R0 + + amR-m,b1 = 01010101; d1 = 123; d2 = bin2dec(b1) b2 = dec2bin(d1),d2 =85b2 = 1111011,bin2dec( ) 二进制字符串转换为十进制整数 dec2bin( ) 十进制非负整数转换为二进制字符串,h1 = a1; d1 = 1000; d2 = hex2dec(h

35、1) h2 = dec2hex(d1),d2 =161h2 = 3E8,hex2dec( ) 十六进制字符串转换为十进制整数 dec2hex( ) 十进制非负整数转换为十六进制字符串,d = base2dec(strn, base) 把base进制字符串strn转换为十进制整数base 为2和36之间的整数,str = dec2base(d, base) str = dec2base(d, base, n) 把非负十进制整数d转换为base进制字符串 , d 252 若指定n,且n比实际输出的字符数目大的话,则在输出的字符串前面补“0”字符,若n小于输出字符的数目,则n不起作用。,s = 11

36、1; d2 = base2dec(s,2) d3 = base2dec(s,3),d2 =7d3 =13,d = 39; s = dec2base(d,2) s = dec2base(d,2,8),s = 100111s = 00100111,s1 = z1; d1 = 12345 d2 = base2dec(s1,36) s2 = dec2base(d1,36),d2 = ? s2 = ?,base不能大于36的一个原因:,d = 0.25; h = num2hex(d) dd = hex2num(h),hex2num( ) 十六进制字符串转换为IEEE双精度数 num2hex( ) 单、双精度数转换为16进制字符串,h =3fd0000000000000dd =0.250000000000000,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报