410 likes | 760 Views
字符数组 Character Array ( Char Array ). 一、创建字符数组 二、字符数组的操作 三、字符串和数值之间的转换函数 四、不同数制之间的转换函数. 在 MATLAB 中,字符串 ( string ) 是作为 字符数组 来引入的。字符串按 行向量 进行存储,每一字符以其在字符集中的内部编码的形式存放。. 一、创建字符数组. 1 、 用单引号对‘ ’ 创建字符串(一维字符数组). 必须将待建字符串放在 单引号对 中; 每个字符占一个元素位,两个字节; 当字符串中本身包含单引号时,每个单引号符用 连续的两个单引号 表示;.
E N D
字符数组Character Array ( Char Array ) 一、创建字符数组 二、字符数组的操作 三、字符串和数值之间的转换函数 四、不同数制之间的转换函数 在MATLAB中,字符串(string)是作为字符数组来引入的。字符串按行向量进行存储,每一字符以其在字符集中的内部编码的形式存放。
一、创建字符数组 1、 用单引号对‘ ’创建字符串(一维字符数组) • 必须将待建字符串放在单引号对中; • 每个字符占一个元素位,两个字节; • 当字符串中本身包含单引号时,每个单引号符用连续的两个单引号表示; s1 = ''%生成一个空字符串 s2 = 'M' s3 = 'MathWorks' s4 = 'Accelerating the pace of engineering and science' s5 = 'You''re right!' s6 = '矩阵实验室' 注意:必须在英文状态下输入“单引号对”。
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])
附:ASCII码表(7位) 高三位b6b5b4 低四位 b3b2b1b0
获取字符数组的内部编码 x =double(s)或 x = abs(s)把字符数组s转换为对应的内部编码数值数组x。可以对内部编码数值数组x进行数值数组的各种运算。但其结果就变成一般数值向量的运算,而不再是字符串的运算,可使用char( ) 函数把运算结果转化为对应字符串。 t = 'matlab' x = double(t) - 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个字符 解决办法:必须保证各行等长,可在较短字符串的末尾增加适当数量的 “空格” 。
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! 空字符串会被忽略掉
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!
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!
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!
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)
二、字符数组的操作 • 字符数组中元素及子数组的访问与赋值 • 一些通用函数 • 字符串检测函数 • 简单的字符串处理函数 • 字符串比较函数 • 字符串替换和查找函数 • 字符串执行函数
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、一些通用函数 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中进行验证。
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)
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中进行验证。
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') 若字符串前部或尾部没有空格,则左对齐、右对齐、居中的效果完全相同。
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个字符是否相等,忽略字母大小写
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.
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中进行验证。
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
[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) 不建议使用这种方式
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中验证你的想法是否正确。
三、字符串和数值之间的转换函数 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)
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
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)
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 = ?
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
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 = ?
四、不同数制之间的转换函数 进位计数制,简称数制,是人们利用符号来计数的方法。二进制、十进制、八进制和十六进制是学习计算机知识应该掌握的数制。 R进制的数,都有以下三个要点: (1) 基数为R,即使用R个数码。 (2) 进位规则为逢R进一 (3) 第i个数位上的数码所具有的位权为Ri。 数值可用下面的通式表示: N = an-1Rn-1 + an-2Rn-2 + … + a1R1 + a0R0 + … + amR-m
bin2dec( ) 二进制字符串转换为十进制整数 dec2bin( )十进制非负整数转换为二进制字符串 b1 = '01010101'; d1 = 123; d2 = bin2dec(b1) b2 = dec2bin(d1) d2 = 85 b2 = 1111011
hex2dec( )十六进制字符串转换为十进制整数 dec2hex( ) 十进制非负整数转换为十六进制字符串 h1 = 'a1'; d1 = 1000; d2 = hex2dec(h1) h2 = dec2hex(d1) d2 = 161 h2 = 3E8
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)
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 = ?
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)