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

MATLAB table数据结构(中)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
' e1 ?* c0 _1 e. V
目录:
" l5 Q* Q' D; m9 B: u" E- W: S  E5 E/ C' [. M& I
table的操作
! o- i" h3 b9 j6 x& Y1 y删除行列
* a3 r; p. [" F+ Z& Q& o添加行列; m; |+ T1 a& k7 i/ ^0 {* d
合并table
( U6 i: N4 Z% z# o0 Q, v操作列数据9 x. L4 s1 T# m, \! H
排序
% U$ O% |5 x8 V筛选和查找
# l. G  g0 a' G- B' v& n4 v输出到文件- B1 M+ Y4 [* M5 C/ Q
其它数据类型之间和table相互转换
$ }4 ~8 }, ^! t- N8 H* |table的操作6 r  p  K& l  ]  L& P8 A
删除行列
+ k4 s3 @% {  O8 E删除一个table中的某行只需要对该行置空即可:
1 F% L8 K# U4 Q% 删除行. L: ?7 _* e1 }) J, ^
>> nasdaq(3,:) =[]
# i+ n( m* z* j+ H' ~% a4 qnasdaq = 8 n& F$ B5 Y, g$ N
    Symbol          Name          MarketCap     IPOYear
6 o0 C, Y4 O3 H  a    ______    ________________    __________    _______7 n" U% Q3 E9 ?: e4 f$ }- {

; I7 |9 N; q' H    'AAPL'    'Apple Inc'         '$742.63B'    1980   2 d& I8 {/ J% ]+ w* z
    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     
8 @6 v9 ?* a% Z5 \以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。
2 K! p3 A( ]" u' G6 k# C' ~% 删除列
. x; v. w5 ?6 m/ N1 m8 D2 U>> nasdaq(:,2) =[]
% P  a/ |1 h% U9 \. w" M6 T& }nasdaq =
- w8 {% R8 x' K7 C) C3 x. n7 \3 j) x# |    Symbol    MarketCap     IPOYear: _* l% A( I: w
    ______    __________    _______
1 M) z/ Z& t/ p8 J' ]: j* S0 w6 e' W' G- N; Z# t& K. ]( T# z
    'AAPL'    '$742.63B'    1980   
; \% W& G3 a3 {& ?4 I' u/ c    'AMZN'    '$173.33B'    1997     
- X/ i3 Q1 Q5 C1 G删除列还可以通过Dot的语法,只需对表的VariableName置空即可- y% v9 _- u' _- D, m
% 删除行. A' E+ f( s: Y
>> nasdaq.IPOYear=[]0 q" k; B5 i8 D0 d& g3 u0 y2 I
nasdaq = ( F2 `* X( S6 }% D
    Symbol    MarketCap
0 c9 u$ w4 z, L, d    ______    __________
2 |0 X, Z; |+ x& ?; F
7 v% i, k% o4 M1 d( r1 B, p9 v    'AAPL'    '$742.63B'
) t, y& M6 w* J# [) _  w7 v    'AMZN'    '$173.33B'  
9 H6 A! a: R1 [; U% Y添加行列7 `( g6 ^! r; R! V
沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成
: c% O( r, ~) ^, k8 W% 添加列
% i  C) J. v2 F* h/ n  @nasdaq.Sector={'Computer Manufacturing';...
( w8 _1 H; k  Q( |2 f/ ]                'Consumer Services';..." ?+ y1 e$ R( l& u- G
                'Computer Software'}  " l) J5 p0 u# N$ I. Z
注意,这里等式的右边是一个列向量元胞,结果显示如下:
3 E( J7 r; p" ?1 C7 ], g%  table新增了Sector列; H' a+ V; {2 }5 `5 R; F
Symbol            Name             MarketCap     IPOYear             Sector         2 C* E$ Q1 q- ?
______   _______________________   __________    _______    ________________________2 B% A& [+ [: P
'AAPL'   'Apple Inc'               '$742.63B'    1980       'Computer Manufacturing'0 L: {4 K/ O9 r7 C4 w
'AMZN'   'Amazon.com Inc'          '$173.33B'    1997       'Consumer Services'     
4 F4 v8 s( ~9 H, p" y* @/ ` 'MSFT'   'Microsoft Corporation'   '$346.9B'     1986       'Computer Software'% M6 q7 I, I0 q) d3 d
  
: V: E, V4 r+ g前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:4 k$ W/ Z% o) h
% 给table添加行: n. H; U) t5 ?: T( e2 b8 s
newCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'}   
4 p9 D/ H8 V* q0 G2 {8 {9 J/ F! z- \newTable = cell2table(newCell)
% F  h: M' F+ Q  SnewTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};7 v9 x/ W  @& v  V9 p) |, t
newNasdaq =[nasdaq;newTable]  , n3 A6 \0 r9 b- i- y4 S. A! n
其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。* N) n8 R3 ~' q$ {5 K
合并table
0 b8 m0 C  i$ C! N  A合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:# |" G" K: f2 _  T3 ?' Z* G
Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:
* y) y9 z# [: @$ `1 Q, St1 =
% X; F) [8 C1 u6 G      Name          Number   
& A1 Y% x0 S7 @% U: M    _________    ____________
' S# g, X- V: c$ Y
7 P- x3 s9 T( K0 ]1 r) [    'Abby'       '5086470001'
& U5 P" w: C, R5 g8 o    'Bob'        '5086470002'
1 m% O, w+ ]8 ^: c7 h0 r/ W! h9 W    'Charlie'    '5086470003'    M" _+ e: a/ D' c& J) d
t2 =
0 Q& M8 W$ g1 U2 X! J* f% T  V% H9 B. _     Name         Number   
; |7 _/ _  {0 j- @4 O) Y    _______    ____________7 \4 W+ X: i1 `" c5 q
, g! S" Q4 i4 j7 Y1 d
    'Dave'     '5086470004'3 [7 @) M7 B. j$ d; ^7 P
    'Eric'     '5086470005'4 ]7 p: d. F& c2 u  _) a4 L9 D' n
    'Frank'    '5086470006'3 q7 w* N$ O; S
横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:
" ~) T/ k7 Q6 f% 直接串接table& V$ K0 A3 i, b4 \! n% c& _
>> new_t =[t1  ; t2]
, D  n/ q1 F; n  M% W9 m" Rnew_t =
! d. I# O0 J" W) q% [8 a) u      Name          Number   & P  s& g  N! j/ j- V" e2 {5 [
    _________    ____________
/ |- ~1 l! O# X* s  ^0 a( i0 x' d$ h: j
    'Abby'       '5086470001'( Y3 K2 H/ Y/ N1 f: w
    'Bob'        '5086470002'
: C" O, P- H7 J    'Charlie'    '5086470003'
7 z) Z1 q2 w% |4 |5 q    'Dave'       '5086470004'
5 E0 Y3 _. h' w0 l* P- I+ V    'Eric'       '5086470005'3 @: D$ _9 e/ R/ y1 E! s4 t( I
    'Frank'      '5086470006'5 ]" _: M( g& e4 y+ G
% 使用vertcat- }: K! R. G1 H9 ^/ y5 w/ f) \: O# l
>> new_t = vertcat(t1,t2)/ _5 o+ X/ k, M2 ~: \/ g, b. x
new_t =
: o+ B# p# F. t+ Y* i# m; H2 O      Name          Number   
9 e# x* n1 H* t. l0 q    _________    ____________
) x& ^9 ~" h  D8 w- n% W0 [5 A( W# H# r9 }4 E; S* }. L% X
    'Abby'       '5086470001'" v. H- \- B" Y; W
    'Bob'        '5086470002'
; Z: ^1 y0 U' x/ C    'Charlie'    '5086470003'  ]( r/ I  g2 C/ u: O* a5 b
    'Dave'       '5086470004'
8 d  N- g- l) R# r$ W    'Eric'       '5086470005'6 b" ~5 \# d" O: N" E5 {
    'Frank'      '5086470006'! c9 C9 P* I+ u
图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table
% {* c6 y4 ~3 Et1 =
5 @$ L* k1 o- B( B7 U0 v# E      Name          Number   % s2 u+ V  Z) J4 A
    _________    ____________
. h/ d6 A; P% i. |; y. r* D1 Z3 ~- ]! ^* U
    'Abby'       '5086470001'
& {, A; G, ~- p! a    'Bob'        '5086470002'
# B+ P- d* f) T( I6 z' K" Q5 O' ^    'Charlie'    '5086470003'
! c6 Y  }0 z% z+ E, p; s$ A& nt3 =
8 V& M7 `3 K( a( f% I1 s; `    Office    Building5 Z5 a: n, K& y5 D# h
    ______    ________( i( g( j& E2 b1 T) M' G
2 s) y7 o" f5 P( l) ~$ s/ T
    '331'     'A1'      Y  b) C6 T6 P+ a
    '201'     'A2'   
  r( w+ ]2 H3 T4 f. J6 m    '328'     'A4' 1 u& y+ X6 D( o3 y0 }
横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示
8 P( f$ Y. ^  |  ?+ p) [9 `% 直接串接table7 X% y0 H' L$ ^* q( K1 o7 h0 Y
>> new_t = [t1,t3]1 H; k3 }1 N5 B; T9 \% p
new_t = & u2 Y3 X& O- {: W9 N  L
      Name          Number       Office    Building
" ]! r- \( ~) S( K1 M. p    _________    ____________    ______    ________
( s2 `7 b% C, o: M$ O3 ~( v, ~" d* K8 O! w* c( }# o. q
    'Abby'       '5086470001'    '331'     'A1'    ( J: u8 S$ j1 }. ?3 X8 k
    'Bob'        '5086470002'    '201'     'A2'   
! T$ k; U# u( n6 _5 T; ]    'Charlie'    '5086470003'    '328'     'A4'      
) H% W5 S4 K/ t* E& y( c3 _或者直接调用horzcat函数,如下代码框所示:1 y' i+ ^; v# e" u" [
% 使用horzcat- {4 b7 H9 b& `% Z" s
>> new_t = horzcat(t1,t3)
2 J& h& |' D! a1 Nnew_t = - ]) T3 i; L4 {+ j! v: b
      Name          Number       Office    Building9 u( x0 A1 ?  h! j. z+ M( \
    _________    ____________    ______    ________9 I/ l( g& i; A

: s/ @5 R- x; l2 m2 w# O( K, w    'Abby'       '5086470001'    '331'     'A1'    - b9 m1 h+ R( h+ q  N
    'Bob'        '5086470002'    '201'     'A2'   
  N0 L% R3 B/ D0 t    'Charlie'    '5086470003'    '328'     'A4'      
5 g& H; A  U5 O0 ]操作列数据
, r6 u+ i8 e4 a( v4 ?- f2 |( N沿用NASDAQ表所导入的table:& p# X# K# R% P7 T  |3 ^
% nasdaq table原始数据
3 l$ A! r$ r8 w* i5 q5 o( {nasdaq =
0 x* N. L% l6 B1 F) d    Symbol             Name              MarketCap     IPOYear
( i, a; n8 N& n/ h2 P+ ?3 V    ______    _______________________    __________    _______% c! {' ]  ]  O# f) I
& x! J# \5 `5 N! x4 {) a
    'AAPL'    'Apple Inc'                '$742.63B'    1980   6 R/ E% ^7 Q5 N. k  ]+ g
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   
; X4 C5 `, @/ F7 W) C    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     
4 u* Z4 A5 _5 ?; M+ @其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B( q$ b/ U5 f# m; {
% helper函数# `% ~% \, M. V* `$ Z9 l) P4 e
function out_num = marketcap_helper(in_string)+ i9 T! i  U' A0 G
  out_num = str2num(in_string(2:end-1));. t4 s4 j; v$ a$ F8 i6 _0 t
end  
+ I4 F5 l/ @" R然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:8 O7 j0 E0 G8 l' o
% 调用cellfun对table列数据进行操作
* |5 k! ^* d" z1 f) n>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap)
2 W3 V( j- w( [nasdaq =
) E6 _9 r* x  Y1 M0 [, O: H- ?; t7 V$ ~# z6 E
    Symbol             Name              MarketCap    IPOYear
2 W8 p8 I" s: E2 W' e! I, p9 W    ______    _______________________    _________    _______
7 r( f* V1 R. S$ O6 r& y+ z; C* V. T% v& N! ?" O2 A
    'AAPL'    'Apple Inc'                742.63       1980   $ ?8 q' q( _6 X0 v8 E6 H- }
    'AMZN'    'Amazon.com Inc'           173.33       1997   
) S5 ~" [4 }( g6 H    'MSFT'    'Microsoft Corporation'     346.9       1986     
7 P) l! R/ O! p. utable类还提供了vaRFun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:
0 B: |2 P- y' r2 C* ^( _8 i% _% yhoo的table在命令行的显示1 B8 n# y- t! w* q9 T
yhoo = 8 M+ l3 h0 Y! o" V# {8 C
     date       open     high      low     closing      volumn      adjusted
# G( B) V3 u# }$ F( p  __________    _____    _____    _____    _______    __________    ________
+ N: j% P* _% k   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
/ f7 ~6 L" I0 u7 h! X5 j   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   
' v% q' L  y& k   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   " Y' H9 S/ c* h, E! T
   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
' x) \1 Q1 ?3 e& M8 `* Y# K9 i, k   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   
8 ^2 M3 e: d3 w1 B   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   
: B) D$ M- y0 M   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     . T( a, m% f" Z2 `
直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入
- }/ [/ N* R0 _) K5 y% varfun对表中的列数据进行操作
" L; D' @5 g$ H1 Q>> varfun(@mean,yhoo(:,3))+ I( A* T. d% H$ |( T% l6 w- ]
ans = " ~" c& c2 H" H
    mean_high
8 e& y6 D5 ?/ x0 j2 _4 K    _________
' a* q/ D+ D) j# G" ^3 R; x* k
9 N3 e# \0 o* S+ i    44.023     
' z1 C, O, z, ?! N9 {* ^再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式( b& F2 l% A3 O& B
% 变换date列的数据格式
1 w% o' b* Q$ \1 c. T  [$ r& _* g>> formatOut = 'dd-mm-yy';6 {& X! R" |8 D7 [7 [
>> yhoo.date = datestr(yhoo.date,formatOut)  % datestr接受table输入/ k" ]& r, Q3 ]; v
yhoo =
5 C: X+ c; m, h, t! ^5 Ldate      open     high      low     closing      volumn      adjusted) B* I; m) E# f6 V  [  Y
________    _____    _____    _____    _______    __________    ________, H) ?0 O7 R) L: e4 k8 i( i3 Q
5 i, P8 q( E1 ?2 C- f5 I
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68   $ T4 z6 I' F0 T' c- i- N( `+ W
09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98   % [, Z' L/ ?* H" i; p- G
06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44   # s, [5 Z# V6 p, g9 `6 i4 B4 m$ s
05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
; N( I% q0 p8 Q04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99   
* @" G4 j2 E0 {5 A# r! z( |03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62   + F2 z- e# f9 W
02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11     ' k* N: L2 W  M& c* a2 Z  z
有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去. p8 q1 i: }9 S3 Q
% range列的数据来自于high low和closing列数据
: F1 N' p1 M! Z>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing
$ a0 g$ @# S: Q! w  `yhoo = 0 I6 S) C% g" T# r0 a! q2 F4 b; M
date      open     high      low     closing      volumn      adjusted   range  / f) i& L( P# R* |" r# i+ w  S
________    _____    _____    _____    _______    __________    ________  ________# C. o2 v, ]; \* u: o$ `
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68     0.0173384 d! j/ S; ], M; ?
09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98     0.029316
) r. O3 z8 t! B! v. E! H( j06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44     0.019337  M' L* L& d5 P: b' \/ T1 Z& b0 `- ^
05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16     0.018342
' y' Y0 s' e( T- w7 q; D04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99     0.054785- |! l1 T4 E; c! T, ]# i2 R9 _, u
03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62     0.035899, B4 F8 U( P( y* g
02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11      0.01655  
; ?( M! Z6 h6 Q, G6 z$ [排序
$ s0 {8 h/ L" |( n& T沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical7 F4 e2 @1 n  l7 R& s% s9 @9 n4 D
% 调用cellfun对table列数据进行操作
. L' Z* R" a. {* ^1 f3 o7 i! \nasdaq = ! `, O$ |+ C4 |- l: L
    Symbol             Name              MarketCap    IPOYear
+ @. I7 P& B  y- z  L    ______    _______________________    _________    _______
' E% a8 G" G& O7 |/ y
+ w" r% T0 y, _9 \* \8 S# _7 \4 Z    'AAPL'    'Apple Inc'                742.63       1980   
7 ^8 R& a. U/ n* j3 g) n. \4 B3 H$ |    'AMZN'    'Amazon.com Inc'           173.33       1997   
) N4 i4 R1 j0 ^+ B    'MSFT'    'Microsoft Corporation'     346.9       1986     
4 P8 _' t/ s% t  s4 d现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下* z3 Y5 u; d1 @4 s, [' E
% 根据MarketCap列数据进行排序
! V, S) G2 L4 z4 @  Z0 M4 o>> sorted = sortrows(nasdaq,'MarketCap','descend')
6 w! d! e' D6 C( Psorted  = , c: u0 ^0 p" T% {2 [0 D
    Symbol             Name              MarketCap    IPOYear) q3 L& a* n# r" @+ w
    ______    _______________________    _________    _______
' N) @* l* X  C, Z' }& u8 Q! Y. @, u# B7 x
    'AAPL'    'Apple Inc'                742.63       1980   
" Q7 m' O! K3 w& J2 w6 F" i7 X: K5 ?    'MSFT'    'Microsoft Corporation'     346.9       1986   , d- q+ ?( j$ g$ L! {
    'AMZN'    'Amazon.com Inc'           173.33       1997     2 U) H- Z& V$ r: ]+ `4 f
筛选和查找, Y' I; e& ?9 B  |/ D
table的下标也接受logical index, 下例选出所有股票中市值大于200B的股票
* k, x) G$ B7 F% 筛选
/ s9 @. T6 ?' p! s( y>> nasdaq(nasdaq.MarketCap>200,:)
$ v- `8 p/ ~- T/ M  O) A+ Aans =
8 B% O' m% n4 J5 n! n+ s4 J    Symbol             Name              MarketCap    IPOYear
/ P$ L2 T. Q4 ?    ______    _______________________    _________    _______
% e! V0 t+ B8 U+ A2 Z" w6 T; a
5 G* H9 s& C; w% A/ O    'AAPL'    'Apple Inc'                742.63       1980   9 s( D" g. n, x1 R' {; |
    'MSFT'    'Microsoft Corporation'     346.9       1986     
# W% d6 V6 S: q2 W如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票
# x+ X& B5 X# Z4 k% 筛选0 C& S' i9 t9 Z( ]4 u& F* o( z( m( c6 F
>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:)
$ L+ m1 t2 L" ^3 eans =
# t& X  I$ ~8 A4 d0 s* ]# v    Symbol             Name              MarketCap    IPOYear( ^" Z  [7 E- W
    ______    _______________________    _________    _______
( u1 \# G' S4 x9 Q7 @! s5 b3 N2 F4 X4 ]! p) y0 ~1 C$ f
    'MSFT'    'Microsoft Corporation'    346.9        1986     
8 A( u: W8 n) p7 X3 v" clogical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据( y! j# n, o5 o! t1 _5 o5 D
% 查找
+ Z: h9 s6 ^7 ]  F; B' J>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:)8 ^& [% o0 e+ {- Y; S* m
ans = 6 e/ g7 R. ~/ F4 V
    Symbol          Name          MarketCap     IPOYear
  ~8 H& Y( \" W$ A9 x    ______    ________________    __________    _______
; F$ d  S0 _( `" u* X" n  y    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     + q" ^; q2 w. t  ^* X+ W; p8 V$ H# Q. y
输出到文件/ G% Y5 T& R" O. l  }& W- v" j
和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable) T7 l4 t- j( f2 z( B2 \% n5 O. C
% writetable
5 w2 B/ X5 o. T* r>> nasdaq = readtable('nasdaq.csv')
% c* I% F& I& a+ k8 ?# h>> wrietable(nasdaq,'mydata.csv')   
, k/ M7 ~$ t' ^8 v5 x; jwritetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号
; h! P% K  t7 b" t8 \- d% 指定分隔符0 |. P% V% h: ?0 O/ d5 {
writetable(T,'mydata.txt','Delimiter',' ')
# J' {8 {7 U# x+ a8 Z7 q7 g结果如下0 _! q7 {/ ~. L8 ~. f. f
% mydata.txt  }0 y7 m9 d% W' s
Symbol Name MarketCap IPOYear
8 {  w5 J) U$ o  D6 qAAPL Apple Inc $742.63B 1980+ p% y& {7 j; d6 ~3 [
AMZN Amazon.com Inc $173.33B 19975 @% ?# W* _7 Z( y
MSFT Microsoft Corporation $346.9B 1986  
2 u- I# q: w) x2 R其它数据类型之间和table相互转换2 I" `  p& W7 h
MATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:
% w3 H0 h6 C3 @8 ~' aFigure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:9 ^# N% n& A- ~6 l
Table.1 美元人民币换算表
( d1 K9 W8 L5 e2 |% {) E8 A6 N6 r) J2 Y8 [* `. j
USD        CNY$ M9 B* U0 o; E! J8 |- j
1        6.213 t8 e; n. l3 r
5        31.03
( Q( i1 N1 K( m( x10        62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置
2 w( q* K3 E" h0 l( ~$ g4 S- {3 u% array2table/ `+ _( T0 C! ~. t; J  Z, D
>> a = [1  6.21;5 31.03 ;10 62.06 ]) x4 Z+ b- D: W% n3 f- C5 [
a =; F+ V: K* ]2 k
    1.0000    6.2100; i4 T% f8 a: Q9 W
    5.0000   31.0300
1 M+ C0 s, O8 R* Q/ s   10.0000   62.0600
% j5 |1 ?" I7 {0 a! k>> t = array2table(a,'VariableNames',{'USD' 'CNY'})   % 通过VariableNames提供表头信息; H- M" s& R, ?8 u, T2 t1 P! g
t = $ C; }6 X: z( x9 t' Z3 V  o. Y
    USD     CNY
6 A! P5 h; N# _( }    ___    _____
# q! x2 m% y! V% M4 J     1      6.21/ u( ^8 k+ c# ~9 v
     5     31.03
# e9 I! r& @( e; O6 i9 E7 o& }$ E    10     62.06    + O) p6 k! X0 }# t: C
  
7 B5 z) o" _6 m如果把table再转成array,表头的信息将会被剥去& m! ]5 `' w7 W: u' B
% table2array
! ?& z' o  d- ?2 ^. Z6 i% y* W>> ap = table2array(t)
; ^7 Y; K+ Z8 Nap =
0 s- [. k0 ~9 e2 T' V    1.0000    6.2100
% q" l/ b. v( `6 v# f; c    5.0000   31.0300
( g2 x; J8 k7 B( v   10.0000   62.0600  
4 f3 L; k3 F8 J" r+ z操作如图Figure.4所示:
+ P! @! T1 u( [7 VFigure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。
  _. t' n# G# h% struct2table
) F! l! ]8 E9 I8 W: y% ]1 {>> s.USD = [1 ; 5 ;10];5 Z) ~. m# n! c4 W) g& }
>> s.CNY = [6.21 ;31.03; 62.06];
, u7 V8 }' H: A- p>> t = struct2table(s)      % 输入s是标量
  a- v& C% A0 @2 W9 J9 yt = 9 A; f' q+ W3 h' ]
    USD     CNY & B& ^0 w( [5 S
    ___    _____% ~; g) J& N+ I( x" P; d* k# W
     1      6.218 `" M% ^& X. ^
     5     31.03' F- J' f6 I' w) I) V# O
    10     62.06      
+ A' H0 Z0 T) g1 T    + a$ H" P! d5 l1 K  t7 E' C
struct2table还接受struct是非标量的输入: o5 E' @9 r6 l* |; H
% struct2table 矢量+ Q# x7 N# K0 Q$ Z( A  N* ]9 Z# [
s(1).USD = 1;
+ J+ ?% c& ~9 A2 M. \s(1).CNY = 6.21;$ j: g9 M. T, S/ d
s(2).USD = 5;
2 }6 B; ^, I% c3 M# Hs(2).CNY = 31.03;
1 S2 P7 X9 o; d8 i' ^4 bs(3).USD = 10 ;
/ [' l% I6 A! m" U' }) {" Z% V" bs(3).CNY = 62.06
* h+ a' \- V9 B! V, \9 q# G. W. y
4 u9 ^& p0 M. O8 A6 X% v' y5 ], t: a1 ~8 j& b0 ~! ?+ v8 r
% 输入s是矢量& Y9 K% x- y. D. @8 q
t = struct2table(s): E% }6 w5 f1 O; k* c; I, G

" }+ i% Y; {4 ~& g" E6 Z) N9 x: |
( k& f4 _! w+ A+ s3 Q7 Ks = 5 K( l7 u0 o4 q% x: N; @4 ^. B' a  x
1x3 struct array with fields:
8 P/ G6 b: x! ^, Z, F  Y    USD* S1 o3 E$ E0 ]: H6 z/ w+ W
    CNY# n' a( `  ?0 V) u6 F
t = ) g; r, [2 Z+ M6 Q7 d% v0 C
    USD     CNY 5 G; `/ H& D. n/ }
    ___    _____5 n3 v' c  b+ x8 I. q0 C9 I3 A
     1      6.21( W- q4 `, e9 `9 P  _/ C/ G% z
     5     31.03. D/ F% S1 U" `/ D, G4 {0 O
    10     62.06
% |! _1 W( l- Y1 ~8 F把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。
3 Z& h# B# D) ?0 R7 F5 N) [; `% table2struct+ r7 Y/ v$ H0 N6 d
>> sp = table2struct(t)  % non-scalar struct
) t5 f: q5 `: Z# \1 K4 Ysp = - z( c0 \4 |0 r) Q8 Y% {+ r! ]/ ]: h& x
3x1 struct array with fields:
) _: X2 U. Q6 x9 D    USD, y6 E/ i: ]8 I' N
    CNY  
" i0 U9 ^% X, ]+ ^操作如图Figure.5所示:3 X- v* J- n9 l/ I& E4 ?
Figure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。
8 s  W9 I4 s# P3 BTable.3 电话号码簿
+ U2 S# q: u, W
# F  T; t0 R; ~姓名        电话号码! A! h% u  r1 ~9 W
Abby        5086470001
% O$ X% m- s) i" j$ ~' rBob        50864700028 n% J$ N7 s$ l
Charlie        5086470003
7 E/ J; D! w. u9 H; ?4 I- nc = {'Abby', '508647001';...4 G6 _; v+ v' N% W
     'Bob','5086470002';...  S4 Y% D; P, J. z% l
     'Charlie','5086470003'};
; P. b0 }6 |# H( O# Zt = cell2table(c,...- d6 `1 y8 H6 |. e$ A
'VariableNames',{'Name','Number'})6 A$ l2 T3 j) }' @5 D7 \( h& o
5 Y  `3 z- e9 p* t& U2 e

# b: Q' t* v3 y; A! ~t =
) O" U' p7 Z0 m5 ^4 x# O# T      Name          Number   
; `  S; w2 f4 _/ A$ ?0 D    _________    ____________5 [+ ?5 v9 W8 q- R/ I, O
    'Abby'       '508647001' ( i6 M" E/ D/ x4 R/ E$ Y3 X" E/ L
    'Bob'        '5086470002'
/ E6 z9 Q; M: f4 e2 w5 `    'Charlie'    '5086470003'% u" s# r$ P3 N3 [0 @, s
把table转成cell,table的表头将自动被剥去/ B9 Z9 P) {" h) ]" q! E
% table2cell
4 m7 p! C4 [. a/ y) J+ @; L>> c = table2cell(t)6 F, }# m+ ^7 W+ ?  R% v7 F
c = 3 ^, S7 }$ I' ]" D8 ~1 ?
    'Abby'       '508647001'
% p( C8 u* e; d# h8 H    'Bob'        '5086470002'6 h" ~8 x" o! Y" a8 e  g* Y- r
    'Charlie'    '5086470003'

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-2 00:16 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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