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

MATLAB table数据结构(上)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 uqHZau 于 2020-11-30 13:25 编辑
& F: G  r$ Y3 ?7 {
/ J) G& B& _) m9 }- S, t目录:- ]5 P$ K( F/ A3 v6 n! u
  • table简介
  • 为什么需要table数据结构
  • 通过导入数据构造table对象
  • 调用table构造函数来构造table对象
  • 通过转换函数构造table对象
  • 访问table中的数据4 _. v# R" H' A: q/ S
# P0 Y! ?' I* f$ S4 F' |
MATLAB常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除了这些基本数据类型,MATLAB还有很多其它的数据类型不为人熟悉,这些数据类型在编程中也非常有用。MATLAB高级数据类型系列旨在向大家介绍它们:比如containers.Map, tables,enumeration和time series等等,它们为什么有用,用来解决什么问题,并且怎样在科学工程计算中怎么使用。上篇我们提到了映射表结构(containers.Map )。本篇将介绍另一中新的MATLAB数据类型--table。
2 e; H% H) n( N' M  ]2 ?
3 q* e9 \/ r8 B% E- J. `1 ctable简介" Z% @) v1 c: `7 ~' t
为什么需要table数据结构
7 }  L# U% a: Q# J4 CMathWorks在MATLAB R2013b中引入了一种新的数据结构叫做table 。table类似统计 工具箱中的dataset ,其引入的目的就是用来取代dataset的数据类型。因为表状的数据在工程计算中越来越长久,有了table 类型,MATLAB用户就可以不用购买统计工具箱,也能使用表状的数据结构了。 table本质上来说是一种可以存放各种数据类型的容器,比如下面表Table.1中的数据,其中既有字符型,又有数值类型,其中第一行作为表头:Symbol,Name,Market,Cap,IPO, Year是各列的名字。
$ J' f5 |' ]! ]; V$ S: |7 M$ v; G) a( A
Table.1 NASDAQ股票名称表
Symbol
Name
Market Cap
IPO Year

% ^* l1 s6 |8 J3 A$ g0 t& }AAPLApple Inc$742.63B1980
' A1 x9 _% V7 F/ V' ^. TAMZNAmazon.com, Inc$173.33B1997
1 I# f% R6 j- |+ ZMSFTMicrosoft Corporation$346.9B1986
& `/ ^! }- u8 B
在conatiners.Map的章节中,我们介绍了MATLAB的基本数据类型(比如数组,原胞数组和结构体)在表达某些复杂数据类型时的局限性。这里不再一一赘述,读者只需要认识到:数组的局限性在于不能用来存放数值以外的数据,而使用元胞读取和索引内容时有种种不方便,比如无法区分该数据中的表头和其余的行数据。事实上,如果数据存放在如下的CSV文件中,并且用importdata 直接读取表Table.2中的CSV文件。
( _4 I6 x8 q) V% j; A' e: @
9 h- ]3 D7 L& |) }9 p$ }Table.2 Nasdaq 的 csv 原始数据
$ l: [* r. v6 b& [2 Y/ C4 J4 \"Symbol","Name","Market Cap","IPO Year"1 t) L% ?: W) E$ e+ q1 {: J
"AAPL","Apple Inc","$742.63B",1980
7 v$ d! }2 m3 \"AMZN","Amazon.com Inc","$173.33B",1997. ~1 ^% h0 T) _5 u
"MSFT","Microsoft Corporation","$346.9B",1986
% b3 n5 }2 Q( C# D( R5 s5 ~5 G" j# D; @
读入之后数据将会被分成数值和非数值部分:
$ s5 X! T& T0 H0 V, w% 用importdata直接读入CSV文件
9 w, @! z% t  [9 f+ L* u" F0 h* I>> nasdaq = importdata('nasdaq.csv')2 j& x% M; u( J8 J! z$ P4 E
nasdaq =                          % 结果存在struct中
7 w  s# |; \5 n6 {2 _4 {        data: [3x1 double]5 ?% a  J0 X$ d5 w0 e
    textdata: {4x4 cell}
/ O! S& j# J: m- F+ i/ t8 x>> nasdaq.data                    % csv中的数值部分  C4 N: b6 d) g) k
ans =& {5 B+ U( F% M7 A- P" P% V
        1980
1 T* X# C$ y8 S# n        1997
  C/ B1 j- C) q6 L) F: L9 f# |        1986  
- V7 L0 ^& T  g: V! X% |>> nasdaq.textdata                % csv中的字符部分
8 |; W4 Q3 ?" X1 O! M4 T2 Yans =
! y. D' v+ N# X( G1 b    '"Symbol"'    '"Name"'                   '"Market Cap"'    '"IPO Year"'
8 X# {8 g; `: u5 W    'AAPL'        'Apple Inc'                '$742.63B'        ''          ( a6 a- T/ Z; n6 Y
    'AMZN'        'Amazon.com Inc'           '$173.33B'        ''          * i: ]; I5 h, p% ^
    'MSFT'        'Microsoft Corporation'    '$346.9B'         ''  
. b1 l, p+ j0 b1 K# Y. N- G" o
) ?0 y7 W+ Z1 h显然这不是我们所期待的要导入格式。
4 C+ {% Q: B# M) K7 V/ f; G+ U3 {
0 e4 D! N' y, L; l/ F) \通过导入数据构造table对象
7 s& q7 m7 k8 r沿用表Table.2中nasdaq.csv文件,我们可以使用readtable 函数,构造一个新的table对象,把csv文件中的数据导入到该对象中。readtable函数接受文件名称作为输入,返回一个table对象。$ O! E# O, g; [& `1 Z/ V, G
, s/ L1 f6 f9 M) u# R. y
% 通过readtable函数来构造table对象
$ B7 `$ ?+ J  P: \>> nasdaq = readtable('nasdaq.csv')% i7 Y" [6 \5 ?; }8 x5 o8 N- {! T
Warning: Variable names were modified to make them valid MATLAB identifiers. * K% W2 G; \8 D6 D$ h' E8 U: B+ H- k
nasdaq =                                                               
6 R4 \: z' B- E0 L# ^    Symbol             Name              MarketCap     IPOYear
2 M* G0 |' c( B+ X: j, p8 U    ______    _______________________    __________    _______
% I) W: y, B6 E0 `7 h$ N    'AAPL'    'Apple Inc'                '$742.63B'    1980   0 D1 |( Q4 W$ O4 X
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   
# t7 Y; q( K! [4 g# }, ^% c    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986   
. B$ M( q8 s! Y" [8 O# X! a; \" w
& v0 k4 Y/ P! P3 X* T% k; w: d注意第2行的warning,因为readtable 函数把nasdaq.csv中的第一行自动变成了这个table的表头,在创建table对象的时候,MATLAB会对做表头的文字做处理,这里把Market Cap和IPO Year两个词中的空格去掉,缩成一个词,这样做是为了方便将来使用dot语法来访问表中的数据。因为MATLAB修改了原来的表头,所以这里给出了warning。8 s  `2 E9 N/ i6 P

8 u" [) o3 e) o  p调用table构造函数来构造table对象0 ?% f- S, M/ S; p
我们还可以通过直接调用table类的构造函数来创建table对象 (什么是类的构造函数见参加<>第2.5节,构造函数和类的名称相同)。在containers.Map 的介绍中,我们举了电话号码簿的例子,如表Table.3所示,它是我们这节要构造的table对象的原始数据; z! H* E+ Y1 k2 f  x, f

0 E  V% _1 L# J5 q# Y+ F: STable.3 电话号码簿  k3 o8 p( G' `) {. c5 ]

1 J# Z" T2 w6 b# _
姓名
电话号码

. K7 y) B6 f" }5 D" Q% Z6 W, o! \Abby5086470001
' \- t; X% l. {/ g% P6 ]# W/ eBob50864700020 x3 ~* c" G$ r0 j& c8 D
Charlie5086470003
! c4 h/ j# g' z" [# @  e下面程序中第1,2行用元胞数组来表示表中每一列的数据,第3行规定了表头的名称,第4行调用table的构造函数创建table对象,先输入数据,再输入表头的名称。表头通过table对象的VariableNames属性来设置。
2 T* _) M3 B: [& G' w6 N6 `* z5 X! K# s8 {
name={'Abby';'Bob';'Charlie'};                        % 3x1列向量9 \$ [  b, r/ o' ^4 N7 V" V* K
number={'5086470001';'5086470002';'5086470003'};      % 3x1列向量
2 F  s4 B7 j2 W% z% w5 j7 n9 B7 lcolName={'Name','Number'};0 o2 P8 f. }2 z" w6 R
phonetable=table(name,number,'VariableNames',colName)   
) c+ N/ M( w+ M  c. a+ D& y+ b) O, s
) M% G+ d* `' @5 K7 p. H" r命令行显示如下
5 j# A' P; D5 ?" C8 ?7 t+ O8 @
6 k, E1 P) z% @* e% phonetable在命令行中disp的结果  
! K6 |1 s/ x; F( }7 c) _phonetable =
, i5 e2 {  p' i* G% h3 E" D0 [" R0 I% y7 E      Name          Number   
$ {5 l5 h  Z, Y8 n, t    _________    ____________
. ~4 a2 O2 f. W$ J5 u, y' @
: k) G5 [$ {7 O9 H    'Abby'       '5086470001'
1 f3 T  w  ]# p8 S    'Bob'        '5086470002') u) s3 x9 o; [: h9 D
    'Charlie'    '5086470003'
- O/ M9 ~& x0 k
  z$ |( A8 h! p第4行把Name和Number做为table对象的VariableNames,可以这样理解VariableNames,我们可以把table看成由一个个列数据组成的数据结构,每列都是矢量,其中存放相同类型的数据。如果一个table有两列,它就有两个列矢量,每个列矢量都是table的一个变量(Variable),给变量名字就是Variable Name。! P) u' j2 X* z9 W" ]9 E
2 r) N1 R' e- F/ T0 v
通过转换函数构造table对象
2 K& S; t/ B4 w$ ^除了使用table的构造函数来创建table对象,还可以使用转换函数把其它数据类型转成table,下列通过数组数据类型类构造table。下面的程序的1-2行,我们利用financial工具箱中的fetch函数,从Yahoo财经处得到雅虎从3月1日到3月10日的股票价格,fetch函数将返回一个数组,第3行我们利用array2table转换函数把得到数组转成table。
$ g+ \  w. h8 ~7 c, p3 D, D0 L$ ^3 q2 ~
% 通过array2table创建table对象  
( D$ ]; q, d- b4 B# Qconn = yahoo;
: g/ o. [5 \6 C4 p0 i9 k0 aarray = fetch(conn,'YHOO','3/1/2015','3/10/2015');& `* J, N! ~. ]- {1 m" T2 _
yhoo = array2table(array,...' Q+ D- @% p* `* Q! n: H
  'VariableNames', {'date','open','high','low','closing','volumn','adjusted'})
* Z3 \+ O3 Y6 D- V  i' c3 A. q  g: z: W8 f6 m. k7 a8 c
第4行中,我们通过VariableName来指定表头的内容,结果显示如下3 Z9 T' l. J& }. t% u
3 _# ^# W. Q) |
% yhoo的table在命令行的显示
* Q0 t1 X# X5 p( W  Cyhoo =
+ y3 I; s9 N$ b+ z5 u. ^" q     date       open     high      low     closing      volumn      adjusted# p3 h( S& v9 X: o7 P* Q5 y. s
  __________    _____    _____    _____    _______    __________    ________' l: n3 ]0 r- H8 y* N
   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
) |: F6 q+ Y2 c  L$ b+ q   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   
7 l# [! D* Q. r" x/ b   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   , Z+ E8 B- \( ?0 X5 V
   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
- i# _7 [. g3 W* D' o6 E+ o   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   : f" {- O, s" |$ q5 w  C6 d
   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   
% K. w. _# H" G; L/ z   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
' r# B" |% R5 Z. t, N) O
6 w( n0 z) Y% \# x访问table中的数据
, @* ]$ ?7 i8 B, ?& ?* ?+ Y% O* N* }, i9 L
通过表Table.1所建立的table对象,在命令行中显示如下:5 ?# K2 z5 T0 A/ W3 T
" L' b8 h; B5 s: w/ b4 \! Q5 A
% nasdaq table在命令行中的显示
: Z. o. H: N0 ^  b  Nnasdaq =
" I* g2 o! H5 [0 [7 S9 H    Symbol             Name              MarketCap     IPOYear
% }% A3 H/ u! q! L" m$ i; C( s    ______    _______________________    __________    _______
- j* Z' ~+ W+ w% @( p, `: P  `% r' R4 \8 {
    'AAPL'    'Apple Inc'                '$742.63B'    1980   7 k, j% K$ B$ o7 T& x  L
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   & _; ^  C1 m5 W. y' l. }* Q% z; h' Y# X
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986   
# a8 U3 G# T0 K9 w; t6 v
7 t# N2 ]; M( l+ q我们可以通过使用dot+Variablename的语法直接访问table中的列,返回的结果是cell格式的数据:
& g% x  k; n: \* ]3 f+ K3 b
3 D8 @: z! j  S, _% 使用dot语法访问table中的数据
6 f- s1 Q) X% Z1 x/ ~! G& U>> nasdaq.Symbol           % dot格式+变量名的访问方式
4 X7 M* ^  u# |3 T) I3 Q( X/ L9 aans =
$ H9 c+ H- n( r7 Q    'AAPL'2 w6 F- H' S# k! @. w) }
    'AMZN'
+ G1 ?( u  K+ C6 b  n    'MSFT'; t" |4 T8 l& P3 }& y
>> class(nasdaq)           % 返回cell格式的数据
: ?1 u* e. b+ \6 N" G* ?ans =5 j0 D: B/ ^- f" M6 J5 R- k
cell  
5 p& l0 `, t: T9 |$ E0 z& [
. Z4 j, a) I' a; n# L+ A7 Jtable类重载了subsref函数(什么是运算符的重载,参加《MATLAB面向对象编程-从入门到设计模式》12.1节),于是支持MATLAB传统的圆括号下标访问,如果要访问第一行,则:2 z; O7 s- h8 g

7 ]9 v+ t* ]* y+ v0 ^) f$ L$ m% 使用下标语法访问table中的数据$ E& J, j9 {2 e' u( V  G
>> nasdaq(1,:)
0 S' G. r9 R+ @) c; @ans = - I7 p9 f/ c, n+ _) I/ ~
    Symbol       Name        MarketCap     IPOYear2 y3 P' a$ l( s8 R( _
    ______    ___________    __________    _______
, T9 J: Z- \2 r0 S5 L+ f# H/ Y9 c7 k+ y8 ?9 Q$ I
    'AAPL'    'Apple Inc'    '$742.63B'    1980     2 a* \5 n; N' N; @/ `9 K" `4 d

6 o, n+ ?9 q6 d3 B使用圆括号,返回的结果仍然是table,如果要访问第2到3行,则:$ H1 k# G; V: x3 D

9 Q; H5 P# I3 i2 N% 使用下标语法访问table中的数据4 V* p% R5 v% B/ s' ?2 P7 E9 u
>> nasdaq(2:3,:)$ p/ @0 Z0 I- d' x% B: ~
ans =
; V+ _, m9 M1 r: t    Symbol             Name              MarketCap     IPOYear
% l4 G% [: D. E8 r    ______    _______________________    __________    _______$ v7 x7 _: G) c" L! j! Q

1 ~, a1 Z6 T5 v; I+ o/ L5 d3 Z    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   ; U0 L7 E7 A# J* w
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     , Q) B+ g. g2 j3 p0 F- M" J' H4 {, J

4 ~0 l6 r3 W4 ]- ^; `  }返回的结果仍然是table。 table数据结构支持MATLAB传统的花括号下标访问,返回的结果是cell格式的数据
. A8 [: M9 j& Z$ R, X1 y, p( J+ F 2 m. G+ m$ U" U, `" k
% 花括号下标访问9 W# L8 \7 }+ k2 l. s# s
>> nasdaq{:,1}   % 花括号下标访问,返回第一列中的数据
# q$ @3 s6 k% ], c1 X: Jans =
/ f" c% ~! e' X% X" H# v$ }6 O& {9 f    'AAPL'
! M( C+ R* w! Z    'AMZN'( v9 V& z+ V( L* w/ @: [; }
    'MSFT'
1 j7 _0 P9 I) }% ~: E+ E
/ q2 F- ~% Y; y% H4 N8 D: g$ ]还可以把Dot语法和下标语法结合起来获取数据,下例代码访问table第一列的第三行,返回的结果是元胞。
- `+ t( |& W7 Y& m* d& h# X
% E' a/ N5 T  Q: j" }) ~! J% Dot语法和圆括号下标访问结合# l) C: H. p/ a; s1 c
>> nasdaq.Symbol(3)( A( r. q" i1 E' U9 ^: k% T
ans = % M' y5 O; j$ [+ m9 z7 R
    'MSFT'
; f: o0 L- H- W1 u* @6 |  F) ~>> class(ans)     % 圆括号下标访问,返回结果是元胞
; i0 `. C# f& Y1 C5 e2 m$ c! oans =
7 n( \" z9 k  ~# L8 ucell  
9 o1 y3 o; e( h* l* Y
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-11-30 13:21 | 只看该作者
    大功率开关电源中功率MOSFET的驱动技术
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-11-24 08:20 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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