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

MATLAB table数据结构(中)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

! n) }) B2 A' b目录:& B( y, P1 Z0 b8 o
# }& w5 p" E; B' \
table的操作6 o) |2 S  S) z, l
删除行列
; H. p- X% U( K% ?( C  t添加行列- D  k0 I) m2 w3 `% V. a4 c
合并table+ ^5 q$ d# X' A% E) g
操作列数据5 [. I( ]$ w8 F1 j
排序
- W6 z$ [% f7 \8 I( G筛选和查找- E# P  m& b( {9 C
输出到文件" D$ Z- ?. y2 O2 h" ?& e* W
其它数据类型之间和table相互转换
% g# M# Y1 E# ^6 F* {7 i  [table的操作8 C- _& E# c2 w& E8 l& |( P  F. ]
删除行列, v0 k- |6 Y0 ~; Y/ T5 O
删除一个table中的某行只需要对该行置空即可:( c2 {9 G) h! A
% 删除行
9 ?( ~; @9 v; _$ L# P% t>> nasdaq(3,:) =[]
' H  C2 N4 }( ]8 w: K1 n8 a& Tnasdaq = 0 b: {* _; r. Y! ]4 T6 k
    Symbol          Name          MarketCap     IPOYear! \0 s$ l" y% P0 d. i3 _
    ______    ________________    __________    _______
& @! c1 Q( d. Q5 B5 ~! a; ^9 w2 Y& Y% A1 k* T( ?
    'AAPL'    'Apple Inc'         '$742.63B'    1980   
7 v- K" c% P. c( L    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     5 R4 q' J* J. K- K: s. d: Z7 O
以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。
8 W( z- N: c$ ^% 删除列
, u+ j! T3 E5 g' o>> nasdaq(:,2) =[]  G5 q* N% B6 }$ d
nasdaq = 3 M" g0 p# R! \  d1 x, r# ^1 R
    Symbol    MarketCap     IPOYear7 [. R& M- b) c1 K
    ______    __________    _______5 F6 r" f6 m4 r6 T5 q3 y9 f

/ z: N6 Y3 I$ T* D* A- M    'AAPL'    '$742.63B'    1980   ; I6 a/ I' o% E* p, M8 S$ p3 U  z
    'AMZN'    '$173.33B'    1997     ( g% v& H# _/ N& B1 S; [
删除列还可以通过Dot的语法,只需对表的VariableName置空即可
/ |. x+ e/ n# r4 ], j% 删除行+ l+ \* K; v4 k2 @. |1 c. U9 v, E
>> nasdaq.IPOYear=[]& {7 A# A( V/ x. {# c; ~, {3 O# e
nasdaq =
* m9 x! z0 F# D$ A0 U* |    Symbol    MarketCap
/ m2 \& M. S) y( |. A    ______    __________
8 P! g- Z; D  {
1 X# j  w7 ?, r: I    'AAPL'    '$742.63B'
: I) u" i$ x0 R4 d& V2 @    'AMZN'    '$173.33B'  
( w3 x$ ?) A9 X* _添加行列1 R, x" Y/ R7 C9 o9 g' r
沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成
: _8 {2 ?; ]7 u( `4 `. s. f* _. K  \  ]% 添加列( w5 ?- v4 Q) R* `! c
nasdaq.Sector={'Computer Manufacturing';...$ C4 I9 e4 w5 U6 w( A
                'Consumer Services';...) ^+ u) u6 N; j
                'Computer Software'}  2 Y+ C7 K) U. x6 l
注意,这里等式的右边是一个列向量元胞,结果显示如下:6 `5 q0 z. Z6 T
%  table新增了Sector列. d5 R! y' ~1 B8 Q5 I0 t& Q
Symbol            Name             MarketCap     IPOYear             Sector         ! ~1 W5 Z2 [/ Q1 F( s# Y9 m( m- k4 K+ F
______   _______________________   __________    _______    ________________________5 h% h1 G3 D- O. `3 q4 U, U% m
'AAPL'   'Apple Inc'               '$742.63B'    1980       'Computer Manufacturing'
$ E  i- R) p5 L) p' q% p 'AMZN'   'Amazon.com Inc'          '$173.33B'    1997       'Consumer Services'     ! F5 B; x% i) v! ^; o
'MSFT'   'Microsoft Corporation'   '$346.9B'     1986       'Computer Software'; D  Q4 C7 z/ L- X
  3 [  Y! d3 c' M5 a) M) c( {
前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:$ C" n0 k! I, r' d' _. v. m
% 给table添加行- S! N# G4 s5 y) K3 Q' z9 ?
newCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'}    & y& g) q2 y* f" @; R% i! k" L
newTable = cell2table(newCell)
1 o6 W. H% S* O  y- inewTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};6 [8 N! M9 U9 ?  K2 A
newNasdaq =[nasdaq;newTable]  " {: j, D/ [! f- F
其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。& z6 b% f* C- r; {
合并table; H2 Y0 {  _! [3 ?1 D
合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:- ?9 U* Y% Q- X) Q0 J
Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:
9 m! B7 L, [  v0 z1 A# Dt1 = : t( ~/ F& U, S4 m$ `( M' _
      Name          Number     w+ q: y4 Y) R, W0 [! i3 \
    _________    ____________
0 B+ Z8 n& o' R: j4 l7 f! j
* e: k8 ~  o. }1 N6 T. l    'Abby'       '5086470001'; G& M# S& h  ]/ k* m2 f: j* B
    'Bob'        '5086470002'
: M+ G& {" G2 ?' e    'Charlie'    '5086470003'  & a% y* X$ p- V( d+ D8 F% r' v
t2 = 1 W9 ?" s  l5 M3 l) l- L' N
     Name         Number   
0 e6 r- C4 {3 r3 n$ _9 X& X5 t" G3 a    _______    ____________
1 n9 |$ B  ]: C% G6 L1 r# b( y" i: f: p3 y) b( m
    'Dave'     '5086470004'
- |: N1 T! k  w$ X    'Eric'     '5086470005'; t. o1 T1 V# B) E
    'Frank'    '5086470006'
. v7 A2 R. N; G& j) J+ V; Y$ Z' G- Z横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:4 J$ H% b' a9 ~* P9 p, [
% 直接串接table
4 }2 n0 F! G5 B; R! `) q6 k/ ^) w>> new_t =[t1  ; t2]
, n/ N' t2 B) ?9 |2 e9 P4 D" A+ p6 Unew_t = 9 A, j, o& f) r
      Name          Number   0 q) [4 B5 Y0 J
    _________    ____________
$ Q4 T/ q( \+ q4 ^! w2 r# U8 V( h' M0 D: `! Z
    'Abby'       '5086470001'% p! b: E, }: a6 k( ~
    'Bob'        '5086470002'
4 D8 z- d  o/ a    'Charlie'    '5086470003'
6 y7 N! T  P4 |1 n; _. }) `    'Dave'       '5086470004'# T( i& [. z7 U6 ]
    'Eric'       '5086470005'
5 Q" e! ~3 v: j; U* {6 C* ^- m: X    'Frank'      '5086470006'
, |6 `, W$ d% L/ X  [  P% 使用vertcat
+ @5 A/ z0 ?5 S) Y, p7 r>> new_t = vertcat(t1,t2)1 h% t# ~- m5 T' x3 {8 l
new_t =
. g2 T+ P) @) H      Name          Number   , b. S9 z% ~0 S
    _________    ____________
. N7 M2 M8 x/ v+ \. b8 p" Y3 K3 E) p& {& B
    'Abby'       '5086470001'1 d4 t7 F8 N$ ^+ n; t: g6 T$ q/ O
    'Bob'        '5086470002'2 d1 Y, [+ A( S$ b
    'Charlie'    '5086470003'# z  w5 i# m3 t" ^
    'Dave'       '5086470004'
; z3 k' _6 o7 V. D2 Z7 C1 m) i    'Eric'       '5086470005'
8 J& l9 k" }. a9 i    'Frank'      '5086470006'
" x* Q- B% C4 X1 j8 O+ m  V图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table
! q( Y9 Y$ o$ lt1 = 9 S0 a  C) N$ w7 q$ K3 |9 G
      Name          Number   
8 \# Y8 r3 I" R5 M    _________    ____________
% U* {% |2 W0 ~$ y, C7 l6 p' s: M; c( G; k5 t" m
    'Abby'       '5086470001'
& o2 i! @8 n) W    'Bob'        '5086470002'5 ~# k) I2 ~, j% H& U
    'Charlie'    '5086470003'9 o3 i% _  C+ T
t3 = 5 B5 e) y* z/ W/ F/ J& O
    Office    Building/ S1 T+ W, [" e
    ______    ________8 @( L5 o" U% V& n; a
- [' u5 b$ L' m. V" x
    '331'     'A1'    1 ~7 z1 J# i0 p# X
    '201'     'A2'   
! r/ B: q) C% R$ j& R6 o% D* i    '328'     'A4'
0 B! b! f$ T% A1 ^. Z- j6 n横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示% z  T  O  ], R" q+ L
% 直接串接table7 y, h7 P" T. p) _
>> new_t = [t1,t3]
$ X% L5 [% o3 b. [( Unew_t =
9 j! G$ a/ e5 e4 `. b  Y9 \      Name          Number       Office    Building, x1 S/ V* {: J3 e; S
    _________    ____________    ______    ________) m. X4 x2 ~$ t% J0 e9 ~( c
/ X; o0 q) l- q1 U; H! z
    'Abby'       '5086470001'    '331'     'A1'   
7 ]' k  l& s- f6 Z$ n    'Bob'        '5086470002'    '201'     'A2'   
% Z8 F2 `% _3 \; d7 i2 K1 w    'Charlie'    '5086470003'    '328'     'A4'      
$ {3 P! n1 @& z或者直接调用horzcat函数,如下代码框所示:  u4 S5 L  L4 t6 l
% 使用horzcat. h( o! B" \( g
>> new_t = horzcat(t1,t3)& u% d* Z' z. \' D
new_t = 3 F* |1 m3 i$ @
      Name          Number       Office    Building  Q: O( l7 h! K5 p0 G  c
    _________    ____________    ______    ________6 y% [0 ]+ B- P( q( P/ Y& o
- v+ X( C. L" z' F
    'Abby'       '5086470001'    '331'     'A1'      w, F/ j: E4 p( p# K
    'Bob'        '5086470002'    '201'     'A2'    ' C$ E1 i* }( Z! V" v3 B; t% I
    'Charlie'    '5086470003'    '328'     'A4'      
- t: A3 |, }; M' @操作列数据
6 G6 `/ ~2 e  u- T/ ^沿用NASDAQ表所导入的table:0 S- h+ B, W* Q: @5 E. q
% nasdaq table原始数据
7 C+ |) r0 V4 L2 z  o+ ]9 e  snasdaq = ( G' y. C+ t9 `& H
    Symbol             Name              MarketCap     IPOYear
0 H* u+ x) T$ z( u    ______    _______________________    __________    _______* D2 f( ~6 O; N+ t
1 t# e* o  w2 d3 i; V
    'AAPL'    'Apple Inc'                '$742.63B'    1980   ) Y/ U1 M1 C& K+ C' c
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   
. U' @) y/ D  @- {+ k! T" s+ l* G    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     3 u+ a2 w/ j& r! C% O
其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B
/ b0 J/ J) O2 ?% helper函数/ [: j7 E4 @, u% C4 s
function out_num = marketcap_helper(in_string), M4 \& D- @; }
  out_num = str2num(in_string(2:end-1));
6 [0 k0 l3 [; y' {5 i! Bend  
- c: @' [$ b; ?) z4 ^* u/ w然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:0 j+ @8 K4 _0 @! _# Y& E+ Z4 s  o
% 调用cellfun对table列数据进行操作
, w! \/ V6 i+ I( e( z8 }>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap)8 o3 g: Y2 e6 Y5 ?
nasdaq = 7 ~2 e6 s0 A- G8 i' C8 l3 K, ^+ h; F' G

, D/ q: K% a: a* w2 Q# m% I& C    Symbol             Name              MarketCap    IPOYear$ A3 _: Z' H/ R0 v7 Y! J/ g, z
    ______    _______________________    _________    _______
: o. }/ Y& S  J
3 K- I" z# n6 o" D, l: W, e    'AAPL'    'Apple Inc'                742.63       1980   ; Q- z2 Q( c, P, w
    'AMZN'    'Amazon.com Inc'           173.33       1997   
. n$ u1 g1 k1 ^3 s. K3 V$ V9 k    'MSFT'    'Microsoft Corporation'     346.9       1986     7 t8 u8 W9 {  r+ p
table类还提供了vaRFun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:
: e8 x# y* d2 ~0 E$ R% yhoo的table在命令行的显示! o, W* |& v1 T8 n& h- s
yhoo = ' ~8 |0 L. U, u$ G" h- ~8 q
     date       open     high      low     closing      volumn      adjusted9 x7 _5 o0 M- x) X8 e/ l6 j
  __________    _____    _____    _____    _______    __________    ________& I7 Z4 ~0 ]: n4 p% v
   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
0 @: B9 A$ k$ Y  x   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   : T( P8 Q- m, _6 s4 f
   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   0 e+ C" z, n' e% y5 H  I
   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   $ e6 ~9 e. q' d* h( T
   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   % s" F2 Q) d7 j, r) V: R
   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   & s6 ]# q/ J' Y* ^5 m1 P6 f
   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     ( A2 {0 v5 g5 X. g0 ^3 P6 m
直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入( X2 P# E1 T  _, z
% varfun对表中的列数据进行操作
4 W; ?4 g  P# p! T% r6 Q2 ^; l>> varfun(@mean,yhoo(:,3))! _' s! u# ^: t+ d& ^
ans =
; \5 k+ l5 T! L    mean_high9 J8 u/ ]/ `, V
    _________, S% b0 M2 e0 Y/ [7 @/ A6 X

, t$ p! \1 H0 }+ W" o9 w5 |% u2 `    44.023     
3 \. D+ X- D' ?; ?* Y' Z: x再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式3 t7 }$ h' v9 ~0 V5 p) Y+ V
% 变换date列的数据格式( b! L* R" r+ s8 ]
>> formatOut = 'dd-mm-yy';
3 X: s) m. }% ~! V( V5 R. R' h>> yhoo.date = datestr(yhoo.date,formatOut)  % datestr接受table输入! _' s3 y* J  l# D
yhoo = 3 A, H' c* ~' D
date      open     high      low     closing      volumn      adjusted
, s% M2 E  P8 |4 e' Q  i! X________    _____    _____    _____    _______    __________    ________9 v! n3 n7 Q, M( E& l4 J
+ W3 L7 I6 `2 k. U) K: l; @
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
4 w: ^6 |1 ~4 [9 D& f* l09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98   8 l: d' m7 D: ]  i
06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44   
! Y' `) Y4 @4 k9 Q05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
9 l  p) g% @! x' R' i  {, M04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99   
7 V6 m. n9 i& R, ~03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62   0 i! z; `6 u/ D9 c) S- `
02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
2 \! ^! B# s: v% ]% R: A有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去: R4 u$ W8 s0 [1 b/ `, L5 L
% range列的数据来自于high low和closing列数据
9 L& s' t! m' S9 W( y>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing
6 i1 M9 i4 N* L5 j0 Ayhoo = 9 V" d+ u" s( r6 N; U$ \
date      open     high      low     closing      volumn      adjusted   range  1 E( d: ?; x" I# z
________    _____    _____    _____    _______    __________    ________  ________1 X( E3 C& H3 z# V3 V; _
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68     0.017338% }6 S( ^8 ?; Q% W
09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98     0.029316, S: B" v3 t! b( n& v8 k
06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44     0.019337
: e$ U* c* F& \! M& c05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16     0.018342
6 f$ W% H& C5 \$ ?04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99     0.054785
1 y  \$ Z1 @2 O  Z- `: _03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62     0.035899
. W* [: b2 y7 B: Q7 J0 X02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11      0.01655  
; E& G' t% o% s5 p# F排序9 t' g# U: F, R! y! E
沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical/ b, \# a) l: o# J: R3 b/ t) ~& q3 b
% 调用cellfun对table列数据进行操作
5 X( B) r) k' c/ B* O% cnasdaq = ' c! f8 f0 x7 k8 g; U
    Symbol             Name              MarketCap    IPOYear1 Y$ }7 ]7 c5 t" u1 t) v
    ______    _______________________    _________    _______! }& X5 o/ F" @9 I6 E% l/ Y
, I9 g/ O6 X0 x, w' ^( O
    'AAPL'    'Apple Inc'                742.63       1980   ' P1 {: H+ k* x/ o! E
    'AMZN'    'Amazon.com Inc'           173.33       1997   " C. W& Q+ ^9 ]6 I/ e+ a
    'MSFT'    'Microsoft Corporation'     346.9       1986     
9 m& _- L" t" U% O! }现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下* Z3 I  i6 F! f  F  A  {% u8 v
% 根据MarketCap列数据进行排序
  y/ I& h- |: S7 v# O- N>> sorted = sortrows(nasdaq,'MarketCap','descend')
1 g9 H+ ]) x! V& Ysorted  = - J  N: h. S& w5 n3 f; u  P
    Symbol             Name              MarketCap    IPOYear$ \* A% q. J$ w& @% M! c  ~$ @
    ______    _______________________    _________    _______
: X- J2 h: m" C8 I8 T  h, I) t; P2 y9 p. t( Z+ Y5 j2 U# U! X
    'AAPL'    'Apple Inc'                742.63       1980   $ ?7 ^4 [1 j' [
    'MSFT'    'Microsoft Corporation'     346.9       1986   
9 ~6 i& {+ C6 K5 f% E* D% Z    'AMZN'    'Amazon.com Inc'           173.33       1997     
* y' K( ~, n+ N( x: q筛选和查找
3 _4 H) x5 M1 ^9 T4 y3 Itable的下标也接受logical index, 下例选出所有股票中市值大于200B的股票' t8 ~7 O7 i, L* m
% 筛选2 ]7 R, L- D/ }7 y3 v' Y
>> nasdaq(nasdaq.MarketCap>200,:), k& u1 I7 T0 S- K% @
ans = 7 Z* l* S( b8 S, Y! N3 F
    Symbol             Name              MarketCap    IPOYear
0 a. ]& z. `8 P" Q    ______    _______________________    _________    _______: m' N5 {$ X; ]# w( v$ V

0 F' ^# E: K' f% ^    'AAPL'    'Apple Inc'                742.63       1980   
! t) k! _0 q7 n, f    'MSFT'    'Microsoft Corporation'     346.9       1986     
) u7 X) F* N  v  V' F! x如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票
: t% m/ V: m0 A5 L- t2 y% 筛选8 @4 h9 q! X; ^& ]( q2 f2 ^; v
>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:)) b1 p: Q- k9 ]9 O8 x' ~0 g0 X
ans =
& \0 t" F$ S2 k    Symbol             Name              MarketCap    IPOYear
' l# K5 Y* f  J# @8 O    ______    _______________________    _________    _______! Q" {8 E* {2 o# Q& P% `2 o( @' l

# S5 `5 w7 ]$ x' |# v3 M    'MSFT'    'Microsoft Corporation'    346.9        1986     
2 n- F6 z* T# B' [( M) j$ r8 {logical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据
" T1 j2 I9 C2 |. s# N% 查找
5 I0 k3 A; z! g7 W>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:), X' N- F5 |- p; m6 t9 ]% R& N4 U
ans = 8 H: i+ u; m& a% c& ?
    Symbol          Name          MarketCap     IPOYear  ?) m1 ~2 n6 l6 K$ u
    ______    ________________    __________    _______* c% T4 j3 Y# q9 K# y
    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     
% c" @$ R) G9 Y" V4 @2 m输出到文件
) \. F7 g& y8 \  w1 v' s和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable
# _2 z' h+ g7 `3 B7 N3 i4 y6 u% writetable
5 W  W# _& W( [7 g. c2 h>> nasdaq = readtable('nasdaq.csv')
# `, m0 m7 j; {) q8 x: p>> wrietable(nasdaq,'mydata.csv')   
- v9 q6 `$ X- b2 d# |0 Nwritetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号, L, P* @5 v4 l8 f& {) L; i) U) \
% 指定分隔符
2 Z2 F9 Z! Z4 }$ ]9 ]writetable(T,'mydata.txt','Delimiter',' '), }* I) w% X+ v
结果如下
! q" Z% W9 k- i" E3 I( C% mydata.txt
( m% t: t) `& ~+ i7 ?5 H% w- KSymbol Name MarketCap IPOYear
# ]3 T% K( N: s/ B2 {8 lAAPL Apple Inc $742.63B 1980% \2 b, z. ?% z& C  K  T! J6 `8 B
AMZN Amazon.com Inc $173.33B 1997  g2 t+ h3 X1 M( f3 o( R7 a% c- m5 T
MSFT Microsoft Corporation $346.9B 1986  
& a# C! M0 O* z5 C; v其它数据类型之间和table相互转换
9 K/ [; K" o: I) h7 |3 q  i/ uMATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:' ~7 ?1 Y; Z0 \0 E3 J9 q& V8 O' q
Figure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:! K6 @! d$ M3 t2 K3 s
Table.1 美元人民币换算表
/ [' t, g1 N0 b+ l* |( x6 y& `
* `3 r$ x  C1 l5 ^7 ~# H! KUSD        CNY$ \' v% u/ y2 h7 a( H
1        6.21
5 ]. P% k, d: Q& N$ w5        31.03
! W$ M- w( X; ^, C5 i5 o2 p5 P: M10        62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置; q+ S5 T% O/ s( L
% array2table' y6 }5 B: U& s( u. Q% w
>> a = [1  6.21;5 31.03 ;10 62.06 ]: ^6 K1 }: Z; W* y/ z
a =
* P  \* W! A" D, K- a    1.0000    6.2100- `) @9 W/ i* S4 D
    5.0000   31.0300
5 ]$ c5 \/ j* a* a1 d   10.0000   62.0600& v6 g7 u6 E$ U6 q0 r7 u7 V9 w* x' {
>> t = array2table(a,'VariableNames',{'USD' 'CNY'})   % 通过VariableNames提供表头信息
4 n+ j! t. r- d2 B; J& Z( ?/ R- yt =
# _7 I7 u, e( ?    USD     CNY 2 B, {% b! j3 b8 Z- P
    ___    _____: j& C2 A# o5 Z# f5 S
     1      6.212 P# {* M* {6 M+ @4 |
     5     31.03
$ V& I1 b! K6 b4 h) {# {6 X% i4 Z" \: U    10     62.06    : i1 e7 V# X7 Y' b
  
* f8 o3 {) k7 C* i: F) ^; R( \如果把table再转成array,表头的信息将会被剥去
4 `8 N& p- G% M% U4 W$ {% table2array9 R+ Z. R; @2 ?& V4 k5 }
>> ap = table2array(t)
+ p6 v/ C- ]0 N9 ^; [8 G# {% cap =+ ]4 ~" f# J3 ?' {
    1.0000    6.2100
) V5 j3 d0 K) y. c: m2 i% H    5.0000   31.0300* H6 E2 T+ C$ Y: M5 m1 T8 p
   10.0000   62.0600  
- r" F/ S9 ]# y* ^操作如图Figure.4所示:
/ y7 n0 E# q$ S9 n' g. E  y2 m, N! M$ |Figure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。
2 a; P* k& c3 P' I- w  x* ?0 p% struct2table
  M: O+ R  H$ ]5 u>> s.USD = [1 ; 5 ;10];( x9 r/ I0 Y' q: S; \
>> s.CNY = [6.21 ;31.03; 62.06];. o0 O! l# v" O
>> t = struct2table(s)      % 输入s是标量
. F( g! M8 M$ D( L" }t = ' S4 z# G& @8 ~1 i. K
    USD     CNY * p2 V9 s( ^# {) S) L0 j% z
    ___    _____
% p/ b, T" e$ U6 J1 o     1      6.21: o! c( b' K3 Z# B4 d1 p
     5     31.03' ^. a: [5 o+ q# G) D
    10     62.06      
* l4 k1 d4 I5 r9 Y  J" m/ X* J+ ]   
; r  H; b2 r5 Q) F0 {: ]( cstruct2table还接受struct是非标量的输入
: }. f( Y0 I5 g$ m0 h( j; [% struct2table 矢量
/ \+ Y+ t# p6 y/ f* j1 K, k, Ls(1).USD = 1;: s2 b* v3 U/ h7 g  C
s(1).CNY = 6.21;
! B0 A* k" U% H# B- A1 |; X$ U: ts(2).USD = 5;, k9 f0 u- c! j  y
s(2).CNY = 31.03;5 p1 J4 ]% c5 W% p
s(3).USD = 10 ;
2 E! m8 ~; H7 L9 y7 |7 Y" ]s(3).CNY = 62.06" R8 {8 j" i) Z$ u! u3 w
1 l& O' V1 s% g3 t7 K3 ^- {0 K
$ P1 M( D0 \1 O6 d
% 输入s是矢量7 z' \4 h8 W) r" g$ {, [+ Q( C
t = struct2table(s)
: f* @- ]. _7 t7 l. I. y! G) E4 c* T" i# |9 p6 H! \2 H

+ m. E0 g8 c( C0 A; w, us =
" Q7 x( X0 B! S, }) E1x3 struct array with fields:
1 u4 T* v& v, j  _# ]' N; l    USD
$ {& H7 y4 t% U* d: s8 @    CNY& c" `% N$ @; O) c
t =
2 ?( @6 I$ [  A/ V6 T  p0 G    USD     CNY
. `3 }; z! y! }: `    ___    _____
! G1 \* F' c- |% q( n     1      6.21
: V" }% x) f% f$ X     5     31.03
( S  m8 V8 `$ q! N9 S    10     62.06
5 V3 D7 s* t2 V% o把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。
  x1 T# S/ x$ {% H- i% table2struct5 z: i/ a" E& j
>> sp = table2struct(t)  % non-scalar struct + l0 x0 F. \. y7 ~
sp =
! e3 A' g8 `+ @( P8 {/ U; ?3x1 struct array with fields:
8 f: Y4 C3 k& O$ t( r  Z( g# x    USD3 P5 U) Y3 i5 v) h- d9 J
    CNY  
- r. d) \& y* I  `操作如图Figure.5所示:$ Y1 \, C5 {& a8 W/ b
Figure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。
+ F8 G* _- u' ^, J, ]( P6 m) i; lTable.3 电话号码簿5 ?: d+ @) |+ `. y2 t/ M$ H  h

; _# t# u; ~% I  p- T9 p$ `9 X2 I姓名        电话号码
. j% y, h: F: H# O8 @; H7 mAbby        5086470001
3 G- U( z$ E6 `8 y& O* I% U& cBob        5086470002
& ^0 p5 G3 z/ C1 P% Y* K  WCharlie        5086470003
# x1 X5 |" d2 z0 j# ac = {'Abby', '508647001';...( v5 x6 l3 V+ F! z# K; k) l) l+ Q
     'Bob','5086470002';...
3 M# y% l  ^! W" ^9 L# _1 k     'Charlie','5086470003'};$ s  g1 A1 k" V3 x
t = cell2table(c,...
) Q; C) _& }5 ]/ h' c& T; R, v 'VariableNames',{'Name','Number'})
# x5 W) m5 ]6 }& W+ R' j) k4 N! G  k

" }6 F4 v, J8 ?  `" U6 @6 v. ~t =
( |. F) n# B, }5 v- g      Name          Number   ) o( `0 o2 c. Z3 J$ m
    _________    ____________
2 y! B$ d. m& z# O6 C2 @  c8 Z  s    'Abby'       '508647001'
# K& R: B: e* f. l1 G. ?    'Bob'        '5086470002'
  `2 ]" i3 ^/ B" c2 t+ l. G    'Charlie'    '5086470003'" I: S+ D: f2 b
把table转成cell,table的表头将自动被剥去
! j/ L& z* A& s5 W* ?& q1 m" |) f& ?% table2cell7 x# M% h! i" \+ Y: f7 q
>> c = table2cell(t)* x* \2 p2 l$ ]5 [, w
c = , B; j+ W* g1 E
    'Abby'       '508647001'
0 @( t9 y' ^+ V    'Bob'        '5086470002'% F) O0 P3 y+ c' ?9 m
    'Charlie'    '5086470003'

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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