实验三 字符串、元胞和构架数组
MATLAB 6.x版的内建数据类型(Built-in data type)就有5种以上,此外还有许多其他专门设计的类(Class),如符号类、内联函数类、控制工具包中的线性时不变模型类、神经网络类等。就程序设计而言,MATLAB 6.x版采用了面向对象编程技术。数据和编程的改变使用户能更简捷而自然地解决复杂的计算问题(如符号计算问题、多变量控制系统问题、神经网络问题)。本章内容根据MATLAB6.5编写,但绝大部分内容适用于其他MATLAB6.x版本。
第二章介绍了数值数组(Numeric Array),这是读者比较熟悉的数据类型。本章将集中讲述另外三类数据:字符串数组(Character String Array)、元胞数组(Cell array)和构架数组(Structure array)。它们之间的基本差别见表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='This is an example.'
(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([5 6])
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=['This string array '
'has multiple rows.']
size(S)
3.1.3.2 利用串操作函数创建多行串数组
【例3.1.3.2-1】演示:用专门函数char , str2mat , strvcat创建多行串数组示例。
S1=char('This string array','has two rows.')
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')
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
图 3.1-1
3.1.3.4 利用元胞数组创建复杂字符串
【例3.1.3.4-1】元胞数组在存放和操作字符串上的应用。
a='MATLAB 6.x ';b='includes new data types:';
c1='◆Multidimensional array';c2='◆User-definable data structure';
c3='◆Cell arrays';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>
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 字符串转数组matlab元胞标识寻访和内容编址寻访的不同
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','text string');10:-1:1}
(2)
AC=[A C]
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}(:,[1 2 5 6])
(4)
[f4,f5,f6]=deal(R_A_C{[1,3,4]})
3.2.4 元胞数组转换函数
【例3.2.4-1】常用元胞数组转换函示例。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论