搜索内容 搜索用户

# MATLAB table数据结构 终篇

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

## 表之间的操作

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'


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              ''           %<-----


% 右连接
>> 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              ''             %<-----


% 内连接
>> 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的属性和支持的操作

% 通过Properties这个中间属性来访问table的其它属性
>> t1.VariableNames
You can not access the 'VariableNames' property directly.  Access it using dot subscripting via .Properties.VariableNames.


% 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类的操作
• 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 鲜花 握手 雷人 路过 鸡蛋

### 最新评论

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

# MATLAB table数据结构 首篇

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

# MATLAB table数据结构 再篇

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

# MATLAB App Designer教程1-6

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

# MATLAB性能测试框架

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