为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

使用单元数组和结构数组

2017-11-17 23页 doc 48KB 12阅读

用户头像

is_014457

暂无简介

举报
使用单元数组和结构数组使用单元数组和结构数组 Matlab使用字符串数组、单元数组(cell array)和结构数组 (struct array) 要在MALTAB中实现比较复杂的编程,就不能不用单元数组(cell array)和结构数组 (structarray)。而且在Matlab中实现struct比C中更为方便。 MATLAB字符串数组的创建与运算 字符串数组主要用于可视化编程内容,如界面设计和图形绘制。 1.字符串变量的创建 字符变量的创建方法是:在指令窗口中先把待建的字符放在“单引号对”中,再按回车键。 注意,该“单引号对”必须...
使用单元数组和结构数组
使用单元数组和结构数组 Matlab使用字符串数组、单元数组(cell array)和结构数组 (struct array) 要在MALTAB中实现比较复杂的编程,就不能不用单元数组(cell array)和结构数组 (structarray)。而且在Matlab中实现struct比C中更为方便。 MATLAB字符串数组的创建与运算 字符串数组主要用于可视化编程,如界面设计和图形绘制。 1.字符串变量的创建 字符变量的创建是:在指令窗口中先把待建的字符放在“单引号对”中,再按回车键。 注意,该“单引号对”必须在英文状态下输入。这“单引号对”是MATLAB用来识别字符串变 量所必须的。如: >>a='This is an example.' a = This is an example. >>msg = 'You''re right!' %创建带单引号的字符串 msg = You're right! 2.字符串数组的标识 字符串变量的每个字符(英文字母、空格和标点都是平等的)占据一个元素位,在数组 中元素所处的位置用自然数标识。如: >>a='This is an example.' >>b=a(1:4) % 提出一个子字符串 b = This ra=a(end:-1:1) % 字符串的倒排 ra = .elpmaxe na si sihT 又如: >>A='这是一个算例。'; >>B=size(A) % 符号数组 A 的“大小” B = 1 7 >>C=A([5 6]) % 提出一个子字符串 C = 算例 3.字符串的ASCII码 字符串的存储是用ASCII码实现的。指令abs和double都可以用来获取串数组所对应的ASCII码数值数组。指令char可把ASCII码数组变为串数组。如 >>d=double(a) d = 84 104 105 115 32 105 115 32 97 110 32 101 120 97 109 112 108 101 46 >>char(d) ans = This is an example. 例:对字符串ASCII码数组的操作:使字符串中字母全部大写 >>w=find(a>='a'&a<='z'); %找出串数组a中,小写字母的元素位置。 >>d(w)=d(w)-32; %大小写字母ASCII值差32用数值加法改变部分码值。 >>char(d) %把新的ASCII码翻成字符 ans = THIS IS AN EXAMPLE. 4.字符串数组的运算(主要是连接) 4.1 连接成一行 >>Aa=[A,a] 可将字符串连接成一行长字符串 Aa = 这是一个算例。This is an example. >>name = strcat('Thomas',' R.',' Lee') %连接两个字符串,每个字符串最右边的空格被裁切 name = Thomas R. Lee 4.2多个字符串形成多行字符串矩阵 , 用中括号则要求两个字符串一般长 >> Aa=[A;a]; %操作错误,不能成生成二行的矩阵,长度不一致 , 用char或strvcat函数进行连接 >>D=strvcat('Hello','Yes','No','Goodbye') %利用串操作函数(chat也可以)创建多行串数组, 连接多行字符串,每行长度可不等,自动把非最长字符串最右边补空格, 使与最长字符串相等,会忽略空字符串。 D = Hello Yes No Goodbye 5. 字符串替换和查找 strrep—进行字符串替换,区分大小写 >>strrep(str1,str2,str3) %它把str1中所有的str2字串用str3来替换 strfind(str,patten) %查找str中是否有pattern,返回出现位置,没有出现返回 空数组findstr(str1,str2) %查找str1和str2中,较短字符串在较长字符串中出现的位置,没有出现返回空数组 strmatch(patten,str) %检查patten是否和str最左侧部 分一致strtok(str,char) %返回str中由char指定的字符串前的部分和之后 的部分,6.常用字符串操作函数 blanks(n)—创建有n个空格组成的字符串 deblank(str)—裁切字符串的尾部空格 strtrim(str)—裁切字符串的开头和尾部的空格,制表,回车符 lower(str)—将字符串中的字母转换成小写 upper(str)—将字符串中的字母转换成大写 sort(str)—按照字符的ASCII值对字符串排序 num2str—将数字转换为数字字符串 str2num—将数字字符串转换为数字 mat2str—将数组转换成字符串 int2str—把数值数组转换为整数数字组成的字符数组 7.其他字符串操作函数 strcmp—比较两个字符串是否完全相等,是,返回真,否则,返回假 strncmp—比较两个字符串前n个字符是否相等,是,返回真,否则,返回假 strcmpi—比较两个字符串是否完全相等,忽略字母大小写 strncmpi—比较两个字符串前n个字符是否相等,忽略字母大小写 isletter—检测字符串中每个字符时否属于英文字母 isspace—检测字符串中每个字符是否属于字符(空格,回车,制表,换行符等) isstrprop—检测字符每一个字符是否属于指定的范围. 【例】综合例题:在MATLAB计算生成的图形上标出图名和最大值点坐标。 clear a=2; w=3; t=0:0.01:10; y=exp(-a*t).*sin(w*t); [y_max,i_max]=max(y); t_text=['t=',num2str(t(i_max))]; % <7> y_text=['y=',num2str(y_max)]; % <8> max_text=char('maximum',t_text,y_text); % <9> % tit=['y=exp(-',num2str(a),'t)*sin(',num2str(w),'t)']; %<11> plot(t,zeros(size(t)),'k') hold on plot(t,y,'b') plot(t(i_max),y_max,'r.','MarkerSize',20) text(t(i_max)+0.3,y_max+0.05,max_text) % <16> title(tit),xlabel('t'),ylabel('y'),hold off y=exp(-2t)*sin(3t)0.6 maximum 0.5t=0.33 y=0.4321 0.4 0.3 y0.2 0.1 0 -0.10246810t 图 3.1-1 二. 单元数组 单元数组中的每一个元素称为单元(cell). 单元可以包含任何类型的matlab数据, 这些数据类型包括数值数组, 字符, 符号对象, 甚至其他的单元数组和结构体. 不同的单元可以包含不同的数据. 1.1单元数组创建与显示: 1、直接赋值法:按单元索引法 和按内容索引法。(其实也就是将花括号放在等式的右边或是左边的区别)。注意:“按单元索引法”和“按内容索引法”是完全等效的,可以互换使用。通过下面实例,我们看到:花括号{}用于访问单元的值,而括号()用于标识单元(即:不用于访问单元的值)。具体理解{}和()区别可以在下面代码最后分别输入A{2,2}和A(2,2)。就会发现“按内容索引法{}”能显示完整的单元内容,而“按单元索引法()”有时无法显示完整的单元内容。 >> A(1,1)={[1 2 3; 4 5 6;7 8 9]}; % 按单元索引法 >> A(1,2)={2+3i}; >> A(2,1)={'A character'}; >> A(2,2)={12:-2:0}; >> A 要想详细显示A中的内容,可用指令:celldisp(A) A = [3x3 double] [2.0000 + 3.0000i] 'A character' [1x7 double] >> B{1,1}=[1 2 3;4 5 6;7 8 9]; % 按内容索引法。 >> B{1,2}=2+3i; >> B{2,1}='A character'; >> B{2,2}=12:-2:0; >>B B = [3x3 double] [2.0000 + 3.0000i] 'A character' [1x7 double] 2、利用cell函数法:即首先用cell函数生成一个空的单元数组,然后再向其中添加所需的数据。下面的代码生成一个2X3的空单元数组: >> C=cell(2,3) C = [] [] [] [] [] [] 利用cell生成空单元数组后,可以采用“按单元索引法”和“按内容索引法”对其进行赋值。在赋值时,用户一定要注意{}和()的用法。 >> C(1,1)={'This does work'} C = 'This does work' [] [] [] [] [] >> C{2,3}='This work' C = 'This does work' [] [] [] [] 'This work' (1)利用cell指令创建单元数组 C=cell(2); %预设空单元数组 (2,2)C(:,1)={char('Another','text string');10:-1:1} %对第一列单元赋值 C = [2x11 char ] [] [1x10 double] [] 使用char函数可以使字符串的长度不一致 (2)单元数组的“列”扩充和“行”扩充 AC=[A C] %空格(或逗号)利用来分隔列 A_C=[A;C] %分号利用来分隔“行” AC = [2x10 char] [3x3 double] [2x11 char ] [] [1.0000+ 2.0000i] [1x1 sym ] [1x10 double] [] A_C = [2x10 char ] [3x3 double] [1.0000+ 2.0000i] [1x1 sym ] [2x11 char ] [] [1x10 double] [] 【例】cellplot能用图形形象化地表示单元数组的内容。(A_C取自上例) cellplot(A_C,'legend ') other structure 1+2i sparse char double 单元数组的收缩 A_C(3,:)=[] %删除第3行,使A_C成为的单元数组 (3,2)A_C = [2x10 char ] [3x3 double] [1.0000+ 2.0000i] [1x1 sym ] [1x10 double] [] 把A_C重组成单元数组R_A_C (2,3) R_A_C=reshape(A_C,2,3) R_A_C = [2x10 char] [1x10 double] [1x1 sym] [1.0000+ 2.0000i] [3x3 double] [] 1.2 单元数组内容的调取 取一个单元 f1=R_A_C(1,3) %使用园括号寻访得到的是单元,而不仅是内容。 class(f1) f1 = [1x1 sym] ans = cell 取一个单元的内容 f2=R_A_C{1,3} %用花括号寻访取得内容 class(f2) f2 = sin(-3*t)*exp(-t) ans = sym 取单元内的子数组 f3=R_A_C{1,1}(:,[1 2 5 6]) %注意三种括号的不同用途 %取第1行第1列单元内容中的第1、2、5、6列。 f3 = 这是 单元创建 同时调取多个单元内容 [f4,f5,f6]=deal(R_A_C{[1,3,4]}) %取三个单元内容,赋值给三个变量 Deal函数将元胞数组的内容复制到变量Y1、Y2、Y3、... f4 = 这是 单元数组创建算例 1 f5 = 10 9 8 7 6 5 4 3 2 1 f6 = 1 4 7 2 5 8 3 6 9 例: A=cell(3,5); for i=1:3 for j=1:5 A(i,j)={i*j}; end end A 例:读取多幅图片放到元胞组中并显示出来 clear;clc A=cell(1,2); for i=1:2 A{i}=imread(['d:\','00',num2str(i),'.bmp']); %注意字符串的连接方法 End C=[A{1},A{2}]; imshow(C) 利用元胞数组创建复杂字符串 【例3.1.3.4-1】元胞数组在存放和操作字符串上的应用。 a='MATLAB 7.x '; b='includes new data types:'; c1='?Multidimensional array'; c2='?User-definable data structure'; Cell arrays'; c3='? c4='?Character array'; c5='?Function handle'; c=char(c1,c2,c3,c4,c5); C={a;b;c}; % <5> disp([C{1:2}]) % <6> disp(' ') % disp(C{3}) % <8> 三. 结构数组 2.1. 结构数组的创建 Matlab提供了两种定义结构的方式:直接引用和使用struct函数。 1. 使用直接引用方式定义结构 与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以 动态扩充。比如建立一个复数变量x: x.real = 0; % 创建字段(field)名为real,并为该字段赋值为0 x.imag = 0 % 为x创建一个新的字段imag,并为该字段赋值为0 x = real: 0 imag: 0 然后可以将其动态扩充为数组: x(2).real = 0; % 将x扩充为1×2的结构数组 x(2).imag = 0; 在任何需要的时候,也可以为数组动态扩充字段,如增加字段scale: x(1).scale = 0; 这样,所有x都增加了一个scale字段,而x(1)之外的其他变量的scale字段为空: x(1) % 查看结构数组的第一个元素的各个字段的内容 ans = real: 0 imag: 0 scale: 0 x(2) % 查看结构数组的第二个元素的各个字段的内容,注意没有赋值的字段为空 ans = real: 0 imag: 0 scale: [] 应该注意的是,x的real、imag、scale字段不一定是单个数据元素,它们可以是任意数 据类型,可以是向量、数组、矩阵甚至是其他结构变量或单元数组,而且不同字段之间其数 据类型不需要相同。例如: clear x; x.real = [1 2 3 4 5]; x.imag = ones(10,10); 数组中不同元素的同一字段的数据类型也不要求一样: x(2).real = 'abc'; x(2).imag = rand(5,1); 甚至还可以通过引用数组字段来定义结构数据类型的某字段: x(3).real = x(1); x(3).imag = 3; x(3) ans = real: [1x1 struct] imag: 3 下面看一个实际的例子来熟悉直接引用方式定义与显示结构。 【例】 温室数据(包括温室名、容量、温度、湿度等)的创建与显示。 (1) 直接对字段赋值法产生结构变量 green_house.name = '一号温室'; % 创建温室名字段 green_house.volume = '2000立方米'; % 创建温室容量字段 green_house.parameter.temperature = [31.2 30.4 31.6 28.7 29.7 31.1 30.9 29.6]; % 创建温室温度字段 green_house.parameter.humidity = [62.1 59.5 57.7 61.5 62.0 61.9 59.2 57.5]; % 创建温室湿度字段 (2)显示结构变量的内容 green_house % 显示结构变量结构 green_house.parameter % 用字段作用符号. 显示指定字段(parameter)中内容 green_house.parameter.temperature % 显示temperature字段中的内容 【例】在上例的基础上,创建结构数组用以保存一个温室群的数据。 green_house(2,3).name = '六号温室'; %产生2×3结构数组 green_house % 显示结构数组的结构 green_house(2,3) % 显示结构数组元素的结构 2. 使用struct函数创建结构 使用struct函数也可以创建结构,该函数产生或把其他形式的数据转换为结构数组。 struct的使用格式为: s = sturct('field1',values1,'field2',values2,…); 该函数将生成一个具有指定字段名和相应数据的结构数组,其包含的数据values1、valuese2等必须为具有相同维数的数据。 对于struct的赋值用到了单元数组。数组values1、values2等可以是单元数组、数值数组或者单个数值。每个values的数据被赋值给相应的field字段。 当value为单元数组的时候,生成的结构数组的维数与单元数组的维数相同。而在数据中不包含单元数组的时候,得到的结构数组的维数是1×1的。例如: s = struct('type',{'big','little'},'color',{'blue','red'},'x',{3,4}) s = 1x2 struct array with fields: type color x 得到维数为1×2的结构数组s,包含了type、color和x共3个字段。这是因为在struct 函数中{'big','little'}、{'blue','red'}和{3,4}都是1×2的单元数组,可以看到两个数据成分分别为: s(1,1) ans = type: 'big' color: 'blue' x: 3 s(1,2) ans = type: 'little' color: 'red' x: 4 下面给出利用struct构建结构数组的具体实例。 【例】利用函数struct,建立温室群的数据库。 (1) struct预建立空结构数组方法之一 a = cell(2,3); % 创建2×3的单元数组 green_house_1=struct('name',a,'volume',a,'parameter',a(1,2)) (2)struct预建空结构数组方法之二 green_house_2=struct('name',a,'volume',[],'parameter',[]) (3)struct预建空结构数组方法之三 green_hopuse_3(2,3)=struct('name',[],'volume',[],'parameter',[]) (4)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.9,29.6]; green_house_4(2,3).parameter.temperature=T6; 2. 结构数组的操作 MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要有 函数名 功能描 deal 将其参数值(如单元数组)的内容分别输出到一个个独立的变量 fieldnames 获取结构的字段名 getfield 获取结构中指定字段的值 rmfield 删除结构的字段(不是字段内容) setfield 设置结构数组中指定的字段的值 struct 创建结构数组 struct2cell 结构数组转化成单元数组 isfield 判断是否存在该字段 isstruct 判断某变量是否是结构类型 下面举一些具体的例子说明如果对结构数组加以操作。 【例】对结构数组进行字段的增添和删减操作。 (1)创建结构数组(利用循环) clear, for k=1:10; department(k).number=['No.',int2str(k)]; end department (2)增添字段:在数组中任何一个结构上进行的字段增添操作,其影响遍及整个结构数组 department(1).teacher=40;department(1).student=300; department(1).PC_computer=40; department department = 1x10 struct array with fields: number teacher student PC_computer (3)增添子字段的操作只影响被操作的那个具体结构,而不是影响整个结构数组 department(2).teacher.male=35;department(2).teacher.female=13; D2T=department(2).teacher % 第2结构teacher字段包含两个子字段 D1T=department(1).teacher % 第1结构teacher字段仅是一个数 D2T = male: 35 female: 13 D1T = 40 (4)删除子字段的操作也只影响被操作的那个具体结构 department(2).teacher=rmfield(department(2).teacher,'male'); department(2).teacher ans = female: 13 (5)删除字段的操作是对整个结构数组实施的 (department,'student') % 删除一个字段 department=rmfield department = 1x10 struct array with fields: number teacher PC_computer department=rmfield(department,{'teacher';'PC_computer'})% 删除2个字段 department = 1x10 struct array with fields: number 【例】数值运算操作和函数在结构字段上的作用。 n_ex = 5; % 结构数组的长度 for k = 1:n_ex, % 创建1×5结构数组 ex(k).f = (k-1)*n_ex + [1:5]; end; ex % 显示结构数组的结构 ex = 1x5 struct array with fields: f %显示结构数组的字段中内容 disp([blanks(10) '结构字段中内容']) for k=1:n_ex,disp(ex(k).f),end 结构字段中内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class(ex(1).f) % 检查字段中内容的类型 ans = double % 对各结构字段中数值数组相应位置的数据相加求和 sum_f=zeros(1,5) for k=1:n_ex,sum_f=sum_f+ex(k).f;end,sum_f sum_f = 55 60 65 70 75 % 对结构数组字段中各元素分别求平方根 disp([blanks(20) 'ex.f的平方根值']) for k=1:n_ex, disp(sqrt(ex(k).f)), end ex.f的平方根值 1.0000 1.4142 1.7321 2.0000 2.2361 2.4495 2.6458 2.8284 3.0000 3.1623 3.3166 3.4641 3.6056 3.7417 3.8730 4.0000 4.1231 4.2426 4.3589 4.4721 4.5826 4.6904 4.7958 4.8990 5.0000 【例】 指令struct2cell和cell2struct的使用。 (1)创建“带2个字段的 结构数组” for k=1:5, ex(k).s=['No.' int2str(k)]; ex(k).f=(k-1)*5+[1:5]; end (2)显示结构数组的内容 fprintf('%s\n','ex.s字段的内容 ');fprintf('%s\',blanks(4)) for k=1:5;fprintf('%s\\',[ex(k).s blanks(1)]);end fprintf('%s\n',blanks(1)),fprintf('%s\n','ex.f字段的内容 ') for k=1:5;disp(ex(k).f);end %显示ex.f字段内容 ex.s字段的内容 No.1 \No.2 \No.3 \No.4 \No.5 \ ex.f字段的内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 (3)把ex结构数组转换为单元数组 C_ex=struct2cell(ex); % 带2个字段的(1×5)结构数组转换为(2×1×5)单元数组 size(C_ex) fprintf('%s\',[C_ex{1,1,1},blanks(3)]) % 显示C_ex第1页第1行第1列内容 fprintf('%5g\',C_ex{2,1,1}) % 显示C_ex第2页第1行第1列内容 ans = 2 1 5 No.1 1 2 3 4 5 (4)把单元数组转换为结构数组之一 FS={'S_char';'F_num'}; % 用单元数组预建字段名字符串 EX1=cell2struct(C_ex,FS,1) % 单元数组向结构数组转换 EX1 = 1x5 struct array with fields: S_char F_numric EX1(1) % 观察新结构EX1第一结构的情况 ans = S_char: 'No.1' F_numric: [1 2 3 4 5] (5)把单元数组转换为结构数组之二 EX2=cell2struct(C_ex,'xx',2) EX2 = 2x5 struct array with fields: xx (6)把单元数组转换为结构数组之三 YY=strvcat('y1','y2','y3','y4','y5');EX3=cell2struct(C_ex,YY,3) EX3 = 2x1 struct array with fields: y1 y2 y3 y4 y5 EX3(1) % 观察第一结构情况 ans = y1: 'No.1' y2: 'No.2' y3: 'No.3' y4: 'No.4' y5: 'No.5' % 观察第二结构情况 EX3(2) ans = y1: [1 2 3 4 5] y2: [6 7 8 9 10] y3: [11 12 13 14 15] y4: [16 17 18 19 20] y5: [21 22 23 24 25]
/
本文档为【使用单元数组和结构数组】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索