字符串数组、元胞数组和构架数组中 国 民 航 大 学 电 子 信 息 工 程 学 院本讲提纲
字符串数组
元胞数组
构架数组中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
字符串在 MATLAB中,字符串是用单撇号括起来的字符序列。
MATLAB将字符串当作一个行向量,每个元素对应一个字符,其标识方法和数值向量相同。也可以建立多行字符串数组。
MATLAB存放一个字符需 2个字节,而存放一个数值标量需 8个字节。
[例 ]字符串和数值量的区别
a=123.55; b=class(a);a_s=size(a)
c=‘S’;d=class(c);c_s=size(c)
中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
字符串数组的创建
单撇号法
a=‘ Matlab language.’
每个字符(中文英文字母,空格和 标点符号)占据一个元素位。
size(a)=1*16
串数组元素的标识串数组每个字符对应一个串数组的索引位
a(2)=a
b=‘ 中国民航大学 ’
中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
S=[‘This string array ’
‘Has multiple rows.’]
注意,用单撇号创建多行数组时,要保证各行等长。(可利用空格来调整各行的长度相同)
利用串操作函数创建多行串数组
char
char(‘This string array’,’has two rows’)
str2mat
str2mat(‘中国’,‘民航大学’)
strvcat
strvcat(‘中国’,‘’,‘民航大学’)
利用这三条指令创建串数组时,不需保证每行字符数相同,
Matlab会按最长行设置第二维的长度。
中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
字符串数组的存储字符串是以 ASCII码形式存储的。 abs和 double函数都可以用来获取字符串矩阵所对应的 ASCII码数值矩阵。相反,
char函数可以把 ASCII码矩阵转换为字符串矩阵。
例 a=‘civil aviation university of china’
b=double(a)
c=char(b)
说明,由于 ACSII码数组是数值数组,因此第二章所讲的各种运算、函数和操作对 ASCII码数组都适用中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组例:使字符串数组全部小写
a=‘This is an example’
ascii_a=double(a)
w=find(a>=‘a’&a<=‘z’)
ascii_a(w)=ascii_a(w)-32
char(ascii_a)
中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组例:建立一个字符串向量,然后对该向量做如下处理:
(1) 取第 1~ 5个字符组成的子字符串。
(2) 将字符串倒过来重新排列。
(3) 将字符串中的小写字母变成相应的大写字母,其余字符不变。
(4) 统计字符串中小写字母的个数。
中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组命令如下:
ch=‘ABc123d4e56Fg9’;
subch=ch(1:5) %取子字符串
revch=ch(end:-1:1) %将字符串倒排
k=find(ch>=‘a’&ch<=‘z’);
%找小写字母的位置
ch(k)=ch(k)-(‘a’-‘A’); %将小写字母变成相应的大写字母
char(ch)
length(k) %统计小写字母的个数中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
串转换函数
int2str,num2str,mat2str
把数值数组转换成字符串数组
int2str %把整数数组转换成字符串数组(非整数四舍五入)
例 A=ones(2,4); C=rand(2,3);
B=int2str(A); D=int2str(c);
num2str %把非整数数组转换成字符串数组(图形中数据点的标识)
例 A=rand(2,3);
B=num2str(A,3); %保持 3位有效数字中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
mat2str %把数值数组转换成输入形态中的串数组例,a=rand(2,4);
b=mat2str(a,4);
c=['exp(-',b,')']
eval(c)
进制转换指令
base2dec % x进制串到十进制整数 dec2base
hex2dec %16进制串到十进制整数 dec2hex
bin2dec %二进制串到十进制整数 dec2bin
中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
fprint,sprintf,sscanf
fprint % 把格式化数据写到文件或屏幕
(把结果书写于屏幕或指定的文件)
例 rand('state',0); a=rand(2,2);
s1=num2str(a)
fprintf('%.5g\\',a)
sprintf % 以控制格式把数值转换为串
(转换结果存放于变量中)
s=sprintf('%.5g\n',a)
sscanf %在格式控制下把串转换成数值
s=sscanf(s,'%f',[3,2])
中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组常见的控制格式
%c 字符 %d 十进制
%e 指数格式的浮点数 %f 一般格式的浮点数
%g %e和 %f的紧凑格式 %i 有符号整数
%o 有符号八进制整数 %s 字符串
%u 有符号十进制整数 %x 有符号十六进制整数
\b 退后一格 \f 换页
\n 换行 \r 回车
\\ 反斜线中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
setstr %把 ASCII码翻译成串
abs %把串翻译成 ASCII码
double %把任何数据类型转化成双精度数值
char %把 ASCII码及其他非数值类数据转换成字符串串操作函数
blanks(n) %创建 n个空格串
deblank(s) %删去串尾部的空格例,disp(['xxx' blanks(20) 'yyy'])
s=‘ This is an example.’
s1=deblank(s)
中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
串创建指令
char(s1,s2,..) %形成多行串数组
str2mat(s1,s2,…) % 形成多行串数组
strvcat (s1,s2,….) % 形成多行串数组,并删除全空行
strcat( s1,s2,…) % 把 s1,s2等连接成长串例 strcat('red','yellow')
串比较,替换指令
strcmp(s1,s2) %串 s1,s2相同,值为 1
strncmp(s1,s2,n) %比较串 s1,s2的前 n个字符,若相同为 1
例 strcmp('matlab','matlab')
strncmp('matter','matlab',3)
strncmp('matter','matlab',4)
strrep(s1,s2,s3) %把 s1中所有出现 s2的地方替换为 s3
中 国 民 航 大 学 电 子 信 息 工 程 学 院字符串数组
eval 把串当成 matlab指令运行
eval(s)
eval(s1,sc) %若 s1运行发生错误,则执行 sc
例 for n = 1:12
magic_str = ['M',int2str(n),' = magic(n)'];
eval(magic_str)
end
feval(f,x,y,? ) %对输入变量 x,y等执行函数 f
例 A=randn(3,3),[V,D]=feval(@eig,A)
findstr(s1,s2) %在较长串中,找出短串的起始字符的下标
strmatch( s1,s2) %逐行搜索串 s2,给出以 s1开头的那些行的行号例,x = strmatch('max',strvcat('max','minimax','maximum'))
中 国 民 航 大 学 电 子 信 息 工 程 学 院元胞数组
元胞数组 cell array
元胞数组由若干个元胞组成
每个元胞可存放任何类型,任何大小的数组
各元胞的内容可以不同
可以是一维的,二维的,也可以是更高维的
编址方法可分全下标和单下标两种
元胞数组的寻访
元胞外标识标识每个元胞的位置,用圆括号表示
元胞内编址标识每个元胞的内容,用花括号表示例 A为一个 2*3的元胞数组
A(2,3) 表示元胞数组 A的第二行第三列元胞
A{2,3} 表示元胞数组 A的第二行第三列元胞的内容中 国 民 航 大 学 电 子 信 息 工 程 学 院元胞数组
元胞数组的创建例 2*2 元胞数组的创建
C_str=char('这是 ','元胞数组创建的例子 1');
R=reshape(1:9,3,3);
cn=[1+2i];
S=sym('sin(-3*t)*exp(-t)');
外标识元素赋值法
A(1,1)={C_str};A(1,2)={R};A(2,1)={cn};A(2,2)={S};
元胞内编址赋值法
B{1,1}=C_str;B{1,2}=R;B{2,1}=cn;B{2,2}=S;
celldisp(B) %元胞数组内容显示指令说明:若在指令窗中,直接输入元胞数组名,除“单”元素元胞外,一般 只能得知每个元胞的属性,而不显示元胞数组的内容中 国 民 航 大 学 电 子 信 息 工 程 学 院元胞数组
cell 创建元胞数组,并且是空数组格式,cell(m),cell(m,n),cell(m,n,p,? )
元胞数组操作实例
元胞数组在存放和操作字符串上的应用
a='Matlab6';b=' introduces new data types:';
c1='multidimensional array';
c2='User-definable data structure';
c3='cell arrays';
c4='Character array';
c=char(c1,c2,c3,c4); %生成多行字符串数组
C={a;b;c}; %创建元胞数组
disp([C{1:2}]) %元胞数组的寻访
disp(' ')
disp(C{3})
中 国 民 航 大 学 电 子 信 息 工 程 学 院元胞数组
元胞数组的扩充、收缩和重组
C=cell(2);D=cell(2)
C(:,1)={char('Another','test string');10:-1:1}
Ac=[A C] %元胞数组的扩充
A_C=[A;C] %元胞数组的扩充
A_C(3,:)=[]; %元胞数组的收缩
R_A_C=reshape(A_C,2,3); %元胞数组的重组
元胞数组的图形表示
cellplot (C,’ legend’ )
legend %在图形窗上显示色彩图例例 cellplot(A_C,’ lengend’ )
中 国 民 航 大 学 电 子 信 息 工 程 学 院元胞数组
元胞数组内容的调取
f1=R_A_C(1,3) %取元胞
class(f1) %类型仍为元胞数组
f2=R_A_C{1,3} %取元胞的内容
class(f2) %类型为元胞内容的类型
f3=R_A_C{1,1}(:,[1 2 5 6]) %取元胞内的子数组
deal函数调取元胞数组
deal 把输入变量逐个传给输出变量
[Y1,Y2,Y3,...] = deal(X)
[Y1,Y2,Y3,...] = deal(X1,X2,X3,...)
例 对元胞数组 [Y1,Y2,Y3,...] = deal(X{:})
[f4,f5,f6]=deal(R_A_C{[1,3,4]})
中 国 民 航 大 学 电 子 信 息 工 程 学 院构架数组
构架数组
构架数组的元素可以是不同的数据类型,它能将一组具有不同属性的数据纳入到一个统一的变量名下进行管理。
构架数组的基本组分是构架。
构架必须划分成域后才能存放数据,具体格式为构架,域 =表达式 %表达式应理解为矩阵表达式。
构架数组可以是一维的,二维的,也可以是高维的。
构架数组的编址方法也有单下标编址和全下标编址两种。
中 国 民 航 大 学 电 子 信 息 工 程 学 院构架数组
构架数组的创建构架,域 =表达式
单构架数组的创建例:创建一个构架数组进行温室数据的管理
green_house.name='一号房 ';
green_house.volume='2000立方米 ';
green_house.parameter.temperature=[31.2 30.4 31.6 28.7
29.7 31.1 30.8 29.6];
green_house.parameter.humidity=[62.1 59.5 57.7 61.5
62.0 61.9 59.2 57.5];
说明:该构架数组是一个 1*1的构架数组,有三个域,name,
volume,parameter。其中域 parameter也是一个构架数组,有两个域,temperature,humidity
中 国 民 航 大 学 电 子 信 息 工 程 学 院构架数组
构架的显示
构架名:只显示构架的结构信息,不显示内容
构架名,域名:显示构架内容例 green_house
green_house =
name,'一号房 '
volume,'2000立方米 '
parameter,[1x1 struct]
green_house.parameter
ans =
temperature,[2x4 double]
humidity,[2x4 double]
green_house.parameter.temperature
ans =
31.2000 30.4000 31.6000 28.7000
29.7000 31.1000 30.8000 29.6000
中 国 民 航 大 学 电 子 信 息 工 程 学 院构架数组
多构架数组的创建输入,green_house(2,3).name='六号房 ';
就创建了 2*3的构架数组
green_house
green_house =
2x3 struct array with fields:
name
volume
parameter
构架数组中每个构架的域名相同,但子域名不一定相同
green_house(1,2)
ans =
name,[]
volume,[]
parameter,[]
green_house(2,3)
ans =
name,'六号房 '
volume,[]
parameter,[]
中 国 民 航 大 学 电 子 信 息 工 程 学 院构架数组
利用构架函数创建构架数组
struct 指令 %创建构架数组
s = struct('field1',{},'field2',{},...)
创建域分别为 field1,field2等的空的构架数组
s = struct('field1',values1,'field2',values2,...)
创建一个指定的域和值的构架数组,其中 values1,values2,
等必须为相同大小的元胞数组或标量元胞,值数组的大小就是构架数组的大小,若无元胞数组,则构架数组大小为
1*1
s = struct('type',{'big','little'},'color',{'red'},'x',{3 4})
中 国 民 航 大 学 电 子 信 息 工 程 学 院构架数组
实例
struct 预建空构架数组方法一
a=cell(2,3)
green_house_1=struct('name',a,'volume',a,'parameter',a(1,2))
struct 预建空构架数组方法二
green_house_2=struct('name',a,'volume',[],'parameter',[])
struct 预建空构架数组方法三
green_house_3(2,3)=struct('name',[],'volume',[],'parameter',[])
struct 预建空构架数组方法四
a1='六号房 ';
a2='3200立方米 ';
green_house_4(2,3)=struct('name',a1,'volume',a2,'parameter',[])
T6=[31.2 30.4 31.6 28.7;29.7 31.1 30.8 29.6];
green_house_4(2,3).parameter.temperature=T6;
green_house_4
中 国 民 航 大 学 电 子 信 息 工 程 学 院构架数组
构架数组操作函数
fieldnames 获得构架数组的域名
B=fieldnames( s)
B为字符串元胞数组
getfield 获得构架数组的指定域名的内容
getfield(s,’ field’ )
getfield(s,{i,j},’ field’ )
rmfield 删除构架数组中的域
rmfield(s,’ field’ )
Setfield 设置构架数组的域
setfield(s,’ field’,v) %s必须为 1*1的构架数组,若 s非 1*1构架数组,则需分别对每个构架进行设置
setfield(s,{i,j},’ field’,v)
v:指定域的值中 国 民 航 大 学 电 子 信 息 工 程 学 院构架数组
数值运算操作和函数对构架域的应用若构架域中的内容是数值类型数据,那么在第二章中介绍的所有操作和函数也都适用中 国 民 航 大 学 电 子 信 息 工 程 学 院数据类型数值 字符串 元胞 构架 函数句柄 JAVA类双精度 单精度 整数类稀疏