Document

字符数组
Character Array
( Char Array )
在MATLAB中,字符串(string)是作为字符数
组来引入的。字符串按行向量进行存储,每一字符以
其在字符集中的内部编码的形式存放。
一、创建字符数组
二、字符数组的操作
三、字符串和数值之间的转换函数
四、不同数制之间的转换函数
一、创建字符数组
1、 用单引号对‘ ’创建字符串(一维字符数组)
必须将待建字符串放在单引号对中;
每个字符占一个元素位,两个字节;
当字符串中本身包含单引号时,每个单引号符用连续的两个
单引号表示;
s1
s2
s3
s4
s5
s6
=
=
=
=
=
=
''
%生成一个空字符串
'M'
'MathWorks'
'Accelerating the pace of engineering and science'
'You''re right!'
'矩阵实验室'
注意:必须在英文状态下输入“单引号对”。
2、使用 内部编码 创建字符串
s = char(x) 用字符的内部编码 x 创建相应的字符数组s,x为非
负整数数组,实际的字符显示和给定的字符编码有关。x的范围
为从0到65535,任何在此范围外的数据都没有定义。
字符编码的前128个编码即为ASCII码
s1 = char() %生成空字符串
x = 19968:19968+99
s2 = char(97)
X = reshape(x,10,10)
s3 = char(97:122)
X = X'
s4 = char([97:122;65:90])
s = char(X)
附:ASCII码表(7位)
高三位
低四位
b3 b2 b1 b0
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
000
NUL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
LF
VT
FF
CR
SO
SI
001
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
010
SP
!
“
#
$
%
&
‘
(
)
*
+
,
.
/
b6 b5 b4
011
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
100
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
101
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
110
、
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
111
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
DEL
获取字符数组的内部编码
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
t2
在较短字符串的末尾增加适当数量的
“空格” 。
6个字符
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 =
s2 =
Hello,
Hello,
空字符串会被忽略掉
Nice to meet you!
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)
s1 =
s2 =
Hello,
Nice to meet you!
Hello,
Nice to meet you!
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
s1 =
s2 =
Hello,
Nice to meet you!
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 =
s2 =
Hello,
Nice to meet you!
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.
2.
3.
4.
5.
6.
7.
字符数组中元素及子数组的访问与赋值
一些通用函数
字符串检测函数
简单的字符串处理函数
字符串比较函数
字符串替换和查找函数
字符串执行函数
1、字符数组中元素及子数组的访问与赋值
与数值数组一样,可用双下标,也可用单下标访问字
符数组中的元素和子数组。
s = strvcat('MathWorks','Matlab')
ch1 = s(2,5)
ch2 = s(11)
s1 = s(:,end:-1:1)
s(16) = 'x'
练习:试写出这些matlab语句的输
s(2,9) = 'y'
出结果,并在matlab中进行验证。
s(:,1) = []
s(:,end) = 'z'
d = s(:)
2、一些通用函数
size( )
length( )
numel( )
disp( )
sort( )
获得字符数组的大小(行数、列数)
获得字符数组的长度(行数、列数中的较大值)
获得字符数组的字符总数(总数 =行数×列数)
在command windows中显示字符数组的内容
按照字符的内部编码值对字符串排序
s = strvcat('MathWorks','Matlab');
len = length(s)
[r,c]=size(s)
练习:试写出这些matlab语句的
n = numel(s)
输出结果,并在matlab中进行验
disp(s)
证。
s1 = sort(s)
s2 = sort(s,2)
s2 = sort(s,'descend')
s2 = sort(s,2,'descend')
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)
练习:试写出这些matlab语句的
s4 = diag(s3)
输出结果,并在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)
deblank(s)
strtrim(s)
lower(s)
upper(s)
创建有n个空格组成的字符串
删除字符串尾部的空格
删除字符串的开头和尾部的空格,制表,回车符
将字符串中的字母转换成小写
将字符串中的字母转换成大写
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、字符串替换和查找函数
字符串替换
strfind( )
查找字符串
findstr( )
查找字符串
strmatch( ) 寻找符合条件的行
strtok( )
在字符串里找出指定标记之前的子字符串
strrep( )
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)
k1 =
k2 = strfind(s2, s1)
k3 = findstr(s1, s2)
k4 = findstr(s2, s1)
k2 2= ?15 k319= ? 45
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)
clc
clear all
s1 = 'a = 2';
s2 = '3*a';
eval(s1)
b = eval(s2)
s3 = ['c = ',s2];
eval(s3)
whos
在matlab中执行expression
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
xn=n;
end
clc
clear all
for n = 1:5
s=['x',int2str(n),'=n;'];
eval(s);
end
这些语句执行完后,matlab的工作区中共有几个变量?变量名是
什么?变量的值是什么?若换成右边的语句情况如何?
clc
clear all
这些matlab语句在屏幕上输出的结果是什么?在
x = eye(3);
matlab中验证你的想法是否正确。
for r = 1:3
for c = 1:3
s = ['x(' , int2str(r) , ',' , int2str(c) , ') = ' , int2str(x(r,c))];
disp(s);
end
end
三、字符串和数值之间的转换函数
int2str( )
num2str( )
mat2str ( )
str2double( )
str2num( )
整数转换为字符串
数值转换为字符串
矩阵转换为字符串
字符串转换为双精度
字符串转换为数值
str = int2str(N) 将整数转换为整数格式的字符串。输入参数
N可以是单一的整数、整数向量或整数矩阵。非整型值在转换前
都会被四舍五入取整。
s=
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=
format long
t = randn(3)
s1 = mat2str(t)
s2 = mat2str(t, 4)
t1 = eval(s1)
t2 = eval(s2)
[8 1 6;3 5 7;4 9 2]
A=
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.
s = '12'
d1 = double(s)
d2 = str2double(s)
d1 = ? d2 = ?
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')
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 =
X1 =
12.0000
3.4500
NaN
NaN
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之间的整数
s = '111';
d2 = base2dec(s,2)
d3 = base2dec(s,3)
d2 =
7
d3 =
13
str = dec2base(d, base)
str = dec2base(d, base, n)
把非负十进制整数d转换为base进制字符串 , d< 2^52
若指定n,且n比实际输出的字符数目大的话,则在输出的字符
串前面补“0”字符,若n小于输出字符的数目,则n不起作用。
d = 39;
s = dec2base(d,2)
s = dec2base(d,2,8)
s=
100111
s=
00100111
base不能大于36的一个原因:
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
s1 = 'z1';
d1 = 12345
d2 = base2dec(s1,36)
s2 = dec2base(d1,36)
d2 = ?
s2 = ?
十六进制字符串转换为IEEE双精度数
单、双精度数转换为16进制字符串
hex2num( )
num2hex( )
h=
d = 0.25;
h = num2hex(d)
dd = hex2num(h)
3fd0000000000000
dd =
0.250000000000000
00111111
3
f
d
0
0
0
0
0
0
0
0
0
0
0
0
0