本节书摘来自异步社区《MATLAB R2012a超级学习手册》一书中的第2章,第2.1节,作者 史洁玉 , 孔玲军,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.1 数据类型
MATLAB R2012a超级学习手册
MATLAB中定义了很多种数据类型,包括整数、浮点数、字符、字符串和逻辑类型等,甚至可以定义自己的数据类型。
2.1.1 数值类型
在MATLAB中有15种基本数据类型。每种基本的数据类型均以矩阵的形式出现,该矩阵可以是最小的0×0矩阵到任意大小的n维矩阵。数组包括数值类型、字符类型、单元类型、结构类型、Java类型、函数句柄。
数值类型包含整数、浮点数和复数3种类型。另外,MATLAB还定义了inf和NaN两个特殊数值。
1.整数类型
在MATLAB中整数类型包含4种有符号整数和4种无符号整数。有符号整数可以用来表示负数、零和正整数,而无符号整数则只可以用来表示零和正整数。MATLAB支持1、2、4和8字节的有符号整数和无符号整数。
这8种数据类型的名称、表示方法和类型转换函数如表2-1所示。应用时要尽可能用字节数少的数据类型表示数据,这样可以节约存储空间和提高运算速度。例如最大值为100的数据可以用1个字节的整数来表示,而没有必要用8个字节的整数来表示。
表2-1中的类型转换函数可以用于把其他数据类型的数值强制转换为整数类型。此外类型转换函数还可以用于生成整数类型的数值。例如,如果需要产生一个无符号2字节整数的数值可以用如下语句实现。
>> x=uint16(36524)
x =
36524
2.浮点数类型
MATLAB 2012浮点数有双精度浮点数和单精度浮点数两种。双精度浮点数为MATLAB 2012默认的数据类型。如果某个数据没有被指定数据类型,那么MATLAB会用双精度浮点数来存储它。为了得到其他类型的数值类型,可以使用类型转换函数。
MATLAB中的双精度浮点数和单精度浮点数均采用IEEE754中规定的格式来定义,其表示范围、存储大小和类型转换函数如表2-2所示。
3.复数类型
复数包含独立的两部分,即实部和虚部。虚部的单位是-1的开平方根,在MATLAB中可以用i或者j来表示。
可以用如下赋值语句来产生复数。
>>a=2+4i
也可以用函数complex来产生复数,示例代码如下。
>>x=2
>>y=4
>>z=complex(x,y)
其中x、y为实数,得到的z是以x为实部,y为虚部的复数。
也可以这样使用complex函数,具体代码如下。
>>x=2
>>z=complex(x)
其中x为实数,得到的z是以x为实部,以0为虚部的复数。
4.inf和NaN
MATLAB中规定用inf、-inf来表示正无穷大和负无穷大。除法运算中除数为0或者运算结果溢出都会导致inf或-inf的结果。以下3条语句运算产生的结果均为inf,具体代码如下。
>>10/0
>>x=exp(5000)
>>x=log(0)
MATLAB中规定用NaN来表示一个既不是实数也不是复数的数值。NaN是NotaNumber的缩写。类似0/0、inf/inf这样的表达式得到的结果均为NaN。
2.1.2 逻辑类型
逻辑类型用1和0来表示true和false两种状态。可以用函数logical()来得到逻辑类型的数值。函数logical()可以把任何非零的数值转换为逻辑true(即1),把数值0转换为逻辑false(即0)。示例代码如下。
>>logical(1)
ans=1
>>logical(0)
ans=0
>>logical(-100)
ans=1
在后面的小节中将介绍的逻辑关系运算符也可以得到逻辑类型的数据。
2.1.3 字符和字符串
MATLAB中规定用数据类型char来表示一个字符。一个char类型的1×n数组则可以称为字符串string。MATLAB中char类型都是以2字节的unicode字符来存储的。
可以用一对单引号来表示字符串,例如下面的代码。
>>str='Youaremyfriend';
也可以用char函数来构造一个字符串,例如下面的代码。
>>str=char('[3031]');
关于字符串的更深入的介绍请参考本书后面的小节。
2.1.4 结构体类型
结构体是根据属性名组织起来的不同类型数据的集合。有一种容易与结构体类型混淆的数据类型是单元数组类型。它是一种特殊类型的MATLAB数组,其每一个元素叫做单元,而每一个单元包含MATLAB数组。
提示:
结构体和单元数组的共同之处在于它们都提供了一种分级存储机制来存储不同类型的数据,不同之处是组织数据的方式不一样。结构体数组里的数据是通过属性名来引用的,而在单元数组里,数据是通过单元数组下标引用来操作的。
结构体数组是一种由“数据容器”组成的MATLAB 2012数组。这种“数据容器”称为结构体的属性(field)。结构体的任何一个属性可以包含任何一种类型的数据。
一个结构体Human,有3个属性,即Name、Score和Salary,其中Name是一个字符串,Score是一个标量,Salary是一个1×6的向量。例如:'Sara'属于Name字符串,100属于Score标量,[1 2 3 4 5 6]是Salary一个1×6的向量。
1.结构体数组的构造
构造一个结构体数组有如下两种方法。
(1)利用赋值语句。
(2)利用函数struct()来进行定义。
下面就通过为结构体中的每一个属性赋值来构造一个结构体数组。示例代码如下。
>>Human.Name='Sara';
>>Human.Score=100;
>>Human.Salary=[123456];
>>Human
上述语句得到的输出代码如下。
Human=
Name:'Sara'
Score:100
Salary:[123456]
还可以用如下语句把结构体数组扩展成1×2的结构体,代码设置如下。
>>Human(2).Name='Tina';
>>Human(2).Score=99;
>>Human(2).Salary=[78];
由上述语句使结构体数组Human的维数变为1×2。当读者扩展结构体数组时,MATLAB对未指定数据的属性自动赋值成空矩阵,使其满足以下规则。
(1)数组中的每个结构体都具有同样多的属性名。
(2)数组中的每个结构体都具有相同的属性名。
例如,下面语句使结构体数组Human的维数变为1×3,此时Human(3).Name和Human(3).Salary由于未指定数据,被MATLAB 2012设为空矩阵。
Human(3).Score=94.5;
注意:
结构体数组中元素属性的大小并不要求一致,例如结构数组Human中的Name属性和Salary属性都具有不同的长度。
除了使用赋值语句来构造结构数组外,还可以用函数struct()来实现构造结构数组。函数struct的基本调用格式如下。
>>strArray=struct('field1',val1,'field2',val2,...);
上面语句中的输入变量为属性名和相应的属性值。
函数struct()可以有不同的调用方法来实现构造结构体矩阵,例如要实现一个1×3的结构数组Human的方法如表2-3所示。
2.访问结构体数组的数据
使用结构体数组的下标引用,可以访问结构体数组任何元素及其属性。同样也可以给任何元素及其属性赋值。还可以通过下面语句来生成一个结构体数组。
>>Human=struct('Name',{'Sara','Tina','Tom'},'Score',{100,99,[]},'Salary',{[123456],[78],[]})
Human =
1x3 struct array with fields:
Name
Score
Salary
读者可以访问结构数组的任意子数组。例如,下面的命令行生成一个1×2的结构数组。
>>NewHuman=Human(1:2);
上述语句得到输出代码如下。
Newhuman=
1x2structarraywithfields:
Name
Score
Salary
读者也可以通过如下命令行生成一个1×3的结构数组。
>>NewHuman=Human(1:3);
上述语句得到输出代码如下。
Newhuman=
1x3structarraywithfields:
Name
Score
Salary
如果要访问结构体数组的某个元素的某个属性,可以用如下格式。
>>Human(2).Score
上述语句得到输出代码如下。
ans=
99
如果要访问结构体数组的某个元素的某个属性的元素值,可以使用如下格式。
>>Human(1).Salary(3)
上述语句得到的输出代码如下。
ans=
3
如果想得到结构体数组的所有元素的某个属性值,可以使用如下格式。
>>Human.Name
上述语句得到输出代码如下。
ans=
Sara
ans=
Tina
ans=
Tom
以上结果表明Human.Name格式的输入将返回结构体数组的所有元素的属性值。可以使用矩阵合并符[]来合并这些结果,程序语句如下。
>>Salary=[Human.Salary]
上述语句得到输出代码如下。
Salary=
12345678
也可以用把它们合并在一个单元数组里,代码设置如下。
>>Salary={Human.Salary}
上述语句得到输出代码如下。
Salary=
[1x6double][1x2double][]
2.1.5 单元数组类型
单元数组就是每个元素为一个单元的数组。每个单元都可以包含任意数据类型的MATLAB数组。例如,单元数组的一个单元可以是一个实数矩阵,或是一个字符串数组,也可以是一个复向量数组。
1.单元数组的构造
构造单元数组有左标志法和右标志法两种方法。下面就详细介绍这两种方法。
(1)左标志法
左标志法就是把单元标志{}放在左边,例如,创建一个2×2的单元数组可以使用如下语句。
>>c{1,1}='Butterfly';
>>c{1,2}=@cos;
>>c{2,1}=eye(1,2);
>>c{2,2}=false;
(2)右标志法
右标志法就是把标志符放在右边,例如,创建和上面一样的单元数组可以使用如下语句。
>>c(1,1)={'Butterfly'};
>>c(1,2)={@cos};
>>c(2,1)=eye(1,2);
>>c(2,2)={false};
上述语句还可以简单地写为下面的代码。
>>c={'Butterfly',@cos;eye(1,2),false};
要显示单元数组可以在命令行中直接输入单元数组的名字,代码设置如下。
>>c
由上述语句得到输出代码如下。
c=
'Butterfly'@cos
[1x2double][0]
另一种显示单元数组的方法是使用函数celldisp(),代码如下。
>>celldisp(c)
由上述语句得到的输出代码如下。
c{1,1}=
Butterfly
c{2,1}=
10
c{1,2}=
@cos
c{2,2}=
0
注意:
函数celldisp()的显示格式与直接输入单元数组名的显示格式是不同的。celldisp()函数更适用于具有大量数据的单元数组的显示。
2.单元数组的读取
以程序c={'Butterfly',@cos;eye(1,2),false}为例。要读取c{1,1}中的字符串,可以使用如下语句。
>>Str=c{1,1}
由上述语句得到输出代码如下。
Str=
Butterfly
如果要读取单元数组的若干个单元的数据,例如读取单元数组c的第1行,可以用下面语句。
>>c(1,:)
上述语句得到输出代码如下。
ans=
'Butterfly'@cos
3.单元数组的删除
将空矩阵赋给单元数组的某一整行或者某一整列,就可以删除单元数组的这一行或者一列。例如,删除单元数组c的第一行可以用如下语句。
>>c(1,:)=[]
上述语句得到输出代码如下。
c=
[1x2double][0]
2.1.6 函数句柄
函数句柄是MATLAB中用来提供间接调用函数的数据类型。函数句柄可以转递给其他函数以便该函数句柄所代表的函数可以被调用。函数句柄还可以被存储起来,以便以后利用。
函数句柄可以用符号@后面跟着函数名来表示,例如下面的代码。
>>fhandle=@sin;
sin为MATLAB中自带的正弦函数,得到的输出变量fhandle为sin函数的句柄。可以利用fhandle来调用sin函数,例如下面的代码。
>>fhandle(0)
上面语句得到的输出代码如下。
ans=0
实际上,该程序中的语句fhandle(0)相当于语句sin(0)。