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

MATLAB table数据结构(中)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
- M$ |/ B9 l+ f' U( i5 G$ Z
目录:
& g3 d: |, O! Z9 @5 E
7 Z% l3 Y' N% _/ n% ftable的操作
1 X+ n; s! w3 M; g/ ?0 z删除行列" k8 q0 Z; P$ F- ^
添加行列* Z2 X( U, K9 s1 C! g% z
合并table
/ K; j1 |, O6 G, K+ f  k操作列数据
" a0 G) \- l9 E" I! F( }) n排序% `( y6 @8 Q6 _
筛选和查找
/ q! R+ ^  j0 \8 D" Q3 }" U输出到文件! y8 d& B/ O# C$ b
其它数据类型之间和table相互转换
2 B. @6 ]) G- s" u  S0 gtable的操作) _( _; z" q) G; S3 d
删除行列
7 M$ W# J& x- u  t; l5 l3 T+ z7 f' G删除一个table中的某行只需要对该行置空即可:+ K, x% F4 S7 W1 [4 ?! k9 ]
% 删除行; E4 h( S3 _8 U; ]3 ]; y- L. Y) U
>> nasdaq(3,:) =[]
# Q6 P0 l2 h+ \9 X5 }% A) dnasdaq = 1 D. t" u% L6 q9 s: k: d9 `
    Symbol          Name          MarketCap     IPOYear
' T) V; G1 t5 x( {- ~* k: Z- v; Z    ______    ________________    __________    _______8 E4 m  S2 T" G5 j8 T1 |2 P* m; S; Y
. m! P$ e, \* f6 M, M
    'AAPL'    'Apple Inc'         '$742.63B'    1980   ) [; D  a5 v- W7 ~" N9 H
    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     
; J/ m9 m" ]9 s( f4 ~* d( U以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。6 h; z( H) z8 p% I7 y+ d0 N
% 删除列
& {6 E9 I* o7 u>> nasdaq(:,2) =[]; f/ i8 Y; k" o! S
nasdaq =
, D! b* N0 `- p. c6 W0 i$ F; j% n    Symbol    MarketCap     IPOYear
# x0 k( ^% F9 i/ M  C/ }9 N    ______    __________    _______
# h5 H9 D6 ~0 W  g- l
& g3 h! c3 d: D1 h! H$ O    'AAPL'    '$742.63B'    1980   - b  t  [+ {& y
    'AMZN'    '$173.33B'    1997     % w$ N2 u5 Q* B6 T( q
删除列还可以通过Dot的语法,只需对表的VariableName置空即可
3 ?4 H/ e3 r, m9 D8 T6 [2 T% 删除行
/ z" e/ e- J; p& M% t0 P7 L" a7 |>> nasdaq.IPOYear=[]
( t3 \+ |% S! x( j& qnasdaq = # \- [1 [8 y3 O3 `
    Symbol    MarketCap
1 R# ~2 L9 W; r- Z. @8 t    ______    __________, f5 e5 y3 Q8 Q  I/ i- l+ s  J

/ W" ^8 f) e. [5 E2 Z+ |    'AAPL'    '$742.63B'1 l3 ]. n4 |5 |" E
    'AMZN'    '$173.33B'  
+ v9 j8 |! j1 a添加行列
3 Q6 K: d% {8 r! z沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成
8 f0 c  H" A/ U# J% 添加列
; h' g1 O  V% r$ g2 ~( Enasdaq.Sector={'Computer Manufacturing';...
( L* T0 c6 `5 p# D3 J                'Consumer Services';...
: t* }: _; W! x# z                'Computer Software'}  0 Y! `* A( v/ F' k" m2 `7 t
注意,这里等式的右边是一个列向量元胞,结果显示如下:
7 ~3 R* ?1 @: q1 ^5 H; h%  table新增了Sector列
7 R( f" J2 X$ H! \' `4 H/ eSymbol            Name             MarketCap     IPOYear             Sector         7 A* f) }' H" b0 N; w% w! }
______   _______________________   __________    _______    ________________________( |- c) }2 o- V
'AAPL'   'Apple Inc'               '$742.63B'    1980       'Computer Manufacturing'+ Z2 k  C6 a8 B& w4 A2 ]
'AMZN'   'Amazon.com Inc'          '$173.33B'    1997       'Consumer Services'     
& I4 f! Z/ i" C) Z- ~ 'MSFT'   'Microsoft Corporation'   '$346.9B'     1986       'Computer Software'& s8 V0 I/ ^/ W
  
( |' D$ q3 ~6 W7 W' x前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:# ^& c$ s4 P8 e6 O# X4 Z! P
% 给table添加行: G, @) R& P( r+ }  a
newCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'}   
( u) e6 `; B. ~) U7 znewTable = cell2table(newCell)
+ H; u0 ]! ~* h. R7 mnewTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};: U: p$ V4 R" I+ e4 ^5 A3 Q' `
newNasdaq =[nasdaq;newTable]  ! y# W" Z$ f- c( m
其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。
, S2 G- c1 L% R+ I. p& C合并table
# x- q" o1 i, @  G合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:% g, j* _) {+ v. p- @( t: n
Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:
) ^* _( i% t1 C  Kt1 = : J2 R6 d% {2 V( ^
      Name          Number   + X$ |8 W2 }# B" J+ C
    _________    ____________( }6 b; d" w3 m  M

' M: ?1 @1 n1 E9 v. }& G- B! t    'Abby'       '5086470001'
0 }, E/ M1 M& o& t8 G    'Bob'        '5086470002'
- |, P4 q  k2 X( f9 t6 b    'Charlie'    '5086470003'  
0 r" I/ q6 f' }8 |+ v3 Ut2 = 2 o+ Y$ l8 r/ T5 V3 h& y2 _) j
     Name         Number   $ r6 i; A( Q1 D
    _______    ____________6 P) A9 |! A9 p. @: C# P6 P
  G7 }" [" F6 [# E$ q
    'Dave'     '5086470004'; X" A, O3 \! t3 M7 s5 }7 C
    'Eric'     '5086470005'
0 c9 D% U1 G2 T7 s7 K    'Frank'    '5086470006'
3 x: m$ y& a2 B! [( h- {* l4 d横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:
8 R, O2 l/ D0 a% 直接串接table: R7 D  l: x- b) q0 o2 e
>> new_t =[t1  ; t2] , K$ z; Y1 D  R! }( D$ f
new_t = 6 B0 q2 I, D) g5 i
      Name          Number   : ^" L$ V: E- y: ~  x' v  _
    _________    ____________7 ?8 W) Q& B% M5 p" y

) y% u9 T/ S2 |2 T0 ^7 e" g    'Abby'       '5086470001'
0 {2 C& v, _7 K9 T    'Bob'        '5086470002'
, \0 l0 x. g: P4 b    'Charlie'    '5086470003'/ _  N/ y7 G, S. l
    'Dave'       '5086470004'
! K0 R; e* V0 i+ ~6 E( o0 J$ |    'Eric'       '5086470005'5 j5 E0 w4 Q  y
    'Frank'      '5086470006'1 Y1 d# [2 z- \5 U0 j0 g' p
% 使用vertcat6 I) Q. `; |; H' j" j0 y0 i. [
>> new_t = vertcat(t1,t2)
: G  k! V& s0 H3 r% x. w  N+ }new_t = 4 ^0 ?1 i7 ~  R5 b7 ~) S4 `1 Y. J
      Name          Number   5 ]! x1 K' o: M2 ?' H
    _________    ____________+ j) V& o& l( r( W2 i
/ [) d% }5 i. Z$ B( p% R" `: u
    'Abby'       '5086470001'
8 A; U) Z/ t6 M% o5 h2 O: F% g    'Bob'        '5086470002'' W# }* X' u- l9 C0 q
    'Charlie'    '5086470003'
6 Q; R) Y" \! o7 W+ a9 w    'Dave'       '5086470004'0 [% a( w  f6 ~& k4 P8 s$ q
    'Eric'       '5086470005'  J" l/ j- p1 j0 u
    'Frank'      '5086470006') M, o. T& ]  ^& R" |5 e' s& D" |
图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table$ _( k3 D3 d1 X6 C' V: N# q
t1 =
* Q/ B0 |6 g$ C. P" x      Name          Number   
/ V- Z3 [! r) c/ T6 g0 j$ J' L1 O; ~    _________    ____________. [- H( C# ?/ T4 d7 q& T

; `% B" v1 D4 Y+ j# ]2 g    'Abby'       '5086470001'  N/ ~$ b$ W% v- o, L& t
    'Bob'        '5086470002'
. r/ L9 v1 _4 A& F# K    'Charlie'    '5086470003'* w) I' n1 Y, P: m9 \( S
t3 =
' p& {3 g+ p- U  a    Office    Building
( J+ n* o0 ^( l% Q% y) \    ______    ________  _! b. {9 F( k0 R# @; a# {
0 G2 l, m4 M- {& i, z
    '331'     'A1'   
2 o# X( k( ~- L    '201'     'A2'    & o  y8 P5 `5 g/ f% K
    '328'     'A4' * w. j9 L# ^2 b( e) U) i" W
横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示
% J' C2 s4 ~+ L* d% 直接串接table9 g, a/ I0 A/ P$ I5 c
>> new_t = [t1,t3]  l! v1 q% d; j0 p, j' X) ]
new_t = + d/ }( X) A7 N! L2 g  o" a9 m
      Name          Number       Office    Building/ a( j8 D" r" z' |& }
    _________    ____________    ______    ________  |- a+ f3 ^4 [4 K4 l
3 ]$ W3 Q4 ^' `0 n! K4 {+ q
    'Abby'       '5086470001'    '331'     'A1'    $ P8 g% I. {" ]2 h0 w
    'Bob'        '5086470002'    '201'     'A2'   
- \- h! ]) ?* P. t# y  t1 C    'Charlie'    '5086470003'    '328'     'A4'      
5 w+ f; B) B% G. N或者直接调用horzcat函数,如下代码框所示:% U0 c% i8 O( h7 m8 _/ e
% 使用horzcat0 K2 b( ~$ T1 k# h6 v2 D* c
>> new_t = horzcat(t1,t3): y/ |' k1 n+ y( ]; _( O
new_t =
1 u* `; L: A/ E2 G/ k% @* p5 F% o      Name          Number       Office    Building
/ i4 o! A0 D4 v" N' P+ v" [    _________    ____________    ______    ________
+ O- [' T9 U  D+ F" o# v3 X
) o7 a2 T( o0 p& R4 Z    'Abby'       '5086470001'    '331'     'A1'   
) K" M2 a+ ^) B2 b, _    'Bob'        '5086470002'    '201'     'A2'    ; [: R& h2 d8 P2 \. ^& F
    'Charlie'    '5086470003'    '328'     'A4'      
4 H9 D' C0 s+ y/ b- Z) R操作列数据
& S/ U/ K0 U+ k" H( _沿用NASDAQ表所导入的table:
- o2 V8 i, v- @% nasdaq table原始数据+ g5 c/ j! n2 k
nasdaq = 5 ]) }# J& u$ ?
    Symbol             Name              MarketCap     IPOYear
4 l0 @8 n% P- ?6 \9 a    ______    _______________________    __________    _______5 Q3 N8 |8 k& {; m* S) Z" h

: Y* z2 n! J& C: D; |    'AAPL'    'Apple Inc'                '$742.63B'    1980   ; `! T0 ^1 `0 c
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   
- I3 s5 g( `9 q* Y    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     6 d: b5 q! Y2 g4 Y+ k
其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B
. o) Z5 T- b0 \5 l1 l# p4 V- W( M% helper函数
' e8 ~3 J# y+ S! T5 Y) W  @function out_num = marketcap_helper(in_string)
5 C# g3 D. S: i. l5 F, h# [" I+ D  out_num = str2num(in_string(2:end-1));
. D8 g2 g- ]5 V' n' send  " R6 F  j  o; g( G
然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:
# y  p$ G* s+ }! t# c; s5 B4 n7 F. [+ h% 调用cellfun对table列数据进行操作' w1 d3 c, w% h0 A
>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap)! u/ ~% J* b8 t* x3 J/ @. [
nasdaq =
( p/ J7 a7 q: a+ {$ Z% k
, x8 R" T  `4 T- K9 x9 I    Symbol             Name              MarketCap    IPOYear
- K; R0 T0 H) }2 d    ______    _______________________    _________    _______8 k9 d6 I0 y1 Q/ d1 i- r& E

! ~) I3 n6 x4 e* Y! b) `    'AAPL'    'Apple Inc'                742.63       1980   
: Y1 {/ L0 E" J. w, U- u    'AMZN'    'Amazon.com Inc'           173.33       1997   
& g  Q: e6 S$ d  k; b8 O    'MSFT'    'Microsoft Corporation'     346.9       1986     
2 j8 P5 @$ X, b/ K4 @table类还提供了vaRFun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:
' S5 G4 K2 v6 m8 t. w( \9 `% yhoo的table在命令行的显示( ], U! `8 t7 m, U$ Y
yhoo =
1 R- C: V- P  k! y     date       open     high      low     closing      volumn      adjusted
) I+ F3 q6 F. h7 T. ~; J  __________    _____    _____    _____    _______    __________    ________
" J; R4 g8 n9 C+ D! R7 U" T6 O   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
6 d: l& v/ M9 ^* u! T- L) J   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   
9 i* O! P1 I  y# i; @  l) a   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   2 A; |. @. A: ^3 J( S( [
   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
- C: `: a3 H/ S/ z   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   ! A  {! P6 z1 X" x  Y# O2 f
   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   
- D! F. k6 @$ n8 ~* L   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
0 s  Q- ]4 J9 J7 ?1 N直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入
8 k0 a& ~- l: C% varfun对表中的列数据进行操作2 A! T8 T/ S) d" i) a$ I
>> varfun(@mean,yhoo(:,3))
* w" J. c3 j2 A% Q( z  T" cans =
& j, T* [0 R: Y2 Z    mean_high# p  c- y7 J4 ~- F5 c# u
    _________0 U* h' x0 z3 v7 `8 _+ g
3 _$ |: s: y7 r3 n
    44.023     
$ v5 n" M: H9 ]+ a+ y* o8 t9 h再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式
/ Q9 T1 |. P* g, m( ~5 {4 y8 \0 Y+ m4 f% 变换date列的数据格式& c& Z4 C- V2 f; a& l9 y
>> formatOut = 'dd-mm-yy';
0 F* _$ L, z0 A2 a. R- O. X4 _1 ^" L>> yhoo.date = datestr(yhoo.date,formatOut)  % datestr接受table输入
* c# M9 ?3 e/ _4 E0 a. L5 x* @yhoo = ) h6 R1 u7 u  O/ P
date      open     high      low     closing      volumn      adjusted+ e0 U; x, r" N3 w8 V: [
________    _____    _____    _____    _______    __________    ________
6 I: X& w0 D' y$ Y, a) Z0 y; Q/ Q6 Y& s% G& M% Z' f  i
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
) e; k; D0 I" k. a' o. M1 l09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98   - g& k0 U* t* F" w4 s0 Z/ j
06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44   . z6 B- @4 U7 @, @# N- |* M
05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
& V1 B2 {0 r' \# Q: R$ E3 V9 I04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99   
( ^7 {0 x; u  Z0 \03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62   
( p" Z* }4 A4 K1 f3 ?' T2 g02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
. K8 j9 A: H1 d' k  ^5 v有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去
3 x: c6 t) A" c% range列的数据来自于high low和closing列数据6 T# p1 ]7 h# {' F8 p3 H
>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing% T+ F1 |3 U' k! Z
yhoo = & E- }  A' Y2 r" F/ M
date      open     high      low     closing      volumn      adjusted   range  # i4 E. n* ]/ ^7 t
________    _____    _____    _____    _______    __________    ________  ________+ _) _2 }! ~$ l. k/ I7 a2 h& h3 f
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68     0.017338
, _  d4 |, z- p  [/ o- g09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98     0.029316
1 W3 P1 I% K5 q0 c- E1 [0 U( X4 n06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44     0.019337
3 a0 N( ~+ x; ~) P& l7 h4 X05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16     0.018342
$ Z' |% d) O1 Q, p, c, T0 L3 O04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99     0.054785
- Q# F9 U: `& s# ]) N03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62     0.035899
2 B) q& g# H- A/ ]  q' Q, f( R02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11      0.01655  7 f; k( v  X# ]: k, F* o8 y! B) {( T
排序
' @0 S9 w# ~& A0 G; m沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical6 D+ {5 H, l/ K3 U
% 调用cellfun对table列数据进行操作2 D# D& e/ Q# V& `
nasdaq =
( P1 _  D' j  b  {1 u& K- u    Symbol             Name              MarketCap    IPOYear
' k- t5 J9 G- T/ v2 w. s5 C# _    ______    _______________________    _________    _______1 l% V: b8 g7 }" P& }' `: p; Z
; x7 f5 I9 _. u3 a! J. f8 m, C  O+ @
    'AAPL'    'Apple Inc'                742.63       1980   1 X9 t* S+ t" }, u5 p, Y: r
    'AMZN'    'Amazon.com Inc'           173.33       1997   ) ]& c1 i8 G% D) ]. W+ I8 N( p& ^
    'MSFT'    'Microsoft Corporation'     346.9       1986     
7 d1 B* O$ n* d; R现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下
% f+ C6 N* |! z% y7 p) k" R% 根据MarketCap列数据进行排序
+ A7 J2 ^4 V3 k>> sorted = sortrows(nasdaq,'MarketCap','descend')& o! G2 n6 v! N$ ]1 [
sorted  =
! M# J. p" s8 a, `+ L    Symbol             Name              MarketCap    IPOYear
6 J4 U% r' g; C  f) C+ J0 h    ______    _______________________    _________    _______
# d6 ?: C- O# q3 ~/ k3 W! U
2 \/ w6 Q- d- D( a: h! N    'AAPL'    'Apple Inc'                742.63       1980   
$ S4 X# g0 d, W+ {0 \    'MSFT'    'Microsoft Corporation'     346.9       1986   
2 n' w3 J5 x6 r8 W, e: u    'AMZN'    'Amazon.com Inc'           173.33       1997     " W  g3 W2 p: |% P  k  Q7 T- k) k
筛选和查找4 E' m$ m/ n- @+ s$ V& f9 J6 h
table的下标也接受logical index, 下例选出所有股票中市值大于200B的股票2 l! d9 x% k2 W; s/ \& ^# A3 x
% 筛选3 t% K% f* V) [: V6 U
>> nasdaq(nasdaq.MarketCap>200,:)
$ @- c; ~- _. e) j& g* E, {+ ^2 ians =
" d( u2 ?, c6 w1 q    Symbol             Name              MarketCap    IPOYear
: M$ `$ ^# @/ R7 u# g) q    ______    _______________________    _________    _______- p. G4 J" C# R* |2 N1 e! x

) ~; J/ ?7 M: H    'AAPL'    'Apple Inc'                742.63       1980   4 e( o8 J# m% A4 h9 l: y6 K
    'MSFT'    'Microsoft Corporation'     346.9       1986     
% _0 u7 |) C* ?" T如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票1 r6 q" o( f! h" |$ c6 @
% 筛选
& I$ T  q2 h, m" K>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:)3 @: K) [9 }0 w8 w. n
ans =
' S! a* f4 S# v$ N/ j5 n    Symbol             Name              MarketCap    IPOYear6 k. `" q3 N- A4 ^, x/ r
    ______    _______________________    _________    _______; A1 w" X$ W; c) t
' ^" J: R% g6 e# L' b  @
    'MSFT'    'Microsoft Corporation'    346.9        1986     
& [; L% P5 O) c- G* S9 D5 Ylogical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据
7 B! ]( a9 A+ F/ v8 ~% 查找' C7 \, e+ z1 Y
>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:)
6 I# }: c6 `1 V% Kans =
$ g: e. K7 N9 Q* v7 C8 B1 l* \    Symbol          Name          MarketCap     IPOYear
; s# }: `+ ?2 d* N. K+ R( y    ______    ________________    __________    _______
3 f: ^5 H( ^/ i, ], W. k    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     
/ H/ ^$ r3 }2 l* C6 w! Q2 v4 Q' n% _输出到文件. Z4 x+ |0 _3 Q- ]' G) ?
和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable- o1 Y/ w8 G2 d9 W4 t$ N5 E
% writetable
8 v7 ]9 p+ s3 \>> nasdaq = readtable('nasdaq.csv')
) u9 Q  ]  J4 J3 ~- {& [; L9 L>> wrietable(nasdaq,'mydata.csv')   7 {  D: C% L8 j% J( a; Z* g
writetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号; P7 f) ]& u5 r# \4 @9 A
% 指定分隔符8 e; ?8 v, d. \: o1 c
writetable(T,'mydata.txt','Delimiter',' ')9 a4 N/ R" L/ t/ w6 b3 [/ f7 d
结果如下' d5 @/ G" E. U; t
% mydata.txt
$ i# e5 [. ]6 kSymbol Name MarketCap IPOYear
6 o, W  B' ?/ ?! s! Y5 bAAPL Apple Inc $742.63B 1980
5 v$ F1 b3 k5 K% ?0 NAMZN Amazon.com Inc $173.33B 1997
2 I% B# \( F) D. c) A2 dMSFT Microsoft Corporation $346.9B 1986  
8 j$ s0 C/ z* D9 M! w5 ~其它数据类型之间和table相互转换
" @# u9 d. h  S* ~/ {0 |MATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:
/ v2 ^1 ]% e: c  e+ u0 FFigure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:8 [8 a7 R$ E" K$ f
Table.1 美元人民币换算表
  H2 Y  M7 X; h0 D1 R, m5 c( F2 \' t# k& r% a: a8 L
USD        CNY
% u3 N0 M8 H* C4 @: I% r1        6.21
" f. M/ O3 b: H4 ]# }5        31.03
" a4 f4 q' J( X5 A, a$ P, z9 r10        62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置- i2 J- o% `/ ]) B
% array2table$ P! L. X3 p$ X; m
>> a = [1  6.21;5 31.03 ;10 62.06 ]5 g3 X9 X4 ~  e
a =
$ f4 R; `# k0 e0 m    1.0000    6.2100
* Y2 X3 `9 N" p6 Z* _% }, V$ @    5.0000   31.03001 H9 v. K6 r" o7 ]
   10.0000   62.0600" U: C3 N6 m! K& R) m
>> t = array2table(a,'VariableNames',{'USD' 'CNY'})   % 通过VariableNames提供表头信息+ p7 a% Q6 N  C0 B1 e2 _
t =
: u8 D+ w* i1 U# c7 c    USD     CNY + b) Q: d  J$ b. z
    ___    _____
/ W: |0 J8 `' W     1      6.21
5 f& W$ j8 C( c6 m$ |# v     5     31.03! P4 k* R$ S6 a0 i. [
    10     62.06   
( v2 s' ~3 _- I' g  
7 h7 m# m. Y3 e( U& p9 l; g+ |如果把table再转成array,表头的信息将会被剥去' P+ `8 c  a% S. V
% table2array
8 C0 u) Q) x0 h. ]2 J>> ap = table2array(t)
2 s% b, t  S* F2 s4 i2 f# lap =
& V0 o* _9 M5 h# h: H    1.0000    6.2100
/ k  L+ ?3 p4 `; G    5.0000   31.0300
- J/ H, @; r8 l! f& D6 W   10.0000   62.0600  0 o4 W8 O% E/ |1 i
操作如图Figure.4所示:% c+ k) j  q) I! r, `  `
Figure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。: I. O* ?: R; Q; g: F
% struct2table! x. s. D5 ]- E& F6 W
>> s.USD = [1 ; 5 ;10];
- r4 W4 u, }3 v2 x8 T3 N>> s.CNY = [6.21 ;31.03; 62.06];) t; a5 P- [, c) m. X
>> t = struct2table(s)      % 输入s是标量/ ^0 V7 g  v, s* N5 \/ g7 C1 v
t = ( R2 }: T8 |6 w* @8 p. P* l* Q
    USD     CNY 8 W- ^6 o# c5 R# m! C% L9 X' x
    ___    _____% k1 m$ X1 b4 Q# f
     1      6.21
6 n% o4 r2 S6 c$ q! R# l$ ?8 ?     5     31.03; I1 g% g3 U$ D
    10     62.06      
8 @$ f% B  B+ ^! w7 z    % X. i/ _& {# E' ^  H
struct2table还接受struct是非标量的输入' @0 r, [1 ]4 m0 b0 y- w+ T
% struct2table 矢量6 l; |* |' D1 c1 ~
s(1).USD = 1;
; a; w7 z* o6 ps(1).CNY = 6.21;
. l2 U( u9 q& p" Q$ A* Zs(2).USD = 5;" J: P$ }/ n- R. I+ i, W
s(2).CNY = 31.03;7 x* a6 ^. N# ^: v$ y
s(3).USD = 10 ;& o6 _, p! y2 X" y2 i. ]2 c$ P
s(3).CNY = 62.06
! `9 I6 l4 _( I; Z  G
6 a! ^+ C; L+ |' N  l2 ^- z, l& t8 b1 j/ ^: I
% 输入s是矢量1 z! U; c" ]. M) n0 m. x5 q9 o
t = struct2table(s)
. i% a$ C" F0 R0 X2 q, C$ t6 A! v' O! U% b
7 z. G! u; ]- M
s =
9 i0 s( X! \1 C" m1x3 struct array with fields:
. W( @3 a. }$ K5 l    USD0 H0 k* ?7 d: v( ~* a( \5 m- P
    CNY
+ p, {- y. n' S2 dt = 4 k' w) u& q& J" n! E
    USD     CNY 7 B6 j1 u% K2 c
    ___    _____
$ t5 F" X& {4 ]2 r0 c* p     1      6.21
# k2 A* T- Q* k6 G; ?     5     31.03: ~. b9 Z/ S' W' v, x! X
    10     62.06
# P' {6 w$ z/ N7 `3 @把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。
' ^, D) V4 Y& R0 K7 |8 c% table2struct' j/ B6 ^9 E' s" T( O7 H1 L
>> sp = table2struct(t)  % non-scalar struct
# G, z6 P% p4 osp = 9 h$ w% D) o9 G9 x% [. @2 `  e
3x1 struct array with fields:. X; @- o5 G0 ]! A* J
    USD
5 N- {: \) E3 p  a. G$ A1 g. G    CNY  ; D3 A' L0 m7 F+ p  L% t* ?
操作如图Figure.5所示:5 [. v$ N, O5 C8 x4 N
Figure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。
( z( f) x- O) }% z* g) P8 F6 GTable.3 电话号码簿
' {% |- g$ p. F6 l2 |; ?! G" [* l& r9 p4 V: P. T6 c& o4 d7 v
姓名        电话号码
7 x% C& k9 z3 b: s5 \Abby        5086470001# b/ `( a+ w' d( f3 t# R( p
Bob        5086470002& g" q( t4 \8 N$ h3 ^( {) K% p
Charlie        5086470003
/ O& m8 g# Y4 [, \8 Uc = {'Abby', '508647001';...
7 N7 Y# }% s0 G" X" X. e5 B     'Bob','5086470002';...; n! j& D  D% [3 i
     'Charlie','5086470003'};
7 q2 I  x$ u2 J; Tt = cell2table(c,...- A/ o! ]7 e6 @7 E3 I1 ~3 M
'VariableNames',{'Name','Number'})" o6 l! W' i' Y3 h: e- Z% u

7 }8 D9 O4 I. q9 E, t
5 R% X. E7 A- v2 It =
, e, h  n/ W( h4 z; S% `" Z      Name          Number   6 |, \" f# h7 }
    _________    ____________% i8 d9 J% m6 F
    'Abby'       '508647001' 6 Z& Y& X' Y: v0 l. Z, z0 p
    'Bob'        '5086470002'% a" C$ @" B/ ~8 y5 M* t0 s/ ^3 l
    'Charlie'    '5086470003'6 s  z& D  @! M4 b
把table转成cell,table的表头将自动被剥去
7 c1 g/ [# F, H& r& t: C% table2cell
; x+ w8 O! p3 X) z; S' i5 }>> c = table2cell(t)9 P3 o$ W3 ]2 C8 J$ |6 ~
c = ) Y/ [8 g! O8 }4 @1 O7 f
    'Abby'       '508647001'
* X$ o2 \- r: z: Z1 b    'Bob'        '5086470002'6 G! t7 S0 T. S( w( q% u5 s. Q0 m; ^: v
    'Charlie'    '5086470003'

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-31 10:36 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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