MATLAB table数据结构 终篇

2016-3-10 01:33| 发布者: ilovematlab| 查看: 23166| 评论: 4|原作者: oopmatlab

摘要: MATLAB table是R2013b中引入的一个新的数据结构,虽然不像常用的基本数据类型为人熟悉,但是在编程中非常有用。它用来存放表状类型的数据结构,并且支持常见的表和表之间的运算。 ... ... ... ... ... ... ...

文章PDF浏览下载链接

目录:

表之间的操作

熟悉SQL语言的读者对连接的概念应该不会陌生,连接就是把两个或者多个表按照一定的逻辑组合起来。MATLAB的table对象也支持表之间的连接运算,包括内连接,左右连接,全连接。为了节省篇幅,这节略去table对象的构造过程,直接介绍各种连接函数和连接的结果。(本节Employee和Department的例子参考了维基SQL条目)下例表Table.1Table.2是要使用的原始数据:
Table.1 Employee表A
Employee DepartmentID
Rafferty 31
Jones 33
Steinberg 33
Robinson 34
Smith 34
Jasper 35
Table.2 Employee表B
DepartmentID DepartmentName
31 Sales
32 Foundation
33 Engineering
34 HR
35 Marketing
Table.1中有员工的LastName和所在部门的号码,而表Table.2中有部门号码对应的名字,如果我们想知道每个员工所在部门的名字,要查两次表:首先从表Table.1得到某员工所在部门的号码,再通过这个号码去到表Table.2中去找到对应的名字,这样做不是很方便。 如果能把表Table.2和表Table.2中的DepartmentID“对上”,从而构造出一个有三列数据的新表,并且其中三列分别是LastName,DepartmentID,DepartmentName,那么就只用查一次表了,这个操作其实就是table的join操作。
% join
>> t1 = join(A,B)       % join的第一个参数叫做左表,第二个参数叫做右表
t1 = 
     LastName      DepartmentID    DepartmentName
    ___________    ____________    ______________
    'Rafferty'     31              'Sales'       
    'Jones'        33              'Engineering' 
    'Steinberg'    33              'Engineering' 
    'Robinson'     34              'HR'          
    'Smith'        34              'HR'          
    'Jasper'       35              'Marketing'     
其中join函数的第一个参数叫做左表,第二个参数叫做右表。 t1用表格形式表示如Table.3所示,请读者自行核对。为了说明左连接,右连接和全连接,我们把表Table.1稍作修改,把最后一行Jasper的DepartmentID改成36,如表Table.4
Table.3 join(A,B)
Employee DepartmentID DepartmentName
Rafferty 31 Sales
Jones 33 Engineering
Steinberg 33 Engineering
Robinson 34 HR
Smith 34 HR
Jasper 35 Marketing
Table.4 Employee表C
Employee DepartmentID
Rafferty 31
Jones 33
Steinberg 33
Robinson 34
Smith 34
Jasper 36
所谓左连接,即连接结果表中将包含"左表"的所有记录, 即使那些记录在"右表" 没有符合连接条件的匹配。
% 左连接
>> t3 = outerjoin(C,B,'Type','left','MergeKeys',true)
t3 = 
    LastName      DepartmentID    DepartmentName
    ___________    ____________    ______________

    'Rafferty'     31              'Sales'       
    'Jones'        33              'Engineering' 
    'Steinberg'    33              'Engineering' 
    'Robinson'     34              'HR'          
    'Smith'        34              'HR'          
    'Jasper'       36              ''           %<-----         
观察t3的结果,其中左表Table.4 中Jasper的DepartmentID是36,在表 Table.2中没有任何对应的行,但是左连接的结果t3中仍然保存了Japser项,并且其对应的DepartmentName为默认空字串。 所谓右外连接, 与左外连接完全类似, 只不过是作连接的表的顺序相反而已. 如果“左表”右连接“右表”, 那么"右表" 中的每一行在连接表中至少会出现一次. 如果 “右表”的记录在"左表"中未找到匹配行, 连接表中来源于“左表”的列的值设为默认空值。右表Table.2中的DepartmentID 35和36在表Table.4都没有任何员工与之对应,但是右连接的结果t4保留了这些没有员工对应的Department。
% 右连接
>> t4 = outerjoin(C,B,'Type','right','MergeKeys',true)
t4 = 
   LastName      DepartmentID    DepartmentName
    ___________    ____________    ______________

    'Rafferty'     31              'Sales'       
    ''             32              'Foundation'    %<-----  
    'Jones'        33              'Engineering' 
    'Steinberg'    33              'Engineering' 
    'Robinson'     34              'HR'          
    'Smith'        34              'HR'          
    ''             35              'Marketing'     %<-----    
全连接是左右外连接的并集. 连接表包含被连接的表的所有记录, 如果缺少匹配的记录, 即以默认值填充。这允许我们查看每一个在部门里的员工和每一个拥有雇员的部门, 同时, 还能看到不在任何部门的员工以及没有任何员工的部门
% 全连接
t5 = outerjoin(C,B,'MergeKeys',true)
t5 = 
    LastName      DepartmentID    DepartmentName
    ___________    ____________    ______________

    'Rafferty'     31              'Sales'       
    ''             32              'Foundation'   %<-----  
    'Jones'        33              'Engineering' 
    'Steinberg'    33              'Engineering' 
    'Robinson'     34              'HR'          
    'Smith'        34              'HR'          
    ''             35              'Marketing'    %<-----  
    'Jasper'       36              ''             %<-----    
内连接(inner join)是应用程序中用的普遍的"连接"操作,它一般都是默认连接类型。内连接基于连接谓词,即DepartmentID,将两张表的列组合在一起,产生新的结果表。查询会将 A 表的每一行和 B 表的每一行进行比较,并找出满足连接谓词的组合
% 内连接
>> t5 = innerjoin(C,B)
t5 = 
    LastName      DepartmentID    DepartmentName
    ___________    ____________    ______________

    'Rafferty'     31              'Sales'       
    'Jones'        33              'Engineering' 
    'Steinberg'    33              'Engineering' 
    'Robinson'     34              'HR'          
    'Smith'        34              'HR'      
t1和t5的结果类似,join和innerjoin的区别在于join对两个表的契合度要求更高,表1中的Key一定要在表2中也出现,如果尝试连接表3和表2,因为表C的Jasper的DepartmentID变成了36,而36在表2中不存在,MATLAB报错如下:
% join报错
>> join(C,B)
Error using table/join (line 130)
The key variable for B must contain all values in the key variable for A. 
>> [a b] = lasterr
a =
Error using table/join (line 130)
The key variable for B must contain all values in the key variable for A.
b =
MATLAB:table:join:LeftKeyValueNotFound  

table的属性和支持的操作

最后做个总结,table是MATLAB从R2013b开始新引入的一个类(数据类型)。用UML(Unified Modeling Language)中的类图,可以表示如图 Figure.1
Figure.1 table的Class Diagram
Figure.1中的属性除Properties外都是私有属性,即不可以用dot语法直接访问
% 通过Properties这个中间属性来访问table的其它属性
>> t1.VariableNames
You can not access the 'VariableNames' property directly.  Access it using dot subscripting via .Properties.VariableNames.
按照错误信息的提示,我们可以通过Properties这个metadata来访问这些属性,表\ref{map_phone_book_table}对应的table中的Properties将返回如下的内容
% Properties作为访问table其它属性的中间层
>> t1.Properties
ans = 
             Description: ''
    VariableDescriptions: {}
           VariableUnits: {}
          DimensionNames: {'Row'  'Variable'}
                UserData: []
                RowNames: {}
           VariableNames: {'Name'  'Number'}
>> t1.Properties.VariableNames
ans = 
    'Name'    'Number'  
Figure.1中的中Import and export,Size and Shape, set, Data Organization操作代表一些列可以施加在table上的方法的集合。我们可以通过help命令来得到该类的帮助信息:
>> help table
其中有这些方法的介绍,这里大致罗列如下,方便读者查阅。
  • Import and export类的操作
    • eadtable 读入一个文件,创建table对象
    • writetable 普通函数,把table写入一个文件,内部调用write
    • write 类方法,把table写入一个文件
  • Size and shape类的操作
    • istable 判断一个变量是否是table类型
    • size 返回table的高和宽,表头不计
    • width 返回table的宽
    • height 返回table的高
    • ndims 返回table的维度
    • numel 返回table高和宽的乘积
    • horcat 横向串接table
    • vercat 纵向串接table
  • Set membership类的操作
    • intersect 返回两表中的相同的行
    • ismember 查询表中的行是否在另一表中也出现
    • setdiff 查询两表之间的差异
    • unique 返回的表中没有相同的行
    • sextor 两个集合交集的非
    • union 两个集合的并
    • join 自然连接
    • innterjoin 内连接
    • outerjoin 外连接
  • Data organization的操作
    • summary 返回table的基本信息
    • sortrows 给table按照制定的row排序
    • stack 把table的各列摞成一列
    • unstack 把table的某一列展开成为若干列
    • ismissing 找到table中那些没有赋值的项,返回logical index
    • standizeMissing 给未赋值项赋默认值
  • varfun 把函数作用在table中选定的变量上
  • rowfun 把函数作用在table的每列上

关于作者

oopmatlab,计算物理博士,计算机硕士,《MATLAB面向对象编程-从入门到设计模式》作者,现就职一家科学工程计算公司的任架构组C++软件工程师。业余兴趣包括如何把软件工程中的现代手段,应用到科学和工程计算当中去,来更好的解决复杂的问题。包括如何从整体上设计科学计算程序的结构;如何让程序便于扩展和修改;在改进和开发算法的时候,如何保证程序已有的功能没有收到影响;如何让算法开发和测试系统的建立齐头并进。

声明:
本文内容所有内容仅代表个人观点,如有任何问题,请联系作者。
本版块所有文章版权归作者个人所有,未经允许,不得作为出版物出版。如需转载,请联系论坛管理员

16

鲜花

握手

雷人

路过

鸡蛋

刚表态过的朋友 (16 人)

相关阅读

发表评论

最新评论

引用 雪碧賴W356 2020-6-27 23:28
活到老學到老
引用 hurrying3973 2019-11-3 21:58
这个对于运行大数据量的时候,对运行速度提高如何,不知道有做过的没
引用 serik 2019-5-16 19:56
如果要用机器学习,也是这种数据格式吗
引用 cseng 2018-11-5 03:21
厉害了
引用 Mr.yangj 2018-3-20 16:41
引用 baby1111 2018-1-11 15:14
真心很赞
引用 jiangxuzhen 2018-1-7 16:14
楼主问个问题,是否可以创建3维table,如何索引呢?

查看全部评论(4)

MATLAB table数据结构 首篇

MATLAB table是R2013b中引入的一个新的数据结构,虽然不像常用的基本数据类型为人熟悉,但是在编程中非常有用。它用来存放表状类型的数据结构,并且支持常见的表和表之间的运算。 ... ... ... ... ... ... ... ...

MATLAB映射表数据结构

除了常用的基本数据类型,MATLAB还有很多其它实用的数据类型不为人熟悉,例如映射表containers.Map,常用的MATLAB高级数据类型。它最大的特点使用方便的索引方式进行快速的查找。本篇介绍为什么需要这种数据结构,以 ...

MATLAB table数据结构 再篇

MATLAB table是R2013b中引入的一个新的数据结构,虽然不像常用的基本数据类型为人熟悉,但是在编程中非常有用。它用来存放表状类型的数据结构,并且支持常见的表和表之间的运算。 ... ... ... ... ... ... ...

MATLAB App Designer教程1-6

Mathworks在R2016a中正式推出了GUIDE的替代产品:AppDesigner, 这是在MATLAB图形系统转向使用面向对象系统之后(2014b),一个重要的后续产品,它旨在顺应Web的潮流,帮助用户利用新的图形系统方便的设计更加美观的GUI. ...

MATLAB单元测试

本篇是把现代软件工程思想应用到MATLAB工程开发中的精髓,希望高级MATLAB用户仔细研读。作者用实际的例子解释在开发和逐渐改进算法的时候,如何保证程序已有的功能没有收到影响,步步为营,让算法开发和测试系统的建 ...

MATLAB映射表数据结构

除了常用的基本数据类型,MATLAB还有很多其它实用的数据类型不为人熟悉,例如映射表containers.Map,常用的MATLAB高级数据类型。它最大的特点使用方便的索引方式进行快速的查找。本篇介绍为什么需要这种数据结构,以 ...

对函数的输入进行检查和解析

在工程计算中,如果函数的输入有错误,我们总是希望能尽早捕捉到这些错误,并及时终止程序。在MATLAB 中,可以使用validateattributes,validatestring和inputParser 类来对输入进行检查。它们提供全面的检查功能和清 ...

MATLAB性能测试框架

MATLAB Performance Test 框架是Mathworks 在MATLAB R2016a 中推出的⼀个新的框架,该框架⽤来获得代码性能在统计意义上的数据,还可以⽤来⽐较算法的性能,并且给出详细完整的报告。 ... ... ... ... ... ... ... . ...
关闭

站长推荐上一条 /5 下一条

返回顶部