实验三MATLAB字符串元胞和构架数组.docx

上传人:b****6 文档编号:4966354 上传时间:2022-12-12 格式:DOCX 页数:15 大小:32.96KB
下载 相关 举报
实验三MATLAB字符串元胞和构架数组.docx_第1页
第1页 / 共15页
实验三MATLAB字符串元胞和构架数组.docx_第2页
第2页 / 共15页
实验三MATLAB字符串元胞和构架数组.docx_第3页
第3页 / 共15页
实验三MATLAB字符串元胞和构架数组.docx_第4页
第4页 / 共15页
实验三MATLAB字符串元胞和构架数组.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

实验三MATLAB字符串元胞和构架数组.docx

《实验三MATLAB字符串元胞和构架数组.docx》由会员分享,可在线阅读,更多相关《实验三MATLAB字符串元胞和构架数组.docx(15页珍藏版)》请在冰豆网上搜索。

实验三MATLAB字符串元胞和构架数组.docx

实验三MATLAB字符串元胞和构架数组

实验三字符串、元胞和构架数组

MATLAB6.x版的内建数据类型(Built-indatatype)就有5种以上,此外还有许多其他专门设计的类(Class),如符号类、内联函数类、控制工具包中的线性时不变模型类、神经网络类等。

就程序设计而言,MATLAB6.x版采用了面向对象编程技术。

数据和编程的改变使用户能更简捷而自然地解决复杂的计算问题(如符号计算问题、多变量控制系统问题、神经网络问题)。

本章内容根据MATLAB6.5编写,但绝大部分内容适用于其他MATLAB6.x版本。

第二章介绍了数值数组(NumericArray),这是读者比较熟悉的数据类型。

本章将集中讲述另外三类数据:

字符串数组(CharacterStringArray)、元胞数组(Cellarray)和构架数组(Structurearray)。

它们之间的基本差别见表3-1。

表3-1四种数据类型基本构成比较表

数组类型

基本组分

组分内涵

基本组分占用字节数

数值数组

元素

双精度实数标量

或双精度复数标量

8

16

字符串数组

元素

字符

2

元胞数组

元胞

可以存放任何类型、任何大小的数据。

不定

构架数组

构架

只有挂接在构架上的“域”才能存放数据。

数据可以是任何类型、任何大小。

不定

3.1字符串数组

3.1.1字符串入门

【例3.1.1-1】先请读者实际操作本例,以体会数值量与字符串的区别。

clear

a=12345.6789

class(a)

a_s=size(a)

b='S'

class(b)

b_s=size(b)

whos

3.1.2串数组的属性和标识

【例3.1.2-1】本例演示:

串的基本属性、标识和简单操作。

(1)

a='Thisisanexample.'

(2)

size(a)

(3)

a14=a(1:

4)

ra=a(end:

-1:

1)

(4)

ascii_a=double(a)

char(ascii_a)

(5)

w=find(a>='a'&a<='z');

ascii_a(w)=ascii_a(w)-32;

char(ascii_a)

(6)

A='这是一个算例。

';

A_s=size(A)

A56=A([56])

ASCII_A=double(A)

char(ASCII_A)

(7)

b='Example''3.1.2-1'''

(8)

ab=[a(1:

7),'',b,'.']

3.1.3复杂串数组的创建

3.1.3.1多行串数组的直接创建

【例3.1.3.1-1】多行串数组的直接输入示例。

clear

S=['Thisstringarray'

'hasmultiplerows.']

size(S)

3.1.3.2利用串操作函数创建多行串数组

【例3.1.3.2-1】演示:

用专门函数char,str2mat,strvcat创建多行串数组示例。

S1=char('Thisstringarray','hastworows.')

S2=str2mat('这','字符','串数组','','由4行组成')

S3=strvcat('这','字符','串数组','','由4行组成')

size(S3)

3.1.3.3转换函数产生数码字符串

【例3.1.3.3-1】最常用的数组/字符串转换函数int2str,num2str,mat2str示例。

(1)

A=eye(2,4);

A_str1=int2str(A)

(2)

rand('state',0)

B=rand(2,4);

B3=num2str(B,3)

(3)

B_str=mat2str(B,4)

Expression=['exp(-',B_str,')'];

eval(Expression)

【例3.1.3.3-2】综合例题:

在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')

holdon

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'),holdoff

图3.1-1

3.1.3.4利用元胞数组创建复杂字符串

【例3.1.3.4-1】元胞数组在存放和操作字符串上的应用。

a='MATLAB6.x';b='includesnewdatatypes:

';

c1='◆Multidimensionalarray';c2='◆User-definabledatastructure';

c3='◆Cellarrays';c4='◆Characterarray';

c5='◆Functionhandle';

c=char(c1,c2,c3,c4,c5);

C={a;b;c};%<5>

disp([C{1:

2}])%<6>

disp('')%

disp(C{3})%<8>

3.1.4串转换函数

【例3.1.4-1】fprintf,sprintf,sscanf的用法示例。

rand('state',0);a=rand(2,2);

s1=num2str(a)

s_s=sprintf('%.10e\n',a)

fprintf('%.5g\\',a)

s_sscan=sscanf(s_s,'%f',[3,2])

3.1.5串操作函数

3.2元胞数组

3.2.1元胞数组的创建和显示

3.2.1.1元胞标识寻访和内容编址寻访的不同

3.2.1.2元胞数组的创建和显示

【例3.2.1.2-1】本例演示:

元胞数组的创建。

C_str=char('这是','元胞数组创建算例1');

R=reshape(1:

9,3,3);

Cn=[1+2i];

S_sym=sym('sin(-3*t)*exp(-t)');

(1)直接创建法之一

A(1,1)={C_str};A(1,2)={R};A(2,1)={Cn};A(2,2)={S_sym};

A

(2)直接创建法之二

B{1,1}=C_str;B{1,2}=R;B{2,1}=Cn;B{2,2}=S_sym;

celldisp(B)

3.2.2元胞数组的扩充、收缩和重组

【例3.2.2-1】元胞数组的扩充。

(1)

C=cell

(2);

C(:

1)={char('Another','textstring');10:

-1:

1}

(2)

AC=[AC]

A_C=[A;C]

【例3.2.2-2】cellplot能用图形形象化地表示元胞数组的内容。

(A_C取自上例)

cellplot(A_C,'legend')

图3.2-1

【例3.2.2-3】元胞数组的收缩和重组。

(1)

A_C(3,:

)=[]

(2)

R_A_C=reshape(A_C,2,3)

3.2.3元胞数组内容的调取

【例3.2.3-1】元胞数组内容的调取示例。

(1)

f1=R_A_C(1,3)

class(f1)

(2)

f2=R_A_C{1,3}

class(f2)

(3)

f3=R_A_C{1,1}(:

[1256])

(4)

[f4,f5,f6]=deal(R_A_C{[1,3,4]})

3.2.4元胞数组转换函数

【例3.2.4-1】常用元胞数组转换函示例。

(1)num2cell把数值数组转换成元胞数组

rand('state',0);

A=rand(2,3,2)

C1=num2cell(A)

C2=num2cell(A,1)

C3=num2cell(A,[2,3])

(2)

clear,x=zeros(4,5);

x(:

)=1:

20

C4=mat2cell(x,[22],[32])

celldisp(C4)

(3)

D=cell2mat(C4(1,:

))

3.3构架数组

3.3.1构架数组的创建和显示

3.3.1.1直接创建法及显示

【例3.3.1.1-1】本例通过温室数据(包括温室名、容积、温度、湿度等)演示:

单构架的创建和显示。

(1)

green_house.name='一号房';%<1>

green_house.volume='2000立方米';%<2>

green_house.parameter.temperature=[31.230.431.628.7

29.731.130.929.6];%<3>

green_house.parameter.humidity=[62.159.557.761.5

62.061.959.257.5];%<4>

(2)显示“单构架”结构和内容

green_house%<5>

green_house.parameter%<6>

green_house.parameter.temperature%<7>

【例3.3.1.1-2】本例演示构架数组的创建和显示,并利用构架数组保存一个温室群的数据。

本例的运行以例3.3.1.1-1为先导。

(1)

green_house(2,3).name='六号房';%<1>

(2)

green_house%<2>

green_house(2,3)%<3>

3.3.1.2利用构造函数创建构架数组

【例3.3.1.2-1】利用构造函数struct,建立温室群的数据库。

(1)

a=cell(2,3);

green_house_1=struct('name',a,'volume',a,'parameter',a(1,2))%<2>

(2)

green_house_2=struct('name',a,'volume',[],'parameter',[])%<3>

(3)

green_hopuse_3(2,3)=struct('name',[],'volume',[],'parameter',[])%<4>

(4)

a1={'六号房'};a2={'3200立方米'};

green_house_4(2,3)=struct('name',a1,'volume',a2,'parameter',[]);%<6>

T6=[31.2,30.4,31.6,28.7;29.7,31.1,30.9,29.6];%<7>

green_house_4(2,3).parameter.temperature=T6;%<8>

green_house_4

 

3.3.2构架数组域中内容的调取和设置

【例3.3.2-1】本例目的:

一,演示函数fieldnames,getfield,setfield的使用方法;二,让读者感受到构架数组对应用工具包的影响;三,演示struct函数把“对象”转换为构架的应用。

本例为获得一个演练的构架,借助Toolboxcontrol工具包中的tf函数,先产生一个用传递函数描写的LTI线性时不变2输入2输出系统

(1)

Stf=tf({3,2;[41],1},{[132],[111];[1221],[10]})

(2)

SSTF=struct(Stf)

(3)

FN=fieldnames(SSTF)

class(FN)

(4)

FC=getfield(SSTF,'den',{2,1})

FC{1}

poly2str(FC{1},'s')

(5)

SSTF.num{2,1}

SSTF=setfield(SSTF,'num',{2,1},{[131]});

SSTF.num{2,1}

3.3.3构架数组操作深入

3.3.3.1构架数组的扩充和收缩

【例3.3.3.1-1】本例演示构架数组SSTF的扩充和收缩。

(本例以例3.3.2-1的运行为基础。

(1)

size(SSTF)

(2)

SSTF(2,2)=struct(tf(1,[11]))

size(SSTF)

(3)

SSTF(1,:

)=[]

S22n=SSTF(1,2).num,S22d=SSTF(1,2).den

printsys(S22n{1},S22d{1})

3.3.3.2增添域和删除域

【例3.3.3.2-1】对构架数组green_house进行域的增添和删减操作。

(1)

clear,fork=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

(3)

department

(2).teacher.male=35;department

(2).teacher.female=13;

D2T=department

(2).teacher%第2构架teacher域包含两个子域

D1T=department

(1).teacher%第1构架teacher域仅是一个数

(4)

department

(2).teacher=rmfield(department

(2).teacher,'male');

department

(2).teacher

(5)

department=rmfield(department,'student')

department=rmfield(department,{'teacher';'PC_computer'})

3.3.3.3数值运算操作和函数对构架数组的应用

【例3.3.3.3-1】数值运算操作和函数在构架域上的作用。

n_ex=5;

fork=1:

n_ex,ex(k).f=(k-1)*n_ex+[1:

5];end

ex

%

disp([blanks(10)'构架域中内容'])

fork=1:

n_ex,disp(ex(k).f),end

class(ex

(1).f)

%

sum_f=zeros(1,5);

fork=1:

n_ex,sum_f=sum_f+ex(k).f;end,sum_f

%

disp([blanks(20)'ex.f的平方根值'])

fork=1:

n_ex,disp(sqrt(ex(k).f)),end

3.3.4构架数组和元胞数组之间的转换

【例3.3.4-1】指令struct2cell和cell2struct的使用。

(1)

fork=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))

fork=1:

5;fprintf('%s\\',[ex(k).sblanks

(1)]);end

fprintf('%s\n',blanks

(1)),fprintf('%s\n','ex.f域的内容')

fork=1:

5;disp(ex(k).f);end

(3)

C_ex=struct2cell(ex);

size(C_ex)

fprintf('%s\',[C_ex{1,1,1},blanks(3)])

fprintf('%5g\',C_ex{2,1,1})

(4)

FS={'S_char';'F_num'};

EX1=cell2struct(C_ex,FS,1)

EX1

(1)

(5)

EX2=cell2struct(C_ex,'xx',2)

(6)

YY=strvcat('y1','y2','y3','y4','y5');EX3=cell2struct(C_ex,YY,3)

EX3

(1)

EX3

(2)

【例3.3.4-2】带子域的构架数组转换为元胞数组。

本例中的ex构架数组由例3.3.4-1生成,然后再运行以下程序。

ex(1,1).s

%

ex(1,1).s.sub='SUB1';

ex(3,1).s.sub='SUB3';

ex(3,1).s.num=1/3;

ex(1,1).s

ex(3,1).s

C_ex_sub=struct2cell(ex)

size(C_ex_sub)

C_ex_sub{1,1,1}

C_ex_sub{1,3,1}

3.4关于数据类型的归纳性说明

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

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1