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

MATLAB table数据结构(上)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 uqHZau 于 2020-11-30 13:25 编辑
' I8 C7 G) R; W- p  T3 R; M" i+ U
/ m' U7 Y$ Z: r. r7 W6 A: j, V目录:# i: G1 `( z0 _! P  J$ T
  • table简介
  • 为什么需要table数据结构
  • 通过导入数据构造table对象
  • 调用table构造函数来构造table对象
  • 通过转换函数构造table对象
  • 访问table中的数据
    ( n2 u0 w. T0 I7 E
- i0 v$ M; r- O) I8 R$ o/ e
MATLAB常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除了这些基本数据类型,MATLAB还有很多其它的数据类型不为人熟悉,这些数据类型在编程中也非常有用。MATLAB高级数据类型系列旨在向大家介绍它们:比如containers.Map, tables,enumeration和time series等等,它们为什么有用,用来解决什么问题,并且怎样在科学工程计算中怎么使用。上篇我们提到了映射表结构(containers.Map )。本篇将介绍另一中新的MATLAB数据类型--table。
" x4 [3 {3 ~- L& f
/ d# w! q: V& l- M! J# W. Dtable简介1 p& u! Q. t) \/ P6 L. O+ f
为什么需要table数据结构
/ K% M+ P& ?' B0 _2 G7 O; IMathWorks在MATLAB R2013b中引入了一种新的数据结构叫做table 。table类似统计 工具箱中的dataset ,其引入的目的就是用来取代dataset的数据类型。因为表状的数据在工程计算中越来越长久,有了table 类型,MATLAB用户就可以不用购买统计工具箱,也能使用表状的数据结构了。 table本质上来说是一种可以存放各种数据类型的容器,比如下面表Table.1中的数据,其中既有字符型,又有数值类型,其中第一行作为表头:Symbol,Name,Market,Cap,IPO, Year是各列的名字。! L- W  m# M6 t! M% j

8 y, K% ~2 ?4 a) ^- xTable.1 NASDAQ股票名称表
Symbol
Name
Market Cap
IPO Year
  E2 u" l8 g" V" b6 V! m9 H
AAPLApple Inc$742.63B19801 A8 w/ @  C$ \5 D& O1 f' x% ?! x
AMZNAmazon.com, Inc$173.33B1997
7 P- ^8 D8 W) n1 [# Q4 x8 ~MSFTMicrosoft Corporation$346.9B1986

  y+ Z/ V% T" t6 w在conatiners.Map的章节中,我们介绍了MATLAB的基本数据类型(比如数组,原胞数组和结构体)在表达某些复杂数据类型时的局限性。这里不再一一赘述,读者只需要认识到:数组的局限性在于不能用来存放数值以外的数据,而使用元胞读取和索引内容时有种种不方便,比如无法区分该数据中的表头和其余的行数据。事实上,如果数据存放在如下的CSV文件中,并且用importdata 直接读取表Table.2中的CSV文件。8 h1 z2 k# M$ [+ ]

3 N* l6 v  f! P6 E0 MTable.2 Nasdaq 的 csv 原始数据
3 O( p' H6 C1 j( a9 G"Symbol","Name","Market Cap","IPO Year", M5 l/ |7 k, @* }+ q
"AAPL","Apple Inc","$742.63B",1980/ B; C% v  {$ n, W2 \4 o
"AMZN","Amazon.com Inc","$173.33B",1997
% k0 F. [  R! B1 J; u1 R; b4 |- R( i"MSFT","Microsoft Corporation","$346.9B",1986. S6 L6 `. S5 W
) R4 {- M9 F. T& v' ]" S7 `
读入之后数据将会被分成数值和非数值部分:
2 q1 v- s! ^* E1 Y3 K2 {/ O! I: u1 O9 x% 用importdata直接读入CSV文件# Z) K- R$ [2 l* |7 B+ B0 Z
>> nasdaq = importdata('nasdaq.csv')9 P# w: P; [$ ?; K4 j% P4 j, V
nasdaq =                          % 结果存在struct中
. P" ]* t$ U$ K0 @        data: [3x1 double]
+ D( ^3 ^- D. d1 m; Q    textdata: {4x4 cell}7 Q- a. @# m; f- @, _
>> nasdaq.data                    % csv中的数值部分
3 z% b) E! r0 F9 S- fans =
+ ?- y$ ]! K' f( U        19800 e! \! h3 t' j. S0 U5 t
        1997
  _+ |1 R7 f4 K6 L0 D6 o& M        1986  
# Y9 L! A8 S* k0 w>> nasdaq.textdata                % csv中的字符部分- S& f) b9 g8 D& S. @
ans = ; w! N3 S, k7 D8 C
    '"Symbol"'    '"Name"'                   '"Market Cap"'    '"IPO Year"'
. D9 c) ~6 F6 f4 H$ q: k% P7 Y' n    'AAPL'        'Apple Inc'                '$742.63B'        ''          % }% e* C9 ?# L9 g4 `1 [! |
    'AMZN'        'Amazon.com Inc'           '$173.33B'        ''         
3 Y3 e% C: ~# X: R    'MSFT'        'Microsoft Corporation'    '$346.9B'         ''  # t, r1 i3 I& z7 r4 t: \- a

0 f9 h" a) s0 c5 P显然这不是我们所期待的要导入格式。
  W0 c! Q. }% x5 ?
" R3 r/ x; F8 ^  q通过导入数据构造table对象
8 D2 E7 c( o4 O' b$ ^沿用表Table.2中nasdaq.csv文件,我们可以使用readtable 函数,构造一个新的table对象,把csv文件中的数据导入到该对象中。readtable函数接受文件名称作为输入,返回一个table对象。9 z) J7 ^7 x( S6 `2 }( [7 H

3 ]4 J) c- S6 D7 f  @; m. y$ m% 通过readtable函数来构造table对象1 R' j4 W7 s0 Y: l
>> nasdaq = readtable('nasdaq.csv')/ S+ q2 b) l# }' o( u8 ~
Warning: Variable names were modified to make them valid MATLAB identifiers.
6 Z+ t/ }0 @% v. c( |6 ~' \nasdaq =                                                                2 v3 ~5 Q: I- k5 \  L) ~) \
    Symbol             Name              MarketCap     IPOYear
0 ^( C" _* K" Q# ]    ______    _______________________    __________    _______
7 y' D' ?$ N! s9 [( E% u    'AAPL'    'Apple Inc'                '$742.63B'    1980   
# k* i" @; K0 i/ u7 h" F3 `; q    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   
, }, L+ h, c# O( X/ ]# I    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986   
8 Y3 n3 f5 i$ r; z: s* h, R! B0 ^! L+ w; l
注意第2行的warning,因为readtable 函数把nasdaq.csv中的第一行自动变成了这个table的表头,在创建table对象的时候,MATLAB会对做表头的文字做处理,这里把Market Cap和IPO Year两个词中的空格去掉,缩成一个词,这样做是为了方便将来使用dot语法来访问表中的数据。因为MATLAB修改了原来的表头,所以这里给出了warning。6 ~3 h; h( y/ H
! ~- O# Q- O1 g
调用table构造函数来构造table对象/ n: J+ _. L# M7 k7 f4 o" k6 w
我们还可以通过直接调用table类的构造函数来创建table对象 (什么是类的构造函数见参加<>第2.5节,构造函数和类的名称相同)。在containers.Map 的介绍中,我们举了电话号码簿的例子,如表Table.3所示,它是我们这节要构造的table对象的原始数据& o( B$ k7 ?; Q% Z* n$ X% m9 B( ?+ s

  K! e6 A9 D6 k# _. Y1 KTable.3 电话号码簿) x; T$ a" f, Q8 f/ W

. T& I) y8 |( \% X3 d
姓名
电话号码

, Q' ~- Z* O, A. X) _: s1 MAbby5086470001% ^4 T& p! ^0 h- q
Bob50864700025 ~$ Y! \: E5 t& i9 |
Charlie5086470003; n3 v5 ~* ?" f- p8 m
下面程序中第1,2行用元胞数组来表示表中每一列的数据,第3行规定了表头的名称,第4行调用table的构造函数创建table对象,先输入数据,再输入表头的名称。表头通过table对象的VariableNames属性来设置。
' ?5 B. I* _' F4 P& O1 \, I
' m6 S8 e  X# f6 _' \, ?name={'Abby';'Bob';'Charlie'};                        % 3x1列向量8 ^0 P: |) h# i; s/ o2 Z
number={'5086470001';'5086470002';'5086470003'};      % 3x1列向量
! N* K/ F5 K3 G( i5 ecolName={'Name','Number'};
( v6 U2 K6 t1 O& a! sphonetable=table(name,number,'VariableNames',colName)   
5 k2 S6 b. a8 y" e6 s" D1 C/ [3 }" {* l: B
命令行显示如下3 e6 a4 c& T+ L+ J1 |4 l
& V/ p! {1 f. Y; @( o/ p1 }* ?' h
% phonetable在命令行中disp的结果  7 j- z1 \$ b6 z2 |% u
phonetable =
* e# [, ~) y* m- w. j      Name          Number   
* D7 j, r# }! A3 |; X    _________    ____________% K( U- b. a+ n$ y
$ ~$ {* o$ d1 M  C2 W9 [
    'Abby'       '5086470001'( d/ ], i3 x  \0 w8 M) r/ K6 V
    'Bob'        '5086470002': o$ G1 ~2 L& u( |9 K9 b& i7 f. U
    'Charlie'    '5086470003'$ \7 O1 T: ^2 d5 Z' S6 L" G

# G" Y4 v3 k8 x第4行把Name和Number做为table对象的VariableNames,可以这样理解VariableNames,我们可以把table看成由一个个列数据组成的数据结构,每列都是矢量,其中存放相同类型的数据。如果一个table有两列,它就有两个列矢量,每个列矢量都是table的一个变量(Variable),给变量名字就是Variable Name。
/ Z) e- ~- s, k, b# i' d9 ^9 k( d
通过转换函数构造table对象
- d7 O7 p& g- f除了使用table的构造函数来创建table对象,还可以使用转换函数把其它数据类型转成table,下列通过数组数据类型类构造table。下面的程序的1-2行,我们利用financial工具箱中的fetch函数,从Yahoo财经处得到雅虎从3月1日到3月10日的股票价格,fetch函数将返回一个数组,第3行我们利用array2table转换函数把得到数组转成table。8 E. o  E+ c0 u
% G5 h2 }5 G% w
% 通过array2table创建table对象  $ F' r; G1 X7 T
conn = yahoo;8 C- U$ H0 h! y
array = fetch(conn,'YHOO','3/1/2015','3/10/2015');
3 w2 P/ G8 C8 }! s) k  q( ?/ ^yhoo = array2table(array,...
+ B  r1 H! J* R# Q  N& V2 j$ g  'VariableNames', {'date','open','high','low','closing','volumn','adjusted'})( J2 {0 ?& w1 E  i
7 _. j' J$ l8 T7 Q9 p0 q3 r( j% Q
第4行中,我们通过VariableName来指定表头的内容,结果显示如下
/ P7 P7 a$ b& D# c
2 A/ l; ~. N2 J- [% yhoo的table在命令行的显示
. @$ w% d* U- U  J  D: s  F# Oyhoo =
7 J5 j9 |7 r! L9 X2 j  R5 r# C0 W     date       open     high      low     closing      volumn      adjusted
; X1 {' ?+ `2 R" K1 ~  __________    _____    _____    _____    _______    __________    ________
4 C/ m, R* e% J6 f, p   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
) y. ^6 `& s. {8 C3 k2 b   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   ! X4 z9 P/ O/ O+ S4 |8 t
   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   8 }+ Z  [* c- s
   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
* X% z& B" Y  l' {' t$ G0 ?   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   . A4 v# v5 C! u4 w5 f+ a4 h+ G, b
   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   
' P) n9 d4 D8 v( W. O$ X8 K$ N   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     : Q1 Y7 H' B, a+ r+ A
# z% J8 n# Y$ ?0 D. U! n& Z( S
访问table中的数据
& [: u7 w  y: \+ p8 K5 _& x2 ?
- B+ p; P! S1 I9 }8 V; y; _9 Q通过表Table.1所建立的table对象,在命令行中显示如下:. c3 ]) u- g' N( a1 H- [

- w% h7 F) _* `& K5 e$ p/ ~. ?: n% nasdaq table在命令行中的显示9 s1 [0 E! O  G' j8 f
nasdaq =
3 ?* G+ H' v, }& b# I  q" T2 A    Symbol             Name              MarketCap     IPOYear$ L7 s! m/ G: j
    ______    _______________________    __________    _______/ [4 a7 s  y$ g6 }9 J/ ]4 h! ?8 P
3 V4 C+ k5 |6 B6 x& l/ ]' ]# L
    'AAPL'    'Apple Inc'                '$742.63B'    1980   8 K1 c) n7 A% [, y+ K. z0 x
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   
5 V  w; s  U* F4 h# z) K    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986    0 e8 Z* j% Z& g! n7 l) ?. ~
+ G0 g; @% V4 u' w# v
我们可以通过使用dot+Variablename的语法直接访问table中的列,返回的结果是cell格式的数据:
( N$ f2 b9 P/ \) n9 M% J; F0 A' M# Q& T  U& p! {/ |
% 使用dot语法访问table中的数据: D$ T6 A& E* c5 q- o1 z* G
>> nasdaq.Symbol           % dot格式+变量名的访问方式
# K- k. w3 T, oans =
% w, ~. j) c0 x    'AAPL'
" W* _' {) ]8 `5 f5 {: l    'AMZN'& W" n/ h! ?* b
    'MSFT', ^6 o& {# q) Z1 `% F) K
>> class(nasdaq)           % 返回cell格式的数据2 m+ m7 x; k/ {  R; ^. D2 K
ans =6 r2 x/ _( b3 q3 V6 P
cell  
. G. p5 L7 ~: |5 l- s
3 Z+ f4 h% ?! Q" ?' d+ O, @; |9 M! |9 qtable类重载了subsref函数(什么是运算符的重载,参加《MATLAB面向对象编程-从入门到设计模式》12.1节),于是支持MATLAB传统的圆括号下标访问,如果要访问第一行,则:1 T! I- p- C( V

2 ]5 K! f' H  B% 使用下标语法访问table中的数据& q7 T2 _4 H- {
>> nasdaq(1,:)3 D% v6 j: X. X0 s; Q
ans =
8 e' B7 V& p6 Z/ F) J" ~    Symbol       Name        MarketCap     IPOYear
9 }2 J' x; Q  L' t    ______    ___________    __________    _______
# O4 P3 n5 X+ \; _1 t
& F$ ~# j4 j" y& Q' q. D    'AAPL'    'Apple Inc'    '$742.63B'    1980     9 ^7 g( C: S7 Y) l& l% p

( u1 `0 n2 h( S使用圆括号,返回的结果仍然是table,如果要访问第2到3行,则:3 V( S: \* D( R0 K1 @1 S

! {* _6 g" o% [" Y! P% 使用下标语法访问table中的数据
( j# w  n" @, |& g2 ~. K>> nasdaq(2:3,:)- ?: P6 o7 g' Q* F
ans = ! }8 Y& {- o: W1 \. F) m7 r
    Symbol             Name              MarketCap     IPOYear
4 g% q  B: Y# d, k$ @2 N    ______    _______________________    __________    _______
3 `7 t6 S" x9 Y- S- F
. w/ h/ c7 L. W7 u3 j5 m    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   
$ g8 u# z3 J# `! @8 ~+ i- u    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     " |, V: E6 i# w9 U, O& O
% t8 W$ l# P# l
返回的结果仍然是table。 table数据结构支持MATLAB传统的花括号下标访问,返回的结果是cell格式的数据  [8 R5 j0 N( E3 a

# o3 T/ s- z6 W  [0 ^% 花括号下标访问
* ~" M8 o3 c$ I>> nasdaq{:,1}   % 花括号下标访问,返回第一列中的数据
1 ?$ K1 D8 |: v8 G. tans =
' U3 w0 L* W9 x  @    'AAPL'/ x: s' U+ a0 N3 l6 {9 B  h* M) E
    'AMZN'5 W' w  x6 ^# L' n' L
    'MSFT'
3 t+ _7 X3 _7 u8 ~5 z! z7 Z# s$ r% `7 y# M3 E9 L# |9 d: i/ Z- D
还可以把Dot语法和下标语法结合起来获取数据,下例代码访问table第一列的第三行,返回的结果是元胞。
9 S8 V8 E( {6 S( k3 j0 s4 P" `& l4 W5 j- X0 H
% Dot语法和圆括号下标访问结合
; u" S/ d- L; f, p% X2 z5 z>> nasdaq.Symbol(3)9 E" X. J+ q5 ]7 ?3 f% E1 x8 C
ans =
8 J8 a+ N9 I9 m# B/ r$ @  e    'MSFT'( f' U' `! I; n: w% W' P3 F
>> class(ans)     % 圆括号下标访问,返回结果是元胞 ; f5 i' x9 c  k
ans =, s- {; ?2 k. J. N
cell  
0 p9 l5 g5 O& d, x) x$ Q2 k
  • 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-1 06:38 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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