数据类型
1数值类型
@整数*浮点型转整数型的转换函数,将数值转换为最为接近的整数值,若分数部分为0.5时,转换为最接近的两个整数中绝对值较大的一个。
*取整函数:
floor(x)向下取整
ceil(x)向上取整
round(x)取最接近的整数
fix(x)向0取整
@浮点数类型
系统默认的数值类型是double的,所以使用double时可以省略double符号
double类型的数值与其他类型的数值运算时,结果为其他类型的数值,single类型的数值不能和整型直接运算,各种不同位数的整形之间也不能直接运算。@复数
复数由实部和虚部两部分构成,在Matlab中,字符i或j默认作为虚部标志,关于复数的相关函数如下:
函数 说明 函数 说明complex(a,b) 构造以a为实部,以b为虚部的复数 i,j 虚部标识real(z) 返回复数z的实部 image(z) 返回复数z的虚部abs(z) 返回复数z的模 angle(z) 返回复数z的辅角conj(z) 返回复数z的共轭复数@无穷量Inf、非数值量NaN
2逻辑类型
@关系运算符==等于 ~=不等于 =赋值
@逻辑运算符
&与 |或 ~非
3字符和字符串
一个字符串储存在一个行向量中字符串一般是ASCII值的数值数组,字符串里的每个字符是数组里的一个元素
单引号括起来string='every good boy does fun'
字符串内的单引号string='It''s not the manual!' 显示string=
It's not the manual!
字符串数组主要用于可视化编程内容,如界面设计和图形绘制。
1.字符串变量的创建
字符变量的创建方法是:在指令窗口中先把待建的字符放在“单引号对”中,再按回车键。注意,该“单引号对”必须在英文状态下输入。这“单引号对”是MATLAB用来识别字符串变量所必须的。如:
>>a='This is an example.'a = This is an example. >>msg = 'You''re right!' %创建带单引号的字符串msg = You're right!2.字符串数组的标识
字符串变量的每个字符(英文字母、空格和标点都是平等的)占据一个元素位,在数组中元素所处的位置用自然数标识。如:
>>a='Thisis an example.'
>>b=a(1:4) % 提出一个子字符串b = Thisra=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 112108 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. Lee4.2多个字符串形成多行字符串矩阵
l 用中括号则要求两个字符串一般长
>> Aa=[A;a]; %操作错误,不能成生成二行的矩阵,长度不一致
l 用char或strvcat函数进行连接
>>D=strvcat('Hello','Yes','No','Goodbye')%利用串操作函数(chat也可以)创建多行串数组, 连接多行字符串,每行长度可不等,自动把非最长字符串最右边补空格, 使与最长字符串相等,会忽略空字符串。
D = Hello Yes No Goodbye5. 字符串替换和查找
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'),holdoff
4函数句柄间接调用Function_Handle=@Function_Filename;
Function_Filename为对应的M文件或者内部函数
Function_Handle为变量名,后续运算可直接通过Function_Handle(x)来实现Function_Filename(x)的功能
5结构体类型
结构数组的创建
Matlab提供了两种定义结构的方式:直接引用和使用struct函数。 1. 使用直接引用方式定义结构命名方式 "结构体名.字段名"
与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以动态扩充。比如建立一个复数变量x:
x.real = 0; % 创建字段(field)名为real,并为该字段赋值为0x.imag = 0 % 为x创建一个新的字段imag,并为该字段赋值为0x =real: 0imag: 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: 0imag: 0scale: 0x(2) % 查看结构数组的第二个元素的各个字段的内容,注意没有赋值的字段为空ans =real: 0imag: 0scale: [] 应该注意的是,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 =name: '一号温室'volume: '2000立方米'parameter: [1x1 struct]green_house.parameter % 用字段作用符号. 显示指定字段(parameter)中内容ans =temperature: [2x4 double]humidity: [2x4 double]green_house.parameter.temperature % 显示temperature字段中的内容ans =31.2000 30.4000 31.6000 28.700029.7000 31.1000 30.9000 29.6000【例】在上例的基础上,创建结构数组用以保存一个温室群的数据。
green_house(2,3).name = '六号温室'; %产生2×3结构数组green_house % 显示结构数组的结构green_house =2x3 struct array with fields:namevolumeparametergreen_house(2,3) % 显示结构数组元素的结构ans =name: '六号温室'volume: []parameter: []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:typecolorx 得到维数为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: 3s(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))
green_house_1 =2x3 struct array with fields:namevolumeparameter(2)struct预建空结构数组方法之二green_house_2=struct('name',a,'volume',[],'parameter',[]) green_house_2 =2x3 struct array with fields:namevolumeparameter(3)struct预建空结构数组方法之三green_hopuse_3(2,3)=struct('name',[],'volume',[],'parameter',[])green_hopuse_3 =2x3 struct array with fields:namevolumeparameter(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; green_house_4ans =2x3 struct array with fields:namevolumeparameter2. 结构数组的操作
MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要有
函数名 功能描
deal 将其参数值(如单元数组)的内容分别输出到一个个独立的变量
fieldnames 获取结构的字段名
getfield 获取结构中指定字段的值rmfield 删除结构的字段(不是字段内容)
setfield 设置结构数组中指定的字段的值struct 创建结构数组
struct2cell 结构数组转化成单元数组isfield 判断是否存在该字段
isstruct 判断某变量是否是结构类型 下面举一些具体的例子说明如果对结构数组加以操作。【例】对结构数组进行字段的增添和删减操作。
(1)创建结构数组clear,for k=1:10;department(k).number=['No.',int2str(k)];enddepartmentdepartment =1x10 struct array with fields:number(2)增添字段:在数组中任何一个结构上进行的字段增添操作,其影响遍及整个结构数组department(1).teacher=40;department(1).student=300;department(1).PC_computer=40;departmentdepartment =1x10 struct array with fields:numberteacherstudentPC_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: 35female: 13D1T =40(4)删除子字段的操作也只影响被操作的那个具体结构department(2).teacher=rmfield(department(2).teacher,'male');department(2).teacherans =female: 13(5)删除字段的操作是对整个结构数组实施的department=rmfield(department,'student') % 删除一个字段department =1x10 struct array with fields:numberteacherPC_computerdepartment=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 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 22 23 24 25class(ex(1).f) % 检查字段中内容的类型ans =double% 对各结构字段中数值数组相应位置的数据相加求和sum_f=zeros(1,5)for k=1:n_ex,sum_f=sum_f+ex(k).f;end,sum_fsum_f =55 60 65 70 75% 对结构数组字段中各元素分别求平方根disp([blanks(20) 'ex.f的平方根值'])for k=1:n_ex,disp(sqrt(ex(k).f)),endex.f的平方根值1.0000 1.4142 1.7321 2.0000 2.23612.4495 2.6458 2.8284 3.0000 3.16233.3166 3.4641 3.6056 3.7417 3.87304.0000 4.1231 4.2426 4.3589 4.47214.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)]);endfprintf('%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 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 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 5No.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_charF_numricEX1(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:y1y2y3y4y5EX3(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]6数组类型
: i:k i:j:klinspace(a,b,100)
单元数组单元数组中的每一个元素称为单元(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); %预设matlab 空单元数组C(:,1)={char('Another','textstring');10:-1:1} %对第一列单元赋值
C=
[2x11char ] []
[1x10double] []
(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')
单元数组的收缩
A_C(3,:)=[] %删除第3行,使A_C成为matlab 的单元数组
A_C =
[2x10 char ] [3x3 double]
[1.0000+ 2.0000i] [1x1 sym ]
[1x10 double] []
把A_C重组成matlab单元数组R_A_CR_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 25 6]) %注意三种括号的不同用途
%取第1行第1列单元内容中的第1、2、5、6列。
f3=
这是
单元创建
同时调取多个单元内容
[f4,f5,f6]=deal(R_A_C{[1,3,4]}) %取三个单元内容,赋值给三个变量
f4=
这是
单元数组创建算例 1
f5 =
10 9 8 7 6 5 4 3 2 1
f6 =
1 4 7
2 5 8
3 6 9
struct和cell看起来相似,其实可以这样理解struct只能够构造1*n个元素,而cell就是个变态版的数组
7Map函数
Matlab中的映射容器就是Map类,这里的Map类与Java的Map类类似,也是一个key对应着一个value,Map类的所有对象都有三个属性:
Count:表示Map中存储的键值对的数量
KeyType:表示Map对象中包括的key的类型
ValueType:表示Map中的数据类型
1、创建Map对象
>> mapObj=containers.Map({1,2},{'xing','xiao'})mapObj = Map with properties: Count: 2 KeyType: double ValueType: char2、查看和读取Map对象可以通过使用keys函数查看Map对象中包含的所有键;通过values函数查看所有的值。
%获取所有的键
>> keys(mapObj)ans = [1] [2]%获取所有的值>> values(mapObj)ans = 'xing' 'xiao'%获取指定键的值>> mapObj(1)ans =xing%获取多个值>> values(mapObj,{1,2})ans = 'xing' 'xiao'3、编辑Map对象(1)添加键值对
>> mapObj(3)='ming'
mapObj = Map with properties: Count: 3 KeyType: double ValueType: char>> values(mapObj)ans = 'xing' 'xiao' 'ming'(2)删除键值对>> remove(mapObj,2)
ans = Map with properties: Count: 2 KeyType: double ValueType: char>> values(mapObj)ans = 'xing' 'ming'(3)修改键值对如果需要在值不变的情况下对键名进行修改,首先要删除键名和对应的值,然后再添加一个有正确键名的新条目。通过覆盖原有的值,可以在键名不变的情况下对值进行修改。
>> remove(mapObj,1)
ans = Map with properties: Count: 1 KeyType: double ValueType: char>> mapObj(11)='xing'mapObj = Map with properties: Count: 2 KeyType: double ValueType: char>> mapObj(3)='aaa'mapObj = Map with properties: Count: 2 KeyType: double ValueType: char>> keys(mapObj)ans = [3] [11]>> values(mapObj)ans = 'aaa' 'xing'8数据类型之间的转换
类型识别函数:函数 功能 函数 功能
iscell 判断是否为单元数组 isnumeric 判断是否为数值数组isreal 判断是否为实数 ischar 判断是否为字符数组isstr 判断是否为字符串 isfloat 判断是否为浮点数isstruct 判断是否为结构数组 whos 列举变量类型及相关数据类型转换函数:函数 功能 函数 功能
dec2bin 十进制转为二进制 int2str 整数转为字符串num2str 数值转为字符串 str2double 字符串转为double还有其他很多的转换函数,基本上都是类似的语法。