EDA365电子论坛网

标题: MATLAB table数据结构(下) [打印本页]

作者: uqHZau    时间: 2020-12-16 10:12
标题: MATLAB table数据结构(下)
本帖最后由 uqHZau 于 2020-12-16 10:14 编辑 # ]8 x6 M) q/ R. f( Q8 G6 L
& O5 V4 g5 _- k
目录:表之间的操作熟悉SQL语言的读者对连接的概念应该不会陌生,连接就是把两个或者多个表按照一定的逻辑组合起来。MATLAB的table对象也支持表之间的连接运算,包括内连接,左右连接,全连接。为了节省篇幅,这节略去table对象的构造过程,直接介绍各种连接函数和连接的结果。(本节Employee和Department的例子参考了维基SQL条目)下例表Table.1和Table.2是要使用的原始数据:Table.1 Employee表A2 R6 Q. A; Q, W. O. j) j/ S2 X: O' s
Employee
DepartmentID
Rafferty
31
Jones
33
Steinberg
33
Robinson
34
Smith
34
Jasper
35

& g8 [: h' K" e; ?0 i/ e+ aTable.2 Employee表B" }$ }* E7 G- W# ]- U. C
0 m& f$ B) t: O/ M
DepartmentID
DepartmentName
31
Sales
32
Foundation
33
Engineering
34
HR
35
Marketing
4 b6 |6 w/ ?( y7 h
) Z: c+ y; V6 }
* f" |2 O# N$ v% U: V( b/ i

! U( L+ i7 M- J$ I$ q+ n$ Y3 ^" S7 E$ W
6 y6 [0 Q" K6 Y0 H% r  v

3 T# M% r: s) @* H$ J- L+ A+ Q6 S: A1 ^" y2 _
( E6 {  d# }& h

$ E% C5 C/ q5 }+ r4 L
" N, {4 e8 a5 i; H2 s+ [8 T: G
" N( h; Y0 ~9 m- I) v, _: i3 H+ b3 }/ p3 M( t; o. `: k: {
Table.1中有员工的LastName和所在部门的号码,而表Table.2中有部门号码对应的名字,如果我们想知道每个员工所在部门的名字,要查两次表:首先从表Table.1得到某员工所在部门的号码,再通过这个号码去到表Table.2中去找到对应的名字,这样做不是很方便。 如果能把表Table.2和表Table.2中的DepartmentID“对上”,从而构造出一个有三列数据的新表,并且其中三列分别是LastName,DepartmentID,DepartmentName,那么就只用查一次表了,这个操作其实就是table的join操作。其中join函数的第一个参数叫做左表,第二个参数叫做右表。 t1用表格形式表示如Table.3所示,请读者自行核对。为了说明左连接,右连接和全连接,我们把表Table.1稍作修改,把最后一行Jasper的DepartmentID改成36,如表Table.4Table.3 join(A,B)% |4 l/ D) f3 ?" E" |7 ]5 d: ^
Employee
DepartmentID
DepartmentName
Rafferty
31
Sales
Jones
33
Engineering
Steinberg
33
Engineering
Robinson
34
HR
Smith
34
HR
Jasper
35
Marketing
. d  r8 x" U# C7 X% m3 Q
Table.4 Employee表C) H$ t3 ~7 `3 k& p
Employee
DepartmentID
Rafferty
31
Jones
33
Steinberg
33
Robinson
34
Smith
34
Jasper
36

4 O, j% Z! [/ n8 p3 o7 M0 G
- F# y% s: W1 m3 x$ w( s
5 R0 c; s5 P" x7 C) l0 H3 `1 L/ w3 \7 P# }
) d) q0 ~) ?# z7 z. z  X

- O* F. u  N2 M9 o, ~* u0 a5 D% O, E
) N0 K3 K( K+ x9 M7 x' L, L& O2 n! a# d

  O; z2 S3 g7 O
$ i* a' u* q  p: _! \) [1 y5 U$ \! r$ S5 n- d- `9 N

2 u. `0 ?* F1 |
5 i" l( C& M4 {0 g# ~所谓左连接,即连接结果表中将包含"左表"的所有记录, 即使那些记录在"右表" 没有符合连接条件的匹配。观察t3的结果,其中左表Table.4 中Jasper的DepartmentID是36,在表 Table.2中没有任何对应的行,但是左连接的结果t3中仍然保存了Japser项,并且其对应的DepartmentName为默认空字串。 所谓右外连接, 与左外连接完全类似, 只不过是作连接的表的顺序相反而已. 如果“左表”右连接“右表”, 那么"右表" 中的每一行在连接表中至少会出现一次. 如果 “右表”的记录在"左表"中未找到匹配行, 连接表中来源于“左表”的列的值设为默认空值。右表Table.2中的DepartmentID 35和36在表Table.4都没有任何员工与之对应,但是右连接的结果t4保留了这些没有员工对应的Department。全连接是左右外连接的并集. 连接表包含被连接的表的所有记录, 如果缺少匹配的记录, 即以默认值填充。这允许我们查看每一个在部门里的员工和每一个拥有雇员的部门, 同时, 还能看到不在任何部门的员工以及没有任何员工的部门内连接(inner join)是应用程序中用的普遍的"连接"操作,它一般都是默认连接类型。内连接基于连接谓词,即DepartmentID,将两张表的列组合在一起,产生新的结果表。查询会将 A 表的每一行和 B 表的每一行进行比较,并找出满足连接谓词的组合t1和t5的结果类似,join和innerjoin的区别在于join对两个表的契合度要求更高,表1中的Key一定要在表2中也出现,如果尝试连接表3和表2,因为表C的Jasper的DepartmentID变成了36,而36在表2中不存在,MATLAB报错如下:
1 [) Z7 S: `  _" g
4 c$ |6 L" N* i% Ctable的属性和支持的操作
/ A5 n4 w% O5 J
0 ?0 S' U% ^6 j& l. K8 b最后做个总结,table是MATLAB从R2013b开始新引入的一个类(数据类型)。用UML(Unified Modeling Language)中的类图,可以表示如图 Figure.1Figure.1 table的Class Diagram
9 p% A: O0 C& w: t' \5 Z5 l- P0 Q. v, V  z0 E4 b; b, J) B% V2 Z- ^
0 r5 S# I1 z1 E6 q

" U. \- d& r: G: e图Figure.1中的属性除Properties外都是私有属性,即不可以用dot语法直接访问按照错误信息的提示,我们可以通过Properties这个metadata来访问这些属性,表\ref{map_phone_book_table}对应的table中的Properties将返回如下的内容图Figure.1中的中Import and export,Size and Shape, set, Data Organization操作代表一些列可以施加在table上的方法的集合。我们可以通过help命令来得到该类的帮助信息:其中有这些方法的介绍,这里大致罗列如下,方便读者查阅。! h  w% h6 D, a3 x

: E6 {. K; D' a* D
作者: ExxNEN    时间: 2020-12-16 11:28
MATLAB table数据结构(下)




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2