MATLAB中的数据类型主要包括数值类型、逻辑类型、字符串、函数句柄、结构体和单元数组类型。 这6种基本的数据类型都是按照数组形式存储和操作的。
数值类型
MATLAB中数值类型的数据包括有符号和无符号整数、单精度浮点数和双精度浮点数。
在未加说明与特殊定义时,MATLAB对所有数值按照双精度浮点数类型进行存储和操作。
数值类型的转换,需要使用 相应的转换函数。
1、整数类型
取整函数
MATLAB中还包含了几类不同运算法则的取整函数,也可以把浮点数转换成整数。
2、浮点数类型
双精度浮点数在参与运算时,返回值的类型依赖于参与运算的其他数据类型。
当参与运算的其他数据为逻辑类型、字符类型时,返回结果为双精度浮点数类型;
当参与运算的其他数据为整数类型时,返回结果为相应的整数类型;
当参与运算的其他数据为单精度浮点数类型时,返回结果为相应的单精度浮点数类型。
单精度浮点数类型不能与整数类型进行算术运算。
eps函数(浮点数的精度)
MATLAB中提供了eps函数,可以获取一个数值和最接近该数值的浮点数之间的间隙。
基本用法:
>> eps % 单独使用,默认为1.0
ans =
2.2204e-16
>> eps(1) % 参数为具体数值
ans =
2.2204e-16
>> eps('double') % 参数为数据类型
ans =
2.2204e-16
>> eps('single') % 参数为数据类型
ans =
1.1921e-07
>> eps(0) % 0的精度是最高的,也就是说eps(0)才是matlab所能表示的最小的正数。
ans =
4.9407e-324
复数
复数包括实部和虚部两部分。MATLAB中默认使用字符i或j作为虚部标志。在创建复数时,可以直接按 照复数形式进行输入或者使用complex函数。
无穷量(Inf)
MATLAB中使用Inf和-Inf分别代表正无穷量和负无穷量。
正负无穷量的产生一般是 由于运算溢出,产生了超出双精度浮点数数值范围的结果。
非数值量(NaN)
NaN表示非数值量。
非数值量则是由于0/0或Inf/Inf类型的非正常运 算而产生的,这两个NaN彼此是不相等的。
pi(圆周率)
MATLAB中使用常量 pi 表示圆周率。
realmax(最大的正实数)和 realmin(最小的正实数)
MATLAB中使用 realmax 和 realmin 分别代表最大的正实数和最小的正实数。
基本用法:
>> a=realmax % 单独使用
a =
1.7977e+308
>> a=realmax('double') % 参数为数据类型 double
a =
1.7977e+308
>> a=realmax('single') % 参数为数据类型 single
a =
3.4028e+38
3、常用运算(数学)函数
逻辑类型
MATLAB把任何非零数值当作真,把零当作假。
所有关系和逻辑表达式的输出:对于真,输出为1;对于假,输出为0。
1、关系操作符
2、逻辑运算符
3、常见的逻辑运算和函数
数组或矩阵的比较
MATLAB中的关系操作符能用来比较两个同样大小的数组,或用来比较一个数组和一个标量。在后一 种情况中,标量和数组中的每一个元素相比较,结果与数组大小一样。
基本用法:
& 数组的比较
>> a=[ 1 2 3 4 5 ] % 生成数组a
a =
1 2 3 4 5
>> b=[ 1 5 3 0 5 ] % 生成数组b
b =
1 5 3 0 5
>> a==b % 数组a和数组b比较,返回同样大小的数组,元素相等为1,不相等为0
ans =
1 0 1 0 1
>> a==4 % 数组a和数字4比较,返回同样大小的数组,元素相等为1,不相等为0
ans =
0 0 0 1 0
% 矩阵的比较,类同数组
>> a=[1 2 3;4 5 6]
a =
1 2 3
4 5 6
>> b=[ 1 3 4;2 5 6]
b =
1 3 4
2 5 6
>> a==b
ans =
1 0 0
0 1 1
>> a==3
ans =
0 0 1
0 0 0
xor(x,y)函数(异或运算)
功能为异或运算,x和y同为零(假)或非零(真)时返回0,否则返回1。
any(x)函数(判断零向量或零矩阵)
功能为判断是否为零向量或零矩阵(向量或矩阵中的元素全部为零),如果是非零 向量或非零矩阵,则返回1,否则返回0。
用于判断的函数列表
说明:下图中 Isempty 应为 isempty 。
字符和字符串
一个字符串是由单引号括起来的简单文本。
字符串一般是ASCII值的数值数组,它作为字符串表达式进行显示。
1、字符串的属性(size函数)
>> a='123456' % a 为一个字符串
a =
123456
>> length=size(a) % 求字符串的属性,返回一个数组
length =
1 6
>> length(1) % length(1) 表示字符串数组为1行
ans =
1
>> length(2) % length(2) 表示字符串数组的长度为6
ans =
6
>> a=['abc';'edf'] % a 为一个字符串矩阵
a =
abc
edf
>> length=size(a) % 求字符串的属性,返回一个数组,2表示矩阵有2行,3表示每行长度为3
length =
2 3
2、字符串的索引
字符串像数组一样进行编址。
>> String='Every good boy does fun.';
>> U=String(7:10) % 采用和数组下标一样的方式索引
U =
good
>> U=String(10:-1:7) % 也可以从后向前索引
U =
doog
3、字符串的连接
单行字符串连接(strcat 函数)
在构造单行字符串时,字符串内容依次写在 [ ] 内,使用空格或者 ,隔开。也可以使用strcat函数来实现。
>> U='Hello,';
>> V=' world!';
>> W=[U V] % 字符串直接连接,或者写成W=[U,V]
W =
Hello, world!
>> w=strcat(U,V) % 使用函数实现字符串连接
w =
Hello, world!
多行字符串连接(strvcat函数和char函数)
在构造单行字符串时,字符串内容依次写在 [ ] 或 { } 内,使用 ;隔开。
若字符串内容写在 [ ] 内,那么多行字符串的长度必须相同;若字符串内容写在 { } 内,则多行字符串的长度可以不同。
>> a='abc ';
>> b='12345';
>> c='e fgh';
>> str=[a;b;c] % [ ] 内使用 ;实现多行连接,每行字符串长度必须相同,否则出错
str =
abc % 此处abc后面还包含2个空格
12345
e fgh
>> a='abc';
>> b='12345';
>> c='e fgh';
>> str={a;b;c;} % { } 内使用 ;实现多行连接,每行字符串长度可以不相同
str =
'abc'
'12345'
'e fgh'
在使用strvcat函数连接多行字符串时,每行字符串的长度不要求相等,所有非最长字符串的右边会自动补偿空格,使得每行字符串的长度相同。
char函数与strvcat函数类似,不过当多行字符串中有空字符串时,strvcat函数会自动进行忽略,而char函 数会把空字符串也用空格补偿后再进行连接。
>> A='top';
>> B='';
>> C='Bottom';
>> str1=strvcat(A,B,C) % top后面自动使用空格补齐,去掉空行
str1 =
top
Bottom
>> str2=char(A,B,C) % top后面自动使用空格补齐,空行保留
str2 =
top
Bottom
4、字符串比较函数
通过关系运算符比较
使用关系运算符进行比较时,会对字符串的每个字符进行比较,返回值是一个与字符串长度相同大小的数组,因此被比较的两个字符串的长度必须相同 。
>> A = 'Hello' == 'World'
A =
0 0 0 1 0
使用strcmp函数比较
>> A=strcmp('Hello','World')
A =
0
>> B=strcmp('Hello','Hello')
B =
1
5、字符串查找和替换函数
查找与搜索(findstr函数 )
findstr函数对字母的大小写是敏感的。另外,findstr函数对字符串矩阵不起作用,因此对字符串矩阵的搜索只能通过循环索引矩阵内的元素实现。
>> str='Peter Piper picked a peck of pickled peppers.';
>> find_str=findstr(str,' ') % 查找单个字符,返回对应位置
find_str =
6 12 19 21 26 29 37
>> find_str=findstr(str,' cow') % 查找字符串,未找到返回空
find_str =
[]
>> find_str=findstr(str,' pick') % 查找字符串,返回对应位置
find_str =
12 29
替换(直接赋值)
直接赋值方法并不能使两个不同长度的字符串相互替换。
>> str='Peter Piper picked a peck of pickled peppers.';
>> str(1:11)='Helen Smith' % 给字符串内对应位置直接赋值
str =
Helen Smith picked a peck of pickled peppers.
替换(strrep函数)
strrep函数可以替换两个任意长度的字符串。与findstr函数类似, strrep函数也对字符串矩阵不起作用。
>> str='Peter Piper picked a peck of pickled peppers.';
>> strrep(str,'Peter Piper','Sabrina Crame') % 函数替换,内容可以不等长
ans =
Sabrina Crame picked a peck of pickled peppers.
6、字符串处理函数
说明:下图中的 Isstr 应为 isstr 。
函数句柄
函数句柄提供了一种间接调用函数的方法。
创建函数句柄需要用到操作符 @。
对MATLAB库函数中提供的各种M文件中的函数和使用者自主编写的程序中的内部函数,都可以创建函数句柄,从而可以通过函 数句柄来实现对这些函数的间接调用。
在通过函数句柄调用函数时,也需要指定函数的输入参数。对于那些没有输入参数的函数,在使用句柄调用时,在句柄变量之后的圆括号中不填写变量名即可。
>> b=sin(pi)
b =
1.2246e-16
>> fhandle=@sin % 创建sin函数的句柄
fhandle =
@sin
>> a=fhandle(pi) % 此时fhandle(pi)相当于sin(pi)
a =
1.2246e-16
>> myadd = @(x,y) x+y^2 % 自定义函数并创建函数句柄
myadd =
@(x,y)x+y^2
>> m = myadd(2,4) % 调用函数句柄并计算
m =
18
结构体
MATLAB中的结构体与C语言中的结构体类似,一个结构体可以通过字段存储多个不同类型的数据。 因此,结构体相当于一个数据容器,把多个相关联的不同类型的数据封装在一个结构体对象中。
创建结构体对象的方法有两种,可以直接通过赋值语句给结构体的字段赋值,也可以使用结构体创建函数struct。
1、通过字段赋值创建结构体
>> Student.Name='Sam';
>> Student.Grade=6;
>> Student.Subject={'Chinese','Math','English'};
>> Student
Student =
Name: 'Sam'
Grade: 6
Subject: {'Chinese' 'Math' 'English'}
2、利用struct函数创建结构体
>> Date=struct('Day','Thursday','Time','15:00','Number',18)
Date =
Day: 'Thursday'
Time: '15:00'
Number: 18
3、结构体操作函数
函数名 | 说明 |
struct | 生成结构体变量 |
fieldname | 得到结构体变量的属性名 |
getfield | 得到结构体变量的属性值 |
setfield | 设定结构体变量的属性值 |
isfield | 判断是否为结构体变量的属性 |
isstruct | 判断是否为结构体变量 |
rmfield | 删除结构体变量中的属性 |
单元数组(元胞数组、Cell数组)
单元(Cell)数组是一种无所不包的广义矩阵。组成单元数组的每一个元素称为一个单元。每一个单元可以包括一个任意数组,如数值数组、字符串数组、结构体数组或另外一个单元数组,因而每一个单元可 以具有不同的尺寸和内存占用空间。
和一般的数值数组一样,单元数组的维数不受限制,可以是一维、二维或多维。
MATLAB中使用单元数组的目的在于,它可以把不同类型的数据归并到一个数组中。
1、使用赋值语句创建单元数组
单元数组使用花括号“ { } ”来创建,使用逗号 “ , ” 或空格来分隔每一个单元,使用分号 “ ; ” 来分行。
>> c={'x',[1;2;3];10,pi} % 分2行,每一行有2个单元(元素)
c =
'x' [3x1 double]
[10] [ 3.1416]
2、利用cell函数创建空单元数组
>> a=cell(2,2) % 创建一个2行2列的空单元数组
a =
[] []
[] []
>> a{1,1}='Test'; % 为单元数组的第1个单元赋值
>> a{1,2}=[1,2,3]; % 为单元数组的第2个单元赋值
>> a{2,1}=10; % 为单元数组的第3个单元赋值
>> a{2,2}=[12,13;1,2]; % 为单元数组的第4个单元赋值
>> a
a =
'Test' [1x3 double]
[ 10] [2x2 double]
3、单元数组的寻访
在单元数组中,单元和单元中的内容是两个不同范畴的东西。
MATLAB为上述两种操作设计了相对应的操作对象:单元外标识(Cell Indexing)和单元内编址(Content Addressing)。
对于单元数组C,C ( m , n ) 指的是单元数组中第m行第n列的单元,而 C { m , n } 指的是单元数组中第m行第n列单元中的内容。
>> a
a =
'Test' [1x3 double]
[ 10] [2x2 double]
>> a(1,1) % 第1行第1列,单元为字符串
ans =
'Test'
>> a{1,1} % 第1行第1列,单元中内容为 Test
ans =
Test
>> a(1,2) % 第1行第2列,单元为一维数组
ans =
[1x3 double]
>> a{1,2} % 第1行第2列,单元中内容为1 2 3
ans =
1 2 3
>> a(1,2)(1) % 错误
错误: ()-索引必须显示在索引表达式的最后。
>> a{1,2}(2) % 正确,返回单元中内容的第2个元素
ans =
2
4、单元数组的操作
单元数组的合并
>> a{1,1}='Test';
>> a{1,2}=[1,2,3];
>> a{2,1}=10;
>> a{2,2}=[12,13;1,2];
>> a % 通过赋值,直接创建单元数组a
a =
'Test' [1x3 double]
[ 10] [2x2 double]
>> b='Jan';
>> c={ a , b } % 创建新的单元数组c,其第1个单元为单元数组a,第2个单元为字符串b
c =
{2x2 cell} 'Jan'
单元数组中指定单元的删除
如果要删除单元数组中指定的某个单元,则只需要将空矩阵赋给该单元。
>> a
a =
'Test' [1x3 double]
[ 10] [2x2 double]
>> a{2,1}=[] % 删除单元数组中的一个单元
a =
'Test' [1x3 double]
[] [2x2 double]
reshape函数改变单元数组的形状
在使用reshape函数时不能改变单元数组中的单元总数量。如,原为2*3,可以改为3*2、6*1,但是不能改为3*1 、2*5 。
>> a={1,2,3;4,5,6}
a =
[1] [2] [3]
[4] [5] [6]
>> b=reshape(a,3,2) % 转换为 3行2列
b =
[1] [5]
[4] [3]
[2] [6]
>> b=reshape(a,6,1) % 转换为 6行1列
b =
[1]
[4]
[2]
[5]
[3]
[6]
5、单元数组操作函数
函数名 | 说明 |
cell | 生成单元数组 |
cellstr | 生成字符型单元数组 |
celldisp | 显示单元数组的内容 |
cellplot | 图形显示单元数组的内容 |
cellfun | 对单元数组中元素指定不同的函数 |
iscell | 判断是否为单元数组 |
reshape | 改变单元数组的结构 |