EDA365电子论坛网

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

作者: uqHZau    时间: 2020-12-8 15:29
标题: MATLAB table数据结构(中)
6 S7 x3 T! J' S1 Y4 N9 L% H
目录:
, U- q/ {2 [  i8 e& w  H1 l  n( z' g, Q/ J0 u4 ~' K/ N
table的操作6 K0 y9 n. r3 x) t' r8 z
删除行列
1 o8 L& l0 m( O% i$ t+ Q8 _4 z添加行列3 z! U7 ?  y- `: o) r2 ?
合并table$ V9 J0 X5 v) [+ l
操作列数据8 K; g$ v1 x+ U) O: p  w/ e; t
排序0 \7 ^4 _8 h) {) G! A6 J9 J
筛选和查找& z4 B; ^! f/ B
输出到文件' h' o2 E% w- ~4 a
其它数据类型之间和table相互转换8 b! s  N; V7 m$ Q, L8 W0 y
table的操作
' w0 t. t$ s' G: \  W' e删除行列
+ I7 |0 \1 q4 l删除一个table中的某行只需要对该行置空即可:
$ a6 j+ f* n6 d" Z% 删除行
$ h/ _7 s' v/ J1 m0 v8 H>> nasdaq(3,:) =[]
. [5 q6 H1 L2 w3 p" wnasdaq = 8 i& u, O# Y8 K1 B
    Symbol          Name          MarketCap     IPOYear
/ p: v9 n0 b6 L+ v2 x    ______    ________________    __________    _______2 H  i( E2 a* C; h

% ^7 t" R& u! v    'AAPL'    'Apple Inc'         '$742.63B'    1980   ( w$ K9 @: a) ~* U* D6 T5 A
    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     9 a: `# c; ]) V8 g
以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。
( y# T1 E1 S3 }3 _" Y: {, s% 删除列
2 ^! j* D5 a7 @# W>> nasdaq(:,2) =[]
8 X; C/ A  ]  ?: Z; U+ g2 lnasdaq =
+ [8 k/ h9 Y4 Q( C    Symbol    MarketCap     IPOYear) ]) e  u, C+ g
    ______    __________    _______% u6 ^7 ]) O. ^! s! J0 j/ r
, {3 A5 h* a# x* Y- J( [/ {% T6 g
    'AAPL'    '$742.63B'    1980   7 Z  _# F+ Z2 s' v
    'AMZN'    '$173.33B'    1997       S: |1 `1 C4 m! t/ j! M
删除列还可以通过Dot的语法,只需对表的VariableName置空即可2 x" `1 \( r8 \0 ?- O$ _
% 删除行* \" T6 l, Z" j/ [4 ~; s  I
>> nasdaq.IPOYear=[]( b$ q" {6 J/ r' t) S# d
nasdaq = 2 i( e2 Z+ u. ]$ g8 W0 z3 J' K
    Symbol    MarketCap ( x) V' Q5 H: Z. F) Y
    ______    __________. F; S2 p! J( ^+ D

4 _: G$ E& z. }+ x- ?4 S0 t% r    'AAPL'    '$742.63B'8 p: t5 e) S$ u! R! S
    'AMZN'    '$173.33B'  
) d* a  Q* F7 M4 D2 @7 y& b$ ?添加行列; F* ~& K  J! E) V2 M3 x
沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成
: J9 V. u0 N) k% 添加列
/ Q7 j. C' H( f+ }nasdaq.Sector={'Computer Manufacturing';...: C, o4 X$ p$ ^. U
                'Consumer Services';...! K/ ]4 N" f. c- Z3 P4 ~
                'Computer Software'}  7 z: t9 B+ {4 \% r& D8 [0 y
注意,这里等式的右边是一个列向量元胞,结果显示如下:3 k4 G3 u5 p* w0 w) v: O( X2 m
%  table新增了Sector列' d. F/ n5 v- M+ ?9 l( Z
Symbol            Name             MarketCap     IPOYear             Sector         9 b2 r: j9 g' L1 X% Z4 F% M
______   _______________________   __________    _______    ________________________
. J9 Q9 y% C# R$ R+ p 'AAPL'   'Apple Inc'               '$742.63B'    1980       'Computer Manufacturing'
8 {! M; H3 [) L1 U. k* [2 w 'AMZN'   'Amazon.com Inc'          '$173.33B'    1997       'Consumer Services'     % t0 O3 ?& A# }0 |7 V' B6 K
'MSFT'   'Microsoft Corporation'   '$346.9B'     1986       'Computer Software'; G6 v. A" c% K
  / I( T1 b6 B7 a4 C7 k7 _
前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:
  A3 b! d) W- d9 Q0 n3 f& @% 给table添加行
* `' g7 D1 N: a4 OnewCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'}    : d9 A2 C; K6 I3 l5 q- m
newTable = cell2table(newCell)
. f! T5 r  S! H+ `9 X+ R: Z2 mnewTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};, a. `8 O4 h( u, R/ B# s) P! M
newNasdaq =[nasdaq;newTable]  
4 S2 z" \. ?" N其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。
) Z# {6 d/ B. A+ q$ w! F) j合并table2 o( G2 D- A- k1 G0 }( y3 F9 u
合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:
& j- S$ s, q( R4 [Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:2 W5 R! B4 w' e5 ]7 t5 x7 p
t1 = * g1 m5 `* T. j6 t
      Name          Number   
! g4 }7 P& r+ d6 h/ N$ W    _________    ____________
3 H( g/ L3 q7 x* k1 ?
: ^' v2 ^% e5 B4 s- f, @) N    'Abby'       '5086470001'2 |8 m5 v5 l: G) {( n0 O5 t
    'Bob'        '5086470002'/ D, q$ s6 Y7 j0 Z4 N+ j
    'Charlie'    '5086470003'  ! |! u6 m: N( w4 n
t2 =
9 r! u8 s- \; C5 f) Y3 a7 J: b     Name         Number   
$ w: V. W: [! F; S, ^, D( s    _______    ____________0 v# W) `, ?  r! J
6 P, _+ k3 C$ t4 J& p, r, g
    'Dave'     '5086470004'
2 r# T9 A& H: G( |    'Eric'     '5086470005'6 w- S$ X' D, R$ L, E
    'Frank'    '5086470006'
) g0 S7 ]4 t" \; G( F横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:
) G3 E( p! Z3 b. l2 |% 直接串接table
1 q  E' {0 K' c>> new_t =[t1  ; t2] 5 z# s/ m' m/ ^) s- P6 j" }
new_t =
0 e+ K1 m* w- |      Name          Number   9 c2 Q6 N8 U5 k# C: W1 Z
    _________    ____________
/ T# Z, {; B# q6 N  F/ H+ O/ S0 ?9 `; T0 F3 a
    'Abby'       '5086470001'0 r& l% }% N% k" y
    'Bob'        '5086470002'6 M3 {& l: E, j0 \5 B8 C
    'Charlie'    '5086470003'
$ v% Y( s* \* d) @/ l+ J1 H4 b  o, i    'Dave'       '5086470004'
/ G9 g7 Y+ |( Q) ?# d; a    'Eric'       '5086470005'
% a* X; L  B0 n    'Frank'      '5086470006'1 }) u  m5 z+ b- P- k$ c
% 使用vertcat( T0 [  }6 T% Q8 w+ T
>> new_t = vertcat(t1,t2)9 ]; q, @! H$ U' [. n- X& K
new_t = : r4 h" M- H1 ]* d% [7 h9 m
      Name          Number   % q7 _" G- M6 t4 {3 F3 \
    _________    ____________
- i( B! L  \" @! M- c+ E4 g" C3 G" q
    'Abby'       '5086470001'
" {, D) a: |6 T' o$ Z9 H    'Bob'        '5086470002'2 s' h- B6 V# t- b1 U' e$ j+ \
    'Charlie'    '5086470003'
  X! N( Z) P" k7 c' p. ]8 e    'Dave'       '5086470004'
' A; L* a% J  y8 O' U) g9 j    'Eric'       '5086470005'  m9 I" @5 }8 c" k& x) \
    'Frank'      '5086470006'  s! X+ h: l; i; t7 ^: o/ T
图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table6 p9 F+ l/ p8 B3 L$ ?' O
t1 =
  `1 }/ v6 O1 M( U$ a3 C      Name          Number   " T  z1 a# o/ r2 H& g% U
    _________    ____________' j9 u% J, L' G1 z

9 h; r9 \8 w7 f6 Y" M    'Abby'       '5086470001'$ D7 _7 U4 G% U: q, Z
    'Bob'        '5086470002'
! O( w/ w% ]* s; @  P; P5 }3 X    'Charlie'    '5086470003'6 L: `0 x- r# F7 E+ p( j
t3 =
  E2 k1 K+ U# R; S* P    Office    Building
8 O; K: e4 X( \1 \% J& z( V    ______    ________
' Z$ e9 p* \7 i; [# `6 C. e) i  U+ K
    '331'     'A1'   
: O% P5 o# z3 ~- ], s8 e    '201'     'A2'    4 x7 F5 |5 P0 H8 m$ |' |9 h8 \
    '328'     'A4'
* S! h- s3 ]+ s( R5 N& ]横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示( v# W# `4 I) H/ q" C' ]& x8 x
% 直接串接table; J: K5 C3 Y: g# h, S
>> new_t = [t1,t3]
5 v& i# N! c* x- R5 H+ gnew_t = ( `! U# a, w' M1 W1 S$ ~# k8 g( j9 u
      Name          Number       Office    Building
1 Q: l( ?5 A) T6 v: M    _________    ____________    ______    ________
  @6 {7 P4 @- I; W5 O/ t% W% m; R# S& Q: l. q" S" P7 J: {- ?
    'Abby'       '5086470001'    '331'     'A1'    ) g$ x$ B* _; {$ ?/ B& z
    'Bob'        '5086470002'    '201'     'A2'    * f6 E+ p* F4 o6 C8 c' E* q3 @" C# p
    'Charlie'    '5086470003'    '328'     'A4'      
" L1 j; P% p$ q* E, C或者直接调用horzcat函数,如下代码框所示:
! R7 P( h1 a) t3 n/ L. B9 }  q" Q% 使用horzcat$ z+ t8 m- Y0 v* e0 J
>> new_t = horzcat(t1,t3)
5 D/ v1 Q* O/ q# \# V$ r1 N* onew_t =
! P8 Y$ l) g% M& @4 m      Name          Number       Office    Building- V3 F2 W+ O+ k/ y# S# J, L
    _________    ____________    ______    ________
0 O8 L+ |$ p0 _* a! X, S" g6 h4 W& b6 C) R
    'Abby'       '5086470001'    '331'     'A1'   
) Y! \2 M. p' H+ E) W/ |    'Bob'        '5086470002'    '201'     'A2'   
8 T% @6 B0 H8 ~  ?0 W9 I: l    'Charlie'    '5086470003'    '328'     'A4'      
$ N& D; P6 ]" n( k& \操作列数据$ P* E; e, ^9 R( ~1 {
沿用NASDAQ表所导入的table:
1 e$ S6 ]" h. Z. N& R% nasdaq table原始数据" \% a8 X3 x* E
nasdaq =
! f& o; w( [: m! C2 w0 I  r  N) F2 q    Symbol             Name              MarketCap     IPOYear
( d( K$ v) h+ d- S    ______    _______________________    __________    _______- d0 `! V5 _! q" @

. P. S6 O) B* |/ G% X& ^! ?8 W  ~" E    'AAPL'    'Apple Inc'                '$742.63B'    1980   9 z9 B1 G/ p) |. f
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   3 Q, z; s9 T! Z/ O' b
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     " Y0 w$ L4 q6 {3 O/ e3 v4 N  J' P
其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B
7 z9 a8 m4 q- Z& q7 q% helper函数
- }+ t  z4 ^% ]' R( Yfunction out_num = marketcap_helper(in_string)
, f! G) L3 f; F2 k+ W. q  out_num = str2num(in_string(2:end-1));. X. v: O4 Z  m& v9 U
end  4 u1 ~4 I4 N5 |) ~
然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:1 {  q9 |" X" T$ k( x
% 调用cellfun对table列数据进行操作
: s. k6 Y- M" S>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap)( e: k( |- w) V4 V3 v. x1 A; O# J4 _9 w3 B
nasdaq = 1 w) W. [- J+ J. t( {- t+ w

3 p, q+ `6 x* O; k; c" m" G, r    Symbol             Name              MarketCap    IPOYear" w. e) M3 ^: u1 i) e* V
    ______    _______________________    _________    _______, B( e6 k) B$ K* r* Z
, K$ I% O8 P' v# F1 }" u, s8 D
    'AAPL'    'Apple Inc'                742.63       1980   
2 V. f$ O! ^/ g; G& }3 r. k* {0 h    'AMZN'    'Amazon.com Inc'           173.33       1997   
& H! X% g- x' W& M5 I. E    'MSFT'    'Microsoft Corporation'     346.9       1986     & Q% Q, c" Z) ~2 F9 R
table类还提供了varfun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:4 q, E7 `3 }$ R
% yhoo的table在命令行的显示$ I7 y+ h9 k% q1 L1 A5 e
yhoo =
5 u. Y1 l/ P# \$ H. g     date       open     high      low     closing      volumn      adjusted5 C# }! j- ~# T9 r4 U/ }# e
  __________    _____    _____    _____    _______    __________    ________- K/ r" P( Z; h0 z) N
   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
  v  e7 g) f% l: E   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   
9 r+ f9 W5 A7 `! k9 Z   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   1 m! a% V/ L" A9 w# O
   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   ' Y! `% F) W* r+ ~% y
   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   2 t- J+ A5 a9 X
   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   9 _, X' c+ ^" E4 y$ ?' `  k  Q/ q
   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
" {4 h) o8 h6 z- c1 r& \. k直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入$ Q" R" V! t, ]: I7 W% X$ A7 m$ h
% varfun对表中的列数据进行操作  Y; @" o3 d- f# z+ s1 k7 u
>> varfun(@mean,yhoo(:,3))
+ \; q9 G; K0 |# k" Mans =
  e1 m6 s; E: L% j+ q0 o' c    mean_high
+ g$ A& y+ J, z    _________
  w1 u6 L4 W% B5 l6 U5 w2 ^- h: K
- E8 {4 q/ B4 h$ U8 u4 \* |    44.023     
0 n9 a  S) Z! L9 l0 P  M! p再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式  U' A3 d7 c3 G4 ~5 b
% 变换date列的数据格式
( a$ w8 ?) v: U>> formatOut = 'dd-mm-yy';4 @- K  ^  D$ ~& X
>> yhoo.date = datestr(yhoo.date,formatOut)  % datestr接受table输入
& f+ k" t+ O  i1 K7 Tyhoo =
" x" P$ g5 b2 ?+ h0 w8 odate      open     high      low     closing      volumn      adjusted+ o6 w* |+ S  J  b9 }
________    _____    _____    _____    _______    __________    ________
$ C. h1 z, B" Y7 P4 G# {, n, {/ f" Z' U% o8 [
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68   6 B8 r& }+ S$ c1 A( x) R6 W
09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98   % V6 |2 c) S) M0 t# a' J8 N  V6 I
06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44   
0 v' Z/ f2 O8 c7 Y) D# Y05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16   * |- |& I; t0 L1 H# E- K% E- Q& Z
04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99   4 p$ @4 ]) P- g$ S0 T( L
03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62   
! c0 m/ }6 {2 I7 p, r  n02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
  [1 i; O, B/ }3 A4 B有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去
/ A5 X( a  [: E& T* p% a- }% range列的数据来自于high low和closing列数据5 W: c0 P7 N( m$ l& c3 j- _
>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing
! f9 x3 _: w' m7 A' }yhoo = & f5 q9 ?3 C/ |
date      open     high      low     closing      volumn      adjusted   range  
8 T4 P' o$ w# p. q! O( g* o________    _____    _____    _____    _______    __________    ________  ________" m6 U- l. H+ w' n
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68     0.017338
8 n4 j/ `6 J4 u& W2 Z+ e  }09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98     0.029316
( E# E0 |, c% Q- [06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44     0.019337# C( S# c# M" ?8 W
05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16     0.018342
1 G. E; \/ D: @# C+ l04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99     0.054785
/ T9 t9 n# p5 J+ F3 w6 ~+ }03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62     0.035899( `/ S6 `/ h3 a/ q' x
02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11      0.01655  6 m0 I) X" L, G1 c
排序
7 f+ I: C9 Y8 k( j$ h% k沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical
+ H  p$ z9 ~: W& M% 调用cellfun对table列数据进行操作3 Y7 l! L* Z6 m7 L# h; s0 ]
nasdaq = ; l9 z7 P& r- N. u) U1 ^8 O
    Symbol             Name              MarketCap    IPOYear
- l- |$ ?- L% [' r6 v. q9 T: @$ J    ______    _______________________    _________    _______) G! B; Q4 W: f' a
+ Y% ?% Z/ F2 |! K: a" q
    'AAPL'    'Apple Inc'                742.63       1980   
3 u- R0 {! a# E4 o( r7 h; f    'AMZN'    'Amazon.com Inc'           173.33       1997   : }6 U  W/ x- R+ p' s
    'MSFT'    'Microsoft Corporation'     346.9       1986     
1 ^/ B8 ~, n( M; O现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下
8 P2 |2 j. v; r5 T- j7 i5 [% 根据MarketCap列数据进行排序
* d) O: G4 U- Z' c1 N5 y5 ]>> sorted = sortrows(nasdaq,'MarketCap','descend')
4 |0 o# _7 B9 y# V8 zsorted  = 3 E, c- K0 m7 y' v# e
    Symbol             Name              MarketCap    IPOYear
/ S( _. r+ u& H. p; n9 t( Z    ______    _______________________    _________    _______
& S9 }0 J6 y# @& R4 X) f
+ d+ i0 ^) P8 g8 _' P* N$ ]    'AAPL'    'Apple Inc'                742.63       1980   
) ~5 o& G( E% Q- V( U    'MSFT'    'Microsoft Corporation'     346.9       1986   ' S1 F) V3 ~* i) H$ E
    'AMZN'    'Amazon.com Inc'           173.33       1997     
# ]8 v4 Q( E2 X筛选和查找- Y; V) V3 [; c. @+ X
table的下标也接受logical index, 下例选出所有股票中市值大于200B的股票% l" u) A6 G3 C, l% ^
% 筛选
% W2 j2 e$ H/ w8 F>> nasdaq(nasdaq.MarketCap>200,:)9 W0 t/ y! N! i" K( D8 [( h
ans =
: i- A4 P/ k+ K+ o    Symbol             Name              MarketCap    IPOYear
5 S' f! k# W% y+ Q& d8 k, Z2 [    ______    _______________________    _________    _______: d$ d6 s/ H) I
5 I6 G' S. R7 y: G7 H0 X5 H) z
    'AAPL'    'Apple Inc'                742.63       1980   1 Q- a4 M+ [( J; y6 @2 A% T
    'MSFT'    'Microsoft Corporation'     346.9       1986     
9 p# G; V0 T' i+ t- F/ M如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票
; y5 l5 S! e' e% 筛选
6 [9 Z% `+ `+ K- v! }3 i4 B2 Q& P>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:)
. z) M& \+ B8 i2 A6 M( n( nans =
* M/ x$ R" q6 c* ?# ^! M    Symbol             Name              MarketCap    IPOYear
) v4 ^4 H* `" d2 T2 _# @    ______    _______________________    _________    _______; Y! V4 z& Q6 X1 |0 a3 R" E: c

; j8 i. i' i: _3 \2 R    'MSFT'    'Microsoft Corporation'    346.9        1986     5 g% O4 G2 g3 D
logical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据
$ p' o( y% R3 d7 `/ H% 查找
( q! h8 r# h7 d  A, L7 R>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:)
4 k7 T8 s! r  ~ans = 7 P; e/ V  W; u; N9 _" t
    Symbol          Name          MarketCap     IPOYear
0 H/ [4 {9 i1 Z$ s: E* g- A# B    ______    ________________    __________    _______
6 u* J, h) Z1 z$ Y5 n* {* w    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     
* H  ]; K& S+ T" [% B- @输出到文件+ k4 E, a( y# R8 X
和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable% B% ?: h, A. k5 R
% writetable1 ^  N6 E& @- i! V
>> nasdaq = readtable('nasdaq.csv')
5 B6 e  {$ p: g>> wrietable(nasdaq,'mydata.csv')   1 p) V9 O- N4 C" [8 K
writetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号& F. m& X" }, e, V0 c
% 指定分隔符
& [& B! U% q& S' B) ]writetable(T,'mydata.txt','Delimiter',' ')
1 h" D1 m- }" ~3 i3 i( o- Y结果如下
- }1 R) H% Q5 q$ ?9 Y  Y% mydata.txt1 w: c8 A6 h- i. {/ I" u% s9 D
Symbol Name MarketCap IPOYear0 b; R+ j% u( L# `3 o* u" P- z5 Z, S
AAPL Apple Inc $742.63B 1980
% X+ t2 h1 ]3 f( J2 o9 E1 j2 n; D; CAMZN Amazon.com Inc $173.33B 1997
  b8 o" L, E% j3 MMSFT Microsoft Corporation $346.9B 1986  
) {9 `. w% l! O# n  N! `其它数据类型之间和table相互转换
4 C/ A: H) Z) a$ I( aMATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:
! ]0 U" }8 Q9 HFigure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:
8 G. z& w* k0 f3 j1 }" Q; w1 }Table.1 美元人民币换算表8 C% x  Q6 @3 m. X. n  x
. U7 I0 ]. l2 R$ I
USD        CNY) ]- W  Z& W) w& S5 j! h
1        6.21% I' R; p. C7 E! @1 g
5        31.031 Y6 P8 J5 X) t
10        62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置
3 l; H) _# r# T. u) q. [: _9 |% array2table
' ~# D9 l5 @. K# b>> a = [1  6.21;5 31.03 ;10 62.06 ]
$ X2 o+ z# w9 i. ha =
2 H7 j9 b' ^" [( H' y4 z) @6 }. |    1.0000    6.2100) Y* e1 E) B$ V& G8 Q; `
    5.0000   31.0300
: l  K+ c: s2 x* b0 F, }   10.0000   62.0600
( o( ]* L7 P) J9 x>> t = array2table(a,'VariableNames',{'USD' 'CNY'})   % 通过VariableNames提供表头信息
9 R- h) v# a/ L( U  pt =
1 e; R; [! a" \$ S4 I0 ~    USD     CNY
: s6 L. B) f' y1 ]1 T    ___    _____
7 b) |8 T0 O) k     1      6.21" z9 G# l) Q4 ?0 G* q
     5     31.03# W  C$ ~* R: k) S1 |( m5 T( w( x
    10     62.06   
" p4 q/ Y. ^+ I7 u8 y  ; B, o" M7 y9 e
如果把table再转成array,表头的信息将会被剥去8 ^+ `+ c3 J) h( c+ g+ o9 d
% table2array
2 b6 M5 B6 j' P>> ap = table2array(t)4 {" y/ v9 z; ~, f9 m  }  Z
ap =
3 H" K7 ]0 E0 V$ s2 r4 a    1.0000    6.2100
/ i/ u2 Y; j' ?* O8 s* \# D    5.0000   31.03000 r/ J# s$ N( E1 j. H( O
   10.0000   62.0600  . F3 c& g' y0 E2 V0 t
操作如图Figure.4所示:
6 x9 Y. G9 M; j$ Y5 o5 mFigure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。
: v- h' ^- U* ^) e& x0 z. x0 v( t% \, l, J% struct2table* S- f& J5 S) B8 j$ F: Y
>> s.USD = [1 ; 5 ;10];) d) f1 \3 g# H, B% c& G' Y4 S
>> s.CNY = [6.21 ;31.03; 62.06];
4 r# F5 n( |0 P& L>> t = struct2table(s)      % 输入s是标量
/ d# H4 B9 y( T4 e* at =
' y, {6 Q6 T; H    USD     CNY ' h+ z( J  ~" N+ j/ y
    ___    _____
4 }: O2 T- J! \6 l1 k  I     1      6.21
! Z% A, L, R9 U2 v$ X: h2 h     5     31.03
9 r* J$ W5 B) Q/ {. B; V    10     62.06      
. ?- U1 [1 k0 G& G, v, N, y, m2 ~    0 O& @$ h: D& Y; ?
struct2table还接受struct是非标量的输入6 y6 }/ B/ a0 O  X* \3 |
% struct2table 矢量
; [/ {7 C0 X( x3 ~- x! o; \* vs(1).USD = 1;
) N2 q4 W, ]3 O- r' }, g& ~s(1).CNY = 6.21;( e: {% O2 n' D+ p+ |( ~
s(2).USD = 5;
4 D5 L# P$ N2 l$ I4 Ks(2).CNY = 31.03;: y/ Y# }. o+ P! F: V
s(3).USD = 10 ;" K3 L7 W+ D# P$ f, y
s(3).CNY = 62.06, V1 W" Q3 b  z6 P" R8 Z
0 `/ h: Z' d  B

' f( a9 a) W. I0 H% 输入s是矢量
/ a5 S: A2 v( I8 o4 Gt = struct2table(s)/ P# r# o7 D5 l" N; q  |
5 ?, k6 N; x. G4 G" v4 |3 \
4 t( |7 E/ y  I
s = 3 N: x0 L# X( d, i. Q
1x3 struct array with fields:. {+ @, U; P% j7 K# H/ P
    USD% ^0 g. Z4 y3 e4 j( b0 W; C
    CNY
. `2 u0 F1 y4 _, i; V' y: O' T! e/ \t =
: Q. d, E! A& L1 F: O    USD     CNY ! o4 H- \  t# Y9 w, V
    ___    _____
' V$ Q; ]3 N  A2 j4 d" g/ T     1      6.21( n  x2 a. R$ j2 A6 T% D+ \7 z
     5     31.03" |) L- M  Q, ?& m4 j
    10     62.06
6 o8 Y1 O% B5 c$ g# o把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。" Z- N4 n. }# P! D# D
% table2struct! D( i& _5 Q9 u
>> sp = table2struct(t)  % non-scalar struct / I. j1 _2 B) n
sp =
1 b. V( I4 L5 v" q: Q3x1 struct array with fields:
2 d7 K$ O6 D9 c! m    USD
' H" [: D% _; v2 r7 V' p: N! q  j    CNY  ( x  k' k  S. j3 m* t/ r% v2 |
操作如图Figure.5所示:
% m* t! T+ s7 H5 U- dFigure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。
- @& R0 O- v6 e9 |. QTable.3 电话号码簿+ ?3 C; l5 M. D% q& H6 Y' f1 \
7 {( D& {5 \& _4 G9 V
姓名        电话号码
" |7 q. Z! H1 s1 |% {' ]: RAbby        5086470001
. K* S& X) ~/ g& A6 X+ mBob        50864700026 Q& c0 G3 K( T7 H3 i
Charlie        5086470003- s$ ~$ D" E4 S* y7 V; h: ?
c = {'Abby', '508647001';...
- ]/ K# u) E) w# T$ Q7 }     'Bob','5086470002';...
: [( L- y" L( u. _7 ~     'Charlie','5086470003'};9 E( }+ C8 x! a, O7 }
t = cell2table(c,...3 u, h; J! O6 Z3 q  q
'VariableNames',{'Name','Number'})" O: m! V! M  M; x" F; z! F/ f

; r4 j  g' o' F) C$ o! e2 f
( O% |( o+ `! U% u' tt =
- C4 ], v6 @) @. v      Name          Number   7 `0 W) |8 i3 T/ |8 h3 ?% }& H' ?
    _________    ____________
! @' r0 F- \/ J+ h) Q3 L# Z, U    'Abby'       '508647001'
/ J" I9 w! ^0 {1 N1 P    'Bob'        '5086470002'
' x# w4 d5 {5 p    'Charlie'    '5086470003'4 ?& ~2 s; g- s) |( ]5 s+ _) ?
把table转成cell,table的表头将自动被剥去0 n$ B* h; |1 _7 z, }8 L
% table2cell
$ R# W, \9 d7 {" W6 x3 R>> c = table2cell(t)
. @1 O! Q* y6 e$ E" N( I" n8 m: @c =
  f) \. t- J! s* C# d    'Abby'       '508647001' 4 D$ G8 K- a+ A+ }6 v4 @' d
    'Bob'        '5086470002'
) t, `9 M6 _1 T    'Charlie'    '5086470003'
作者: CCxiaom    时间: 2020-12-8 16:19
MATLAB table数据结构(中)




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