找回密码
 注册
关于网站域名变更的通知
查看: 403|回复: 1
打印 上一主题 下一主题

MATLAB table数据结构(下)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-12-16 10:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 uqHZau 于 2020-12-16 10:14 编辑
  b4 @/ [/ S/ f4 p8 e7 @
/ f9 {: U- l/ u1 Y0 [/ Y' s7 f0 n4 [目录:
  • 表之间的操作
  • table的属性和支持的操作* b6 O5 M# Y1 B- @0 ^0 k
表之间的操作熟悉SQL语言的读者对连接的概念应该不会陌生,连接就是把两个或者多个表按照一定的逻辑组合起来。MATLAB的table对象也支持表之间的连接运算,包括内连接,左右连接,全连接。为了节省篇幅,这节略去table对象的构造过程,直接介绍各种连接函数和连接的结果。(本节Employee和Department的例子参考了维基SQL条目)下例表Table.1和Table.2是要使用的原始数据:Table.1 Employee表A9 N9 P& k: J" ~
Employee
DepartmentID
Rafferty
31
Jones
33
Steinberg
33
Robinson
34
Smith
34
Jasper
35
* A/ S+ ~, M/ Y; X: C( x8 ]( H
Table.2 Employee表B% N# e+ J! d! ]" K5 z6 M
* c2 `$ E: `1 G" w6 |* u6 _
DepartmentID
DepartmentName
31
Sales
32
Foundation
33
Engineering
34
HR
35
Marketing

  h' u5 f  u$ m0 J. Y- p/ \5 B$ I1 Z8 |4 c

8 u- g1 b# d. A& n" a( `) g: K
; K1 g2 \: f/ j( M; _( u
9 ^3 w" U8 W( a5 W- K0 s; a, x. l
& s$ q5 \) t& k
( x! A+ y* T- C0 W/ O* J# p' t- i$ ~: m9 P
3 |8 q' e# R4 p' v2 i* o9 f' ?
( y# b0 n, q- f& Y  x6 X/ N
0 x3 @8 `4 G9 L% m$ p) q5 Y+ p& O! a5 _0 }2 {

) _  p/ F+ M3 o- K) G9 N
, F6 X. T; x8 W& y2 u0 V8 M: o9 qTable.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'
    5 n4 W/ p7 T+ K
其中join函数的第一个参数叫做左表,第二个参数叫做右表。 t1用表格形式表示如Table.3所示,请读者自行核对。为了说明左连接,右连接和全连接,我们把表Table.1稍作修改,把最后一行Jasper的DepartmentID改成36,如表Table.4Table.3 join(A,B)
" ~7 M9 W+ `  I0 ]7 u# s1 t+ d
Employee
DepartmentID
DepartmentName
Rafferty
31
Sales
Jones
33
Engineering
Steinberg
33
Engineering
Robinson
34
HR
Smith
34
HR
Jasper
35
Marketing

1 T1 t; y4 M9 S! z1 \; r& _8 STable.4 Employee表C# d4 O& g  R# r
Employee
DepartmentID
Rafferty
31
Jones
33
Steinberg
33
Robinson
34
Smith
34
Jasper
36

/ O  s5 Y  \. w$ ?6 H( f! y7 Z2 i( M7 V5 l. `
* T. ]  _: e" T$ N6 B, A
- X# a% z1 e) @) _8 Q- A8 s+ r4 E
- X+ @% w9 L! r% E2 d4 g6 t/ H6 @
( r- U/ R- a- \% X4 [! K3 z, c) `

' ^. Y5 C8 l* `! d: z- A& E( O
" s' }4 o* J. x3 V+ g
2 ?" n/ ^' X+ w! W* V% m6 n) ~- J$ s3 N( W! [4 H

% ]- K* u: l0 z7 T
6 l! n, O- u' q( ~0 p; h" |  j# R2 {- h" g+ ]" b- [  x
所谓左连接,即连接结果表中将包含"左表"的所有记录, 即使那些记录在"右表" 没有符合连接条件的匹配。
  • % 左连接
  • >> 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              ''           %<-----% C9 M- ]+ C8 Y
观察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'     %<-----1 }7 y# N: Q$ r# A$ C8 w/ a6 V
全连接是左右外连接的并集. 连接表包含被连接的表的所有记录, 如果缺少匹配的记录, 即以默认值填充。这允许我们查看每一个在部门里的员工和每一个拥有雇员的部门, 同时, 还能看到不在任何部门的员工以及没有任何员工的部门
  • % 全连接
  • 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              ''             %<-----) n7 a6 I0 E4 i/ h/ `4 m# }, c
内连接(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'- H: K4 {2 Z2 C; p2 D5 h: q
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: LeftKeyValueNotFound3 m7 S9 t  G/ U: ?! x# }

% u( [; z0 F2 s( O8 G4 f4 R) \! u- a" k6 z0 P3 l
table的属性和支持的操作
# _* r" _7 S. L' W- {+ k- I5 X" S2 Y8 j
1 y' G/ d3 |+ Q4 v9 l; P( a( e最后做个总结,table是MATLAB从R2013b开始新引入的一个类(数据类型)。用UML(Unified Modeling Language)中的类图,可以表示如图 Figure.1Figure.1 table的Class Diagram
+ K; K3 D. G7 F
# m9 B* E- ?' z- k9 u9 E8 [7 z" Z $ ~& ]+ g5 a1 p- r+ q
- Z. F. ]/ V" z. T
图Figure.1中的属性除Properties外都是私有属性,即不可以用dot语法直接访问
  • % 通过Properties这个中间属性来访问table的其它属性
  • >> t1.VariableNames
  • You can not access the 'VariableNames' property directly.  Access it using dot subscripting via .Properties.VariableNames.9 J# x" D6 F, V6 [+ v0 v- I8 x* R, W
按照错误信息的提示,我们可以通过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'1 D% T- v! i+ d
图Figure.1中的中Import and export,Size and Shape, set, Data Organization操作代表一些列可以施加在table上的方法的集合。我们可以通过help命令来得到该类的帮助信息:
  • >> help table  @# C/ b& {8 m' M, B$ q7 w9 v
其中有这些方法的介绍,这里大致罗列如下,方便读者查阅。
  • Import and export类的操作8 R' P# h5 m$ J. `% {: z$ K
    • eadtable 读入一个文件,创建table对象
    • writetable 普通函数,把table写入一个文件,内部调用write
    • write 类方法,把table写入一个文件, w% d9 y4 F8 R5 P- i
  • Size and shape类的操作5 F0 A; Z6 ^# |: T( x  D" e( H
    • istable 判断一个变量是否是table类型
    • size 返回table的高和宽,表头不计
    • width 返回table的宽
    • height 返回table的高
    • ndims 返回table的维度
    • numel 返回table高和宽的乘积
    • horcat 横向串接table
    • vercat 纵向串接table# l4 r8 W& @( E. A
  • Set membership类的操作. l3 O2 t" H! h$ f3 e3 q; y
    • intersect 返回两表中的相同的行
    • ismember 查询表中的行是否在另一表中也出现
    • setdiff 查询两表之间的差异
    • unique 返回的表中没有相同的行
    • sextor 两个集合交集的非
    • union 两个集合的并
    • join 自然连接
    • innterjoin 内连接
    • outerjoin 外连接7 v* L- B3 s/ P$ A9 p& _
  • Data organization的操作
    1 s. \5 i$ y8 I, m' W8 L! z' F
    • summary 返回table的基本信息
    • sortrows 给table按照制定的row排序
    • stack 把table的各列摞成一列
    • unstack 把table的某一列展开成为若干列
    • ismissing 找到table中那些没有赋值的项,返回logical index
    • standizeMissing 给未赋值项赋默认值. G: F+ u, I) Q
  • vaRFun 把函数作用在table中选定的变量上
  • rowfun 把函数作用在table的每列上  M* c/ _5 B/ \5 M
/ u* D3 ~4 x8 s
7 X; }' {' |( ~& D& b" b: f

该用户从未签到

2#
发表于 2020-12-16 11:28 | 只看该作者
MATLAB table数据结构(下)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-6 23:00 , Processed in 0.140625 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表