MATLAB常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除了这些基本数据类型,MATLAB还有很多其它的数据类型不为人熟悉,这些数据类型在编程中也非常有用。MATLAB高级数据类型系列旨在向大家介绍它们:比如containers.Map,tables,enumeration和time
series等等,它们为什么有用,用来解决什么问题,并且怎样在科学工程计算使用。本篇首先介绍containers.Map数据类型。
containers.Map简介
MATLAB中最具代表性的高级数据类型是containers.Map,我们可以把它叫做映射表。它和函数映射有些类似,比如函数映射的定义是:
F(x) = Y
针对每一个X,都有一个唯一的Y与之对应,反之不一定。如图Fig.1所示。和函数映射相似,映射表用来形容键(Key)和键值(Key
Value)之间的一一对应关系。每个Key都是独一无二的,且只能对一个Key
Value。如图Fig.2所示。
Fig.1
函数映射关系
Fig.2
containers.Map类的映射示意图
数组,元胞和结构体的局限性
开始我们先介绍一下数组,元胞数组和结构体的局限性,为什么有的时候这些基本的数据类型无法满足程序的要求,换句话说,我们为什么需要containers.Map数据结构。假设要用MATLAB来记录电话号码簿中数据,比如表Table.1所示:
Table.1 电话号码簿
姓名
电话号码
Abby
5086470001
Bob
5086470002
Charlie
5086470003
先讨论数组,因为电话号码簿中既含有数字,又含有字符串,而数组中只能存放Double类型的数据,所以没有办法用数组直接记录电话号码薄中的内容。
再试试元胞数组,我们在第1行预先声明一个3
X 3的元胞数组,然后在2-4行按顺序填放号码簿的内容。
% 元胞数组初始化
addressBook
= cell(3,1);
% 预分配大小是MATLAB编程的好习惯
addressBook{1}
= {'Abby',
'5086470001'};
addressBook{2}
= {'Bob'
, '5086470002'};
addressBook{3}
= {'Charlie',
'5086470003'};
需要的时候,可以通过for循环访问其中的内容,比如:
for iter
= 1:length(addressBook)
% 元胞数组的遍历
addressBook{iter}
% 通过Index访问元胞中的内容
end
但是按照顺序遍历电话号码簿没有什么实际用处,号码簿的主要功能应该是提供查找的功能才是。比如要想查询Charlie的电话号码,我们希望程序最好可以写成如下这样:
CharlieNum
= addressBook{'Charlie'}
% 提示:这是错误的写法
或者
CharlieNum
= addressBook.Charlie
% 提示:这是错误的写法
但是元胞数组的值只能通过Index去访问内容,不支持如上的访问方式。所以为了找到Charlie的电话号码,程序不得不遍历元胞中的所有内容,取出每一个元胞元素的第一列的字符串做比较,如果名字等于Charlie,则输出电话号码:
% 使用for循环查找
for iter
= 1:length(addressBook)
if strcmp(addressBook{iter}{1},'Charlie')
addressBook{iter}{2}
% 如找到则输出电话号码
break;
end
end
当然还有其他的方式来盛放电话号码簿,比如把电话和名字分别存到到两个元胞数组中去
names
= {'Abby','Bob','Charlie'};
% 用元胞放号码
numbers
= {'5086470001','5086470002','5086470001'};
% 用元胞放名字
ind
= find(strcmp(names,'Ch