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

MATLAB table数据结构(上)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 uqHZau 于 2020-11-30 13:25 编辑 . C3 ]8 Z! D7 C+ q
) I( l+ M( f4 |) H& j9 A5 z
目录:
& h3 S+ H+ b) a& C
  • table简介
  • 为什么需要table数据结构
  • 通过导入数据构造table对象
  • 调用table构造函数来构造table对象
  • 通过转换函数构造table对象
  • 访问table中的数据9 ~, E3 Z7 ]) g1 |' ^

( p0 z: ~5 B1 V' mMATLAB常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除了这些基本数据类型,MATLAB还有很多其它的数据类型不为人熟悉,这些数据类型在编程中也非常有用。MATLAB高级数据类型系列旨在向大家介绍它们:比如containers.Map, tables,enumeration和time series等等,它们为什么有用,用来解决什么问题,并且怎样在科学工程计算中怎么使用。上篇我们提到了映射表结构(containers.Map )。本篇将介绍另一中新的MATLAB数据类型--table。+ g/ [) J0 z2 G- Z; k9 O2 m* L  B
) r* b3 {, a. E% O
table简介
, @% n: Y8 ^# j& \. ^# X为什么需要table数据结构
: r2 S2 ]1 O2 G! k3 B# sMathWorks在MATLAB R2013b中引入了一种新的数据结构叫做table 。table类似统计 工具箱中的dataset ,其引入的目的就是用来取代dataset的数据类型。因为表状的数据在工程计算中越来越长久,有了table 类型,MATLAB用户就可以不用购买统计工具箱,也能使用表状的数据结构了。 table本质上来说是一种可以存放各种数据类型的容器,比如下面表Table.1中的数据,其中既有字符型,又有数值类型,其中第一行作为表头:Symbol,Name,Market,Cap,IPO, Year是各列的名字。/ s# v3 M8 a+ e  w5 J  V
' _# V8 ^0 C6 |0 ~1 y0 a  \! A
Table.1 NASDAQ股票名称表
Symbol
Name
Market Cap
IPO Year

( l- F7 y' [4 b4 I, cAAPLApple Inc$742.63B1980  T% K+ i: q" R2 {4 y% j) ^1 b
AMZNAmazon.com, Inc$173.33B1997( f9 }  m1 i; X8 t, L
MSFTMicrosoft Corporation$346.9B1986

7 q$ H" d6 s' ]' }+ Y在conatiners.Map的章节中,我们介绍了MATLAB的基本数据类型(比如数组,原胞数组和结构体)在表达某些复杂数据类型时的局限性。这里不再一一赘述,读者只需要认识到:数组的局限性在于不能用来存放数值以外的数据,而使用元胞读取和索引内容时有种种不方便,比如无法区分该数据中的表头和其余的行数据。事实上,如果数据存放在如下的CSV文件中,并且用importdata 直接读取表Table.2中的CSV文件。
7 f. L% q- n5 f4 q$ o" Y8 G
; ~6 y/ D# _: X' E- }4 \Table.2 Nasdaq 的 csv 原始数据$ g6 t, \$ r& O) `
"Symbol","Name","Market Cap","IPO Year") P$ |. p) D% U" {# V: Z( ~
"AAPL","Apple Inc","$742.63B",1980
3 l- R4 A0 b5 O* _' u# ]( ?6 |0 s"AMZN","Amazon.com Inc","$173.33B",1997
" d, m/ t4 A3 [! {"MSFT","Microsoft Corporation","$346.9B",19868 S' `! w: I& T9 R# p; ]: X. e3 z1 x
% n4 a5 Z, @4 T( k4 j% o
读入之后数据将会被分成数值和非数值部分:8 W9 i; ]# V. u, M
% 用importdata直接读入CSV文件
2 R( [' a: U1 ~8 H>> nasdaq = importdata('nasdaq.csv')& w5 `# _# ]3 V/ |
nasdaq =                          % 结果存在struct中* Z4 t& f: C! k& t
        data: [3x1 double]
0 g2 }/ X$ n$ a0 E4 Z$ Q    textdata: {4x4 cell}
5 `8 k9 O3 y! ^( \8 ]( q>> nasdaq.data                    % csv中的数值部分
4 Q5 r# B* ]& B; ~ans =
/ h. C; |* k7 }( L9 G& n        1980
& L5 S4 P! C  U2 F& x        1997
% u4 d6 B+ [# Y$ @+ o8 ~        1986  
+ Z) I2 A1 s5 W  m" k6 Z>> nasdaq.textdata                % csv中的字符部分5 L' w. [9 H2 {1 p3 V
ans = : m3 H, }% J# {8 q
    '"Symbol"'    '"Name"'                   '"Market Cap"'    '"IPO Year"'
8 i6 S0 d  V$ k! `5 m    'AAPL'        'Apple Inc'                '$742.63B'        ''         
8 ~0 A9 M' y; w8 y8 w    'AMZN'        'Amazon.com Inc'           '$173.33B'        ''         
6 @. Y% o" u) m& K    'MSFT'        'Microsoft Corporation'    '$346.9B'         ''  
- [* n+ Z% e9 J3 Z; x, S; C0 E9 D3 d1 G9 K1 F) E) [
显然这不是我们所期待的要导入格式。+ U# c% j1 P! o' E$ \* A' a

" I5 {# y' h: m0 G6 j6 A9 s通过导入数据构造table对象
, v# K1 M# y: D* R沿用表Table.2中nasdaq.csv文件,我们可以使用readtable 函数,构造一个新的table对象,把csv文件中的数据导入到该对象中。readtable函数接受文件名称作为输入,返回一个table对象。
, S$ S% d3 D0 n/ K+ M- F- v9 q3 r
% 通过readtable函数来构造table对象
% }- W9 ?3 I! b& @. s>> nasdaq = readtable('nasdaq.csv')) x6 {% F/ D7 [" F
Warning: Variable names were modified to make them valid MATLAB identifiers.
$ Y8 b6 x0 Z9 D+ I* @  k# gnasdaq =                                                               
& h) ?! |6 B3 _7 o- P: J6 M    Symbol             Name              MarketCap     IPOYear% Q  f0 \) w8 g! V
    ______    _______________________    __________    _______
- N0 B6 H: ]" n6 F- A6 z    'AAPL'    'Apple Inc'                '$742.63B'    1980   " ^9 L$ V! k4 q
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   + P5 k8 p% D. f; o9 ^. b
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986   / o$ C* e2 C# Y7 m; q

/ K3 A1 v1 j) k+ y- f注意第2行的warning,因为readtable 函数把nasdaq.csv中的第一行自动变成了这个table的表头,在创建table对象的时候,MATLAB会对做表头的文字做处理,这里把Market Cap和IPO Year两个词中的空格去掉,缩成一个词,这样做是为了方便将来使用dot语法来访问表中的数据。因为MATLAB修改了原来的表头,所以这里给出了warning。4 o  j0 I4 O+ _! D! _; e
% h: W3 N8 u/ m; {/ y: X  \- L
调用table构造函数来构造table对象. f; a. l+ S9 V4 @
我们还可以通过直接调用table类的构造函数来创建table对象 (什么是类的构造函数见参加<>第2.5节,构造函数和类的名称相同)。在containers.Map 的介绍中,我们举了电话号码簿的例子,如表Table.3所示,它是我们这节要构造的table对象的原始数据3 U3 n0 y; q7 `! O& t- s9 }
$ Q( [+ \  u- R) `) {
Table.3 电话号码簿  A0 p/ J5 \$ ^
: t# o) M4 N+ [, _
姓名
电话号码
$ }2 ?2 f1 r' @2 K7 n
Abby5086470001% ~9 r* U" z* a: t; e0 ^3 s
Bob5086470002  D+ Q5 I  Q! `3 \
Charlie5086470003
6 U( R% e& K* w3 }0 T( w" \下面程序中第1,2行用元胞数组来表示表中每一列的数据,第3行规定了表头的名称,第4行调用table的构造函数创建table对象,先输入数据,再输入表头的名称。表头通过table对象的VariableNames属性来设置。
5 ]! \5 R2 l' V5 R) K7 i- M
; \( l! ~+ ]1 Q7 Bname={'Abby';'Bob';'Charlie'};                        % 3x1列向量
3 |$ M4 p" ]$ Q9 knumber={'5086470001';'5086470002';'5086470003'};      % 3x1列向量
6 z5 k3 I8 l; ?6 j% ]" U' ycolName={'Name','Number'};; N6 k6 Y% t& _' h1 _2 Q
phonetable=table(name,number,'VariableNames',colName)    9 p- n) w% @, I" {

7 I6 t# k7 ]+ G. t; T& M命令行显示如下- E; t: z0 S) ^# y  u$ l, H
; f, \& g* {8 V2 \1 c3 E  }
% phonetable在命令行中disp的结果  . I" ?* [3 b* |# D0 _8 V5 z; O
phonetable =
! ?: O- e* q: c2 Z  a+ u  s      Name          Number   3 z8 v7 r& D6 s7 y
    _________    ____________1 ^; ^: t0 @* {3 P& {* B
1 d2 q/ I" t. y# R
    'Abby'       '5086470001'
7 K. ]) N1 w8 h, ^3 W    'Bob'        '5086470002'2 v5 q. k; y) |
    'Charlie'    '5086470003'& r7 N. T( `6 w$ ]- H
. H' e1 F6 g! |) l; i4 X
第4行把Name和Number做为table对象的VariableNames,可以这样理解VariableNames,我们可以把table看成由一个个列数据组成的数据结构,每列都是矢量,其中存放相同类型的数据。如果一个table有两列,它就有两个列矢量,每个列矢量都是table的一个变量(Variable),给变量名字就是Variable Name。! U% g2 q* @5 K: }3 P; Q) V, O0 P3 |
$ L: O+ F1 w" A& Y: u# U
通过转换函数构造table对象
' j+ b8 s/ X3 P. }  `( @' I( H除了使用table的构造函数来创建table对象,还可以使用转换函数把其它数据类型转成table,下列通过数组数据类型类构造table。下面的程序的1-2行,我们利用financial工具箱中的fetch函数,从Yahoo财经处得到雅虎从3月1日到3月10日的股票价格,fetch函数将返回一个数组,第3行我们利用array2table转换函数把得到数组转成table。
! ]( P7 z* o8 G9 i: X2 o
) x3 Q! Y( C$ }; ~* I, P% 通过array2table创建table对象  ( S8 T3 A5 b# R: P7 n: ]1 C" T' G
conn = yahoo;; o( ]' d, P, B* K& x3 H6 G$ \
array = fetch(conn,'YHOO','3/1/2015','3/10/2015');
( U  |5 {& }$ Y4 `5 v2 Lyhoo = array2table(array,...
$ z& @* H( j; R0 \" J: f% e! a" u* N  'VariableNames', {'date','open','high','low','closing','volumn','adjusted'})/ O) J7 a* z, C% L" _2 ^

  c# T- V: i3 Y6 ]% p( o# @; S第4行中,我们通过VariableName来指定表头的内容,结果显示如下
5 E7 q% K2 C+ V
4 `5 R, s  \7 J/ T+ k% yhoo的table在命令行的显示
2 ?7 J* F4 T! t, oyhoo =
) g" }  I( T0 Z' K" a     date       open     high      low     closing      volumn      adjusted; D3 r2 y9 y% P: A2 C8 L
  __________    _____    _____    _____    _______    __________    ________
4 a7 b7 [; |/ _% I   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
( H/ S) ]( e# F; [6 A3 I, J) c+ z1 j   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   3 u$ Z. Q  N! |- g
   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   
) f+ d. x0 Z) B1 n! B, }# n   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
' ?, b/ c& y: k' V( a( s; f* s3 Q% O$ I   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   8 H! U4 v& P' c. p+ f9 x, t
   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   5 n! N7 G/ S0 o" f" B# y0 C: a
   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
- I9 b8 S: @) f& \1 \' Y" T3 O9 z7 c. A& K: B; [% L
访问table中的数据
1 d  |2 Q7 K8 ~/ @. ]' X
; j/ T- i. x- B通过表Table.1所建立的table对象,在命令行中显示如下:
0 o' }2 I$ b0 H/ }$ \2 D) N+ ?! ^% Q  a" \+ V7 z
% nasdaq table在命令行中的显示
; I7 c" @7 J4 k6 ynasdaq = + w5 l: b7 y% {7 C. {1 v$ B  V4 L
    Symbol             Name              MarketCap     IPOYear' p) E" J7 o' f+ V& Z4 {0 |* K& R
    ______    _______________________    __________    _______3 R( m4 R' @7 n0 m9 B. t

, j. P: ~7 M- R    'AAPL'    'Apple Inc'                '$742.63B'    1980   / K# k4 n" K* ?4 G* {0 [0 S$ l9 G
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997     A- t7 w/ R: f' P: S3 a+ \
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986   
! ^8 d* B" w' x2 @
6 H& h  F) X0 ~. W0 O( h我们可以通过使用dot+Variablename的语法直接访问table中的列,返回的结果是cell格式的数据:
/ W# ~7 w8 d6 x4 E8 v7 i* b. o4 F
: ]2 f. w' K" `. \! O& t% 使用dot语法访问table中的数据0 B8 R! W+ f) T# Y3 {; T9 `6 d4 g; r
>> nasdaq.Symbol           % dot格式+变量名的访问方式* ]' g7 u" k, ?; o0 K
ans =
; ?# e/ d! t* B: I1 S1 s. f    'AAPL') ]6 k- r- A+ u
    'AMZN'
: ]6 G8 T6 Q5 \% |* o8 y8 q9 _6 _    'MSFT'
6 J- p3 m- D. Z>> class(nasdaq)           % 返回cell格式的数据
: h- h; o  h( U- H% Qans =: g1 x( |4 Q) |8 f. r
cell  ) Q5 f2 ?+ {  q; G$ p
* g2 `" r8 Q. ^2 L# l% A2 q
table类重载了subsref函数(什么是运算符的重载,参加《MATLAB面向对象编程-从入门到设计模式》12.1节),于是支持MATLAB传统的圆括号下标访问,如果要访问第一行,则:
0 @. w: s5 L, A$ ~9 H; q; m( z" Y. h; j+ n: ]( t' u: {- ]6 E
% 使用下标语法访问table中的数据
1 N3 [. X9 \  ~) R. V+ z! \" e>> nasdaq(1,:)# D; K/ {) t  X0 S
ans = , b) ?' r8 D7 W/ n# `. F0 n+ m" q
    Symbol       Name        MarketCap     IPOYear
1 R! o. m. N0 Q5 \, V' {    ______    ___________    __________    _______) P/ E' E' }! Q$ N* ^

% R: M0 [5 O9 _0 e  i    'AAPL'    'Apple Inc'    '$742.63B'    1980     
" n) Y, R( z3 B; r& j4 P8 w5 E% P* u' H
使用圆括号,返回的结果仍然是table,如果要访问第2到3行,则:
/ V! G, L+ S/ v+ V! q% j) x  R: ^: i3 A8 C, v# W
% 使用下标语法访问table中的数据! U$ ^+ v  B1 N0 j0 m) w' L; O
>> nasdaq(2:3,:)
5 k9 D1 [3 t2 d2 N8 p  oans =
* [3 |( v' Y- y5 R* V    Symbol             Name              MarketCap     IPOYear4 v  a8 F5 x2 Z$ P
    ______    _______________________    __________    _______
8 V' L1 e* a/ o% |) n( _* b; Z. c: @1 I" w/ Q' X
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   # c9 @) t& @- a. }1 W  z3 i
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     
. D' Z+ S2 E4 v7 ]  u/ i7 j5 {+ H* z# u
返回的结果仍然是table。 table数据结构支持MATLAB传统的花括号下标访问,返回的结果是cell格式的数据* i* {/ P. C/ s% \4 G
$ D, A. X  j) {) v' N5 s0 e
% 花括号下标访问6 n+ ?5 C6 Z/ e8 m
>> nasdaq{:,1}   % 花括号下标访问,返回第一列中的数据
! M. k$ \" D- F0 Wans =
5 S6 n" K) X. ^# N% [3 R    'AAPL'
; U  W2 x; ?3 h3 D6 a    'AMZN'1 U8 B2 K% J# ~1 [9 ?* ^
    'MSFT' 5 r6 W- w/ o! G! i4 `# n
; d- [+ e1 l- Z2 a7 K
还可以把Dot语法和下标语法结合起来获取数据,下例代码访问table第一列的第三行,返回的结果是元胞。
8 f" J7 N1 B7 q7 u* C
/ ?) Z$ I, g1 w' s+ A% Dot语法和圆括号下标访问结合
- ~& r9 I" Z, Y) o5 l0 M. O>> nasdaq.Symbol(3)8 z5 _& t: \5 G. P8 s. C
ans = * q7 T) \2 c5 U+ I" L' ?1 o9 R  v/ E6 ?( [
    'MSFT'
, r0 g. I. C+ p0 C% `! q% U>> class(ans)     % 圆括号下标访问,返回结果是元胞
" Z9 J( A0 E, Z, f& P# Z4 Wans =: }* b$ Y. ?/ d/ y6 W+ M& e
cell  
, U! M, T  J9 {: s2 g
  • 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-7-31 08:23 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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