
MATLAB 中的数据类型与其它语言类似,下文将对MATLAB中的数据类型做一总结
注意:在matlab中有whos()函数和class()函数等可以查看变量数据类型,使用格式如下代码
>> class(a) %%注意此处使用class的时候必须要加括号,因class还有定义类的功能
>> whos a
>> whos a b c %%使用whos()函数查看多个变量只需使用空格分开即可
MATLAB中的变量都默认为一个矩阵,矩阵中元素数据类型有下列几类:

一、数值型
1、整型
(1) int:带符号整型
(2) uint:无符号整型
>> a = 18;
>> b = -18;
>> whos a b %%此处whos()函数可以查看参数的属性
Name Size Bytes Class Attributes
a 1x1 8 double
b 1x1 8 double
>> a1 = int8(a);
>> b1 = int8(b);
>> whos a1 b1
Name Size Bytes Class Attributes
a1 1x1 1 int8
b1 1x1 1 int8
>> a2 = uint8(a)
a2 =
uint8
18
>> b2 = uint8(b) %%注意此处将负数强制转换成无符号数值时成为0
b2 =
uint8
0
2、浮点型
(1)single:单精度
(2)double:双精度
double()函数可以将字符转化为相应的ASCII码组成的向量
s = 'chenwen wen';
>> double(s(3))
ans =
101
(3 )复型

real(z):计算复数的实部

imag(z):计算复数的虚部

abs(z):计算复数的模

angle(z): 以弧度为单位给出复数的幅角
>> z = 2+3i;
>> x1 = real(z)
x1 =
2
>> x2 = imag(z)
x2 =
3
>> x3 = abs(z)
x3 =
3.6056
>> angle(z)
ans =
0.9828
>> x4 = angle(z)
x4 =
0.9828
二、逻辑型(布尔型)
ind = x<0;
x(ind) = 1;
%使用上述代码可以将x向量中小于零的数全部转化为1;
logical()函数可以将数值型转化为逻辑型
任何非零的转化为真1,零为假0
三、字符型
MATLAB中的字符在存储空间中与相应的ASCII码对应,字符串可以理解为字符的数组。
>> a = [1:5]; %a为一个数值数组
>> b = num2str(a); %该函数将a转化为字符串类型
>> x1 = a*2; %此处为a中的数值一次乘2
>> x2 = b*2; %由于b中为字符,所以此处为b中字符的ASCLL码和2相乘
>> x1
x1 =
2 4 6 8 10
>> x2
x2 =
98 64 64 100 64 64 102 64 64 104 64 64 106
四、struct数组(结构体数据)
结构体数组的基本部分(Element)是结构(structure)。数组中的每个结构都是平等的,他们以下标区分。
1、结构数组的创建
(1)直接赋值法
>> student.name = 'zhangsan';
>> student.grade = 18;
>> student.subject = {'maple','matlab','mathmatics'};
>> student.result = {87 ,89, 90};
>> student
student =
包含以下字段的 struct:
name: 'zhangsan'
grade: 18
subject: {'maple' 'matlab' 'mathmatics'}
result: {[87] [89] [90]}
>> whos student
Name Size Bytes Class Attributes
student 1x1 1466 struct
(2)函数法
在matlab中使用struct()函数来创建结构体数组。
调用格式:
s = struct('field1','values','field2','values',……)
s = struct('field1',{},'field',{},……)
s = struct([ ]):建立一个没有字段的空结构。
s = struct(obj):将对象obj转换为它的等价结构。
field为字段名,value表示对应于field的字段值。field必须是和value同样大的元胞数组或标量。value相当于所有field的一个名字集合,一个struct中有不同的域,每一个域有一个名字value1,value2 ……,这些value的总和为value,一个value对应一个field,所有field的总和为field
>> field = 'f';
>> value = {'test';[18 29 10];magic(3)};
>> s = struct(field,value); %%在该struct中定义了一个域,该域对应着三列
>> s.f
ans =
'test'
ans =
18 29 10
ans =
8 1 6
3 5 7
4 9 2
>> s(2).f %%此处为显示第二列的域field
ans =
18 29 10
2、结构数组的操作
(1)对结构数组的访问和显示
a、同数组的访问,如s(:,1);
b、s.field1可以访问field对应的所有value
c、s(1).field1 可以访问第一列在field1对应的值
具体见下面代码实例
>> ss = struct('name',{'huang','chen','liu'},'num',[83 93 98],'age',{23 18 29});
>> ss(:,2) %% 例子a
ans =
包含以下字段的 struct:
name: 'chen'
num: [83 93 98]
age: 18
>> ss.num %% 例子b
ans =
83 93 98
ans =
83 93 98
ans =
83 93 98
>> ss(1).name 例子c
ans =
'huang'
(2)删除结构体
删除结构体一般使用rnfield()函数
调用格式:
s = rmfield(s,field): 用于删除成员变量field,当field为字符型变量或单元型变量时,可以一次删除多个指定的成员变量。
>> s.chen = 19;
>> s.wang = 39;
>> s.liu = 89;
>> s.zhao = 98;
>> fields = {'wang','zhao'};
>> s = rmfield(s,fields) %%注意此处引用函数rmfield来将s结构体中field域删除。
s =
包含以下字段的 struct:
chen: 19
liu: 89
五、cell数组(单元数组)
cell数组是由可以包括任何数据类型的单元组成的数组。,使用"{}"创建。使用“;”分行。
通过cell数组可以在同一个变量中存储不同数据类型的数据,给代码的编写带来的很大的便利
1、cell数组的创建:
(1) 直接赋值法:
此方法较为容易,需要注意的是
a、无论用"()"还是用"{}"都可以表示单元的下标,而且都可以用来输入元素,但是前后需要不同。
b、使用"{}"表示单元下标的时候后面可以不用括号,使用"()"的时候不行。
>> A(1,1) = {[2 3 4 ;2 3 4]};
>> A(1,2) = {'dhifnj'};
>> A{1,3} = 'chen';
>> A{1,4} = ('fsdfa')
A =
1×4 cell 数组
{2×3 double} {'dhifnj'} {'chen'} {'fsdfa'}
>> A(1,5) = 'dsaf'
无法从 char 转换为 cell。 %%此处为matlab报错!!!
>> A(1,5) =('dhkg')
无法从 char 转换为 cell。 %%此处为matlab报错!!!
(2) 函数法:
使用cell()函数生成单元数组,相当于先利用函数对单元内存空间分配成给定的区域,然后对单元中的元素进行赋值。
调用格式:
c = cell(n): 建立一个n

c = cell(m,n) 或c = cell([m,n]): 建立一个m

c = cell(m,n,p,……)或c = ([m,n,p,……]): 建立一个m



c = cell(size(A)): 建立一个元胞数组c,其大小同数组A.
c = cell(javaobj): 将java数组或者java对象javaobj转换为matlab中的cell数组。
>> A = cell(3)
A =
3×3 cell 数组
{0×0 double} {0×0 double} {0×0 double}
{0×0 double} {0×0 double} {0×0 double}
{0×0 double} {0×0 double} {0×0 double}
%%下面是对Java数组的转换
>> strArray = java_array('java.lang.String',3);
>> strArray(1) = java.lang.String('one');
>> strArray(2) = java.lang.String('two');
>> strArray(3) = java.lang.String('three');
>> cellArray = cell(strArray)
cellArray =
3×1 cell 数组
{'one' }
{'two' }
{'three'}
2、单元数组的访问和显示:(1) 使用"{}"访问
使用{}可以访问到cell数组内元素具体的内容,并且可对其中的数据执行具体的操作
>> A = {3,'chen';magic(3),magic(3)>2};
>> A
A =
2×2 cell 数组
{[ 3]} {'chen' }
{3×3 double} {3×3 logical}
>> A{1,2} %%使用"{}"访问A中第一行第二列中的数组
ans =
'chen'
>> A{2,2} %% 使用"{}"访问A中第二行第二列中的数组
ans =
3×3 logical 数组
1 0 1
1 1 1
1 1 0
>> A{2,1}(1,2) %% "{}"和"()"共同使用访问A中第二行第一列中数组的第一行第二列的元素
ans =
1
(2)使用"()"访问
使用()可以访问单元数组是访问单元数组中的整体,不可以访问cell数组中的具体元素。
>> A = {3,'chen';magic(3),magic(3)>2};
>> A(2,2)
ans =
1×1 cell 数组
{3×3 logical}
>> A(1,2)
ans =
1×1 cell 数组
{'chen'}
3、cell数组的删除
对于cell数组的删除可以通过把需要删除的单元赋值为空来实现。通过"{}"和"()"来访问元素并将其赋值置空,即可删除需要删除的内容。
在cell数组删除的时候与上面相同可以使用"{}"和"()"两种来实现删除,用法与cell数组的访问相同。
>> A = {3,'chen';magic(3),magic(3)>2};
>> A
A =
2×2 cell 数组
{[ 3]} {'chen' }
{3×3 double} {3×3 logical} %%此处A{2,2}处为一个3*3的数组,与下面对应
>> A{2,2}(2,:) = []; %%使用该行代码将A{2,2}中第二行全部删除
>> A
A =
2×2 cell 数组
{[ 3]} {'chen' }
{3×3 double} {2×3 logical} %%此处A{2,2}为一个2*3的数组
六、时间和日期型
MARLAB中有许多的函数可以用来处理时间和日期,

>> format shortg
>> clock
ans =
2019 8 15 21 53 17.41
>> date
ans =
'15-Aug-2019'
>> A = '15-Aug-2019';
>> [DayNumber,DayName] = weekday(A) %%返回该日期的星期
此处DayNumber为星期的序号,从周日开始计算。
DayNumber =
5
DayName =
'Thu'
日期与时间格式转换:
a、datestr()函数: 该函数可以将日期数字和日期向量转化为日期字符串,
>> x = datestr(now)
x =
'15-Aug-2019 22:29:42'
>> x1 = datestr(now,'dd-mmm-yyyy')
x1 =
'15-Aug-2019'
>> x2 = datestr(now,'HH:MM:SS')
x2 =
'22:32:28'
b、datenum()函数
该函数用于将日期字符串和日期向量转化为日期数字。此处的日期数字是一串数字,其计算是将每个时间点表示为从 0000 年 1 月 0 日起的天数。咋们可以通过计算来验证次结果。
下面代码设定要计算的时间为2018-8-3 00-00-00,通过函数计算后返回737275
通过计算器计算得:

>> t = '03-Aug-2018 00:00:00'
t =
'03-Aug-2018 00:00:00'
>> DateNumber = datenum(t)
DateNumber =
737275
c、datevec()函数
该函数可以将日期数字和日期字符串转化为日期向量。
>> DateString = '28.03.2005';
>> formatIn = 'dd.mm.yyyy';
>> datevec(DateString,formatIn)
ans =
2005 3 28 0 0 0
>> DateString1 = {'09/16/2007';'05/14/2019';'11/29/1020'};
>> formatIn1 = 'mm/dd/yyyy';
>> datevec(DateString1,formatIn1)
ans =
2007 9 16 0 0 0
2019 5 14 0 0 0
1020 11 29 0 0 0


七、函数句柄
在MATLAB中可以通过调用函数句柄来简介调用函数,相当于给函数一个名字,然后通过该名字来调用该函数。
函数句柄的基本结构是:function_handle
例如,f = @sin,我们可以通过f来调用sin()函数。
>> f = @sin
f =
包含以下值的 function_handle:
@sin
>> t = 0:pi/5:pi;
>> f(t)
ans =
0 0.58779 0.95106 0.95106 0.58779 1.2246e-16
常用的几个与句柄相关的函数:

>> fhandle = @sin;
>> func2str(fhandle)
ans =
'sin'
>> ff = 'cos';
>> str2func(ff)
ans =
包含以下值的 function_handle:
@cos
>> fff = functions(@plot)
fff =
包含以下字段的 struct:
function: 'plot'
type: 'simple'
file: 'MATLAB built-in function'
>> f = cellfun(@str2func,{'sin','cos','tan'},'UniformOutput',false);
%%此处cellfun函数实际上是将cell数组里的所有元素执行函数str2func。
>> f{2}(2*pi) %%此处{}代表元胞数组第二个元素cos,(2*pi)表示自变量为2*pi
ans =
1
上述代码中cellfun()函数的用法可以参考下面链接
Matlab cellfun函数blog.youkuaiyun.com上述为matlab中常见的数据类型,在不同的时候需要使用不同的数据类型。对于cell数组于struct数组的差异,使用及相互转化参考如下链接:
灵魂歌手水云天:MATLAB数据类型及相互转换(二)zhuanlan.zhihu.com
本文参考文献:
清华大学出版社《MATLAB基础于可视化编程》
由于水平有限,时间仓促,不足之处请批评指正。
更多MATLAB学习资源请入QQ群:953314432。