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

MATLAB table数据结构(中)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
* T, R/ \. O6 A' e+ I$ a
目录:2 M/ k4 b1 R* a3 @3 P+ }
$ K4 O8 `" K8 f) {+ J8 X# A& b" w
table的操作
" {5 \% U; V% {& L删除行列) h% A( p( \# F. L5 K
添加行列8 l+ U% P' o! e5 B5 J
合并table
( ~  {0 `& y  `操作列数据
5 _& W/ d  C; v排序
) {) E) \4 {+ K6 S3 ~筛选和查找
2 s5 w# R7 o' K" o) n" `0 H( r输出到文件
  t6 n+ c5 I; r1 f0 j' s5 @其它数据类型之间和table相互转换" o& M2 k  B8 Y. Q; L$ e2 y1 f. k
table的操作& |/ S9 T* e9 O3 q+ ?8 \$ J: Y
删除行列
, q; P) d  A  h- D% q删除一个table中的某行只需要对该行置空即可:
( W2 e4 o" J0 H% 删除行
- v' j0 m9 t0 c/ a$ i; }. z" E>> nasdaq(3,:) =[]+ t& w- S. z! H
nasdaq =
! W* J' n% g2 Z3 a0 `0 M    Symbol          Name          MarketCap     IPOYear* }8 `& {" a  G& K* g
    ______    ________________    __________    _______) C; Q0 g) p; s  v: Z

+ O: {7 r2 }( `5 X2 |& i    'AAPL'    'Apple Inc'         '$742.63B'    1980   3 @  `; q1 V" s! ^! O  W1 s! k
    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     1 H% y( m# h$ M; r/ {
以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。& J" F+ b4 v4 }) }
% 删除列
! f$ V2 W) s* B& |$ {>> nasdaq(:,2) =[]3 J" X6 j2 J& U6 z. H% G9 l. D+ I
nasdaq = * N# R6 x8 _; U1 j$ E4 k
    Symbol    MarketCap     IPOYear, q9 w4 V: p+ z: x" p1 Q
    ______    __________    _______
, ]6 B5 u( C/ U
4 N' P. o/ h% n8 ?    'AAPL'    '$742.63B'    1980   1 n" K( d2 S$ W0 K2 f# U: q' n
    'AMZN'    '$173.33B'    1997     
! B0 j* \- V9 ?& }' F  i删除列还可以通过Dot的语法,只需对表的VariableName置空即可2 Z9 q1 u/ m+ |7 @! O8 O
% 删除行) G1 H8 F% f9 U9 W( C4 _: J
>> nasdaq.IPOYear=[]
8 N, B. C6 }. C5 znasdaq = ( k/ h- U. z; V
    Symbol    MarketCap   X) K  A  g( z6 t; @
    ______    __________/ o# r) C' v7 ^

" G; v4 r1 [1 y; Z9 G" H; B    'AAPL'    '$742.63B'& e/ q8 Y0 C2 J8 c# O
    'AMZN'    '$173.33B'  ( M5 N2 O0 s0 J3 I2 A& a4 c
添加行列" U8 Y: a: w4 N% P6 u2 d/ d3 z2 V
沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成
( A1 ]. b6 D9 _4 z6 O: A  L% 添加列, M  T. d8 ~( r* X) P3 I! X
nasdaq.Sector={'Computer Manufacturing';...
' U, i9 i& h5 y3 Z8 A$ a                'Consumer Services';...
3 f* j- q7 ^" d& ?                'Computer Software'}    M. C" s5 b, q) R  W* d4 D! }3 h) w
注意,这里等式的右边是一个列向量元胞,结果显示如下:0 D) Z+ N2 y  \! z, [9 w
%  table新增了Sector列, D+ x0 A8 ~# z: s# p
Symbol            Name             MarketCap     IPOYear             Sector         
) r, O, c4 _. F, a4 h% ?, V______   _______________________   __________    _______    ________________________: V, `, h) V  _$ a1 ]1 s( j8 V' A$ G
'AAPL'   'Apple Inc'               '$742.63B'    1980       'Computer Manufacturing'
4 u6 `( ?6 k# Q$ f" [4 q: p 'AMZN'   'Amazon.com Inc'          '$173.33B'    1997       'Consumer Services'     8 W" \1 P$ Z$ W6 q9 L. [' C
'MSFT'   'Microsoft Corporation'   '$346.9B'     1986       'Computer Software'! t& R$ ^$ s' e7 Z: s2 A2 r4 c4 Z
  
/ `9 N1 v$ N. ]3 f# m5 q7 x: P前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:& F$ Z* W4 F0 e/ @$ Z9 x
% 给table添加行
9 @2 i8 V7 a2 }3 c4 {8 E% ]$ z8 lnewCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'}    8 O4 ]: ?1 q3 U( s7 q3 \
newTable = cell2table(newCell)' S( Y" ^3 r2 P; D! S$ e6 |) g; ?
newTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};. a( w4 g. \2 j1 |' K3 G
newNasdaq =[nasdaq;newTable]  
* l) U5 K, J8 r' `6 W, ^) s( a4 X其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。6 I5 i* w) r6 \) B3 c' m
合并table! c6 v2 G" I6 p& P4 |
合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:/ p9 ~4 _* h1 W
Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:2 k% }* a6 E  a- W
t1 =
/ ?  r/ M, |0 [) {) e; U      Name          Number   3 @4 n* K1 e! ^" X+ J: g) ]
    _________    ____________
3 K$ @; w$ S8 O- K7 R: F3 @1 N+ l, X5 y' o# T# Z: U
    'Abby'       '5086470001'
) c2 ^2 |7 B/ n; U; Z    'Bob'        '5086470002': B  d! G+ {8 }$ @, B0 B
    'Charlie'    '5086470003'  
  T! {* @: ?: Z) E4 b' O& kt2 = 2 T  }, Z8 L8 [* ]: A
     Name         Number   4 I3 H: h# _1 I9 m' J3 K# n" r
    _______    ____________. y3 Q$ F! q  _6 T5 q

0 J  h( _7 g0 j1 q: e    'Dave'     '5086470004': B: E# p) K9 X
    'Eric'     '5086470005'9 A0 i  j0 m3 r
    'Frank'    '5086470006'2 j7 ^+ ~1 O, r+ |) Q. k2 Q- E
横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:0 a" m8 E( m* L, B$ N. [2 ~
% 直接串接table% ?* O# X% E* ~5 O# e
>> new_t =[t1  ; t2]
1 x5 M4 k) @. |; j$ Nnew_t =
7 x! ^  ~9 V3 B) R) p      Name          Number   
: r; F+ N- a9 Q- N& [; E    _________    ____________
; R3 [+ u8 V& V; B& _7 r6 p* }# p: t! s9 J) e
    'Abby'       '5086470001'
$ J  J; c1 D5 d# j4 ?& v* E0 B    'Bob'        '5086470002': ^; D: o6 s: |* H: ~0 w
    'Charlie'    '5086470003'
, }6 k' k) T. f- X" W9 e    'Dave'       '5086470004'1 Y, w, e) X1 s; `& {  ?
    'Eric'       '5086470005'! |" ~& m( [' m& b6 k* }; A* [( h: R
    'Frank'      '5086470006'
7 D" D- H6 _& d4 v% 使用vertcat; C& z2 @' p+ m0 b/ V
>> new_t = vertcat(t1,t2)
7 m5 R- O- m7 U8 v9 F( R, p- Tnew_t = ! {( r1 W- s7 b; c+ e$ n  e
      Name          Number   * H9 ~) K" Z& n' k
    _________    ____________! l% X9 I4 o( _" a( z& a; O# n9 Z" I) i
, p- `7 `# W! Y6 w* o7 a  Y. ?9 E
    'Abby'       '5086470001'3 v1 B4 J# b& S" F" e$ w3 z
    'Bob'        '5086470002'; j( ]  H1 M6 q
    'Charlie'    '5086470003'0 H: q8 ~* T4 P
    'Dave'       '5086470004'' x0 c) w0 Y& z
    'Eric'       '5086470005'
- y4 a: r* S( u2 e* B    'Frank'      '5086470006'
9 |& [) S1 ^9 }" Y4 @图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table
) I7 z1 T* _: \t1 =
5 o& }* _3 i% U; G' T# i' H$ L      Name          Number   
1 I8 H$ R; r, r    _________    ____________5 j! S+ |$ N' A0 `
$ k! s9 b5 s$ d9 P& R
    'Abby'       '5086470001'8 m5 n2 D/ P+ [7 j7 s' k- M
    'Bob'        '5086470002', E; k) K' y( j! k  B! m+ E3 k
    'Charlie'    '5086470003'
- W1 P. J* C! O4 b' H% E* vt3 = 8 k8 E# }* x& z) a/ m5 o
    Office    Building* o8 s4 S; S3 u% M
    ______    ________4 |- K6 D/ m; Y* F# z

$ t3 m+ a! s5 j    '331'     'A1'    " c5 S, Y3 z6 r( ?2 |
    '201'     'A2'   
/ q) K# I+ Q  O& D3 Z: x! H- U* H    '328'     'A4'
8 A" U4 S" }# T$ c横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示9 z7 ^5 t5 Y( A( ?0 U
% 直接串接table
) o5 w5 N0 U& X>> new_t = [t1,t3]& R$ b. N! H2 I8 v3 n9 w
new_t =
! T5 {& @, T: Q1 ]2 m: Y- |      Name          Number       Office    Building. f, z! M: j' [+ x! B. ^0 o' H, l( C
    _________    ____________    ______    ________
7 F" S8 K. `1 K
) X+ t4 }* C5 E: I1 a    'Abby'       '5086470001'    '331'     'A1'   
- s1 T3 W- R% I8 ?+ `* A    'Bob'        '5086470002'    '201'     'A2'    # f* G( j+ ~+ a4 c1 J$ C7 q
    'Charlie'    '5086470003'    '328'     'A4'      , \* G; u7 B: e/ @3 Q: o/ \! h$ O
或者直接调用horzcat函数,如下代码框所示:
# {+ z+ e: N, \) w% 使用horzcat
* l5 i) x) |* ]% r& V>> new_t = horzcat(t1,t3)
  n- G& u& B3 n4 ^# w" o/ cnew_t =
% d- T( B1 O. f  G) K% X* b8 r7 P      Name          Number       Office    Building
: d. ?" T) I) D7 ^) m7 R; C4 g    _________    ____________    ______    ________; a% U/ D9 K1 k! L

  V7 f+ U+ P) ~) p$ s. M    'Abby'       '5086470001'    '331'     'A1'   
3 \2 e( m& ~6 u# H# y    'Bob'        '5086470002'    '201'     'A2'   
4 e7 i/ R0 G; P8 Z0 A! J    'Charlie'    '5086470003'    '328'     'A4'      
+ g8 J5 @: m' }  U  a" s7 B# c  D# @) b6 B操作列数据
/ d2 j# I* K  t" H7 S沿用NASDAQ表所导入的table:
! F% s; L' A0 Z$ N% nasdaq table原始数据; I* O. P+ Q' `1 v2 p: _
nasdaq = 4 R8 U' P/ Y! V/ n: N8 s, s
    Symbol             Name              MarketCap     IPOYear
$ B- Y9 W; Y* J1 c, y8 c4 G# @    ______    _______________________    __________    _______) D$ [; h0 K% ?, H# e

3 V7 S0 ~; ?9 g3 f  p2 D4 p) _    'AAPL'    'Apple Inc'                '$742.63B'    1980   % o; f" A# R8 m) {2 N: X% M
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   9 Q: Y% v! U: Q5 W& }' u
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     : \* E: `; v* {! M3 b0 H) g) ^+ Q
其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B; L! [. z6 p) r2 v' g$ R
% helper函数
: }" X5 y2 [( S$ k8 h% @; nfunction out_num = marketcap_helper(in_string)
6 u" d( U2 A5 K) ]7 h4 \" r7 a  out_num = str2num(in_string(2:end-1));
; _6 d% u5 O5 q; x$ d7 nend  # Q: O4 g8 b% g+ R3 l
然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:
" d: g! F7 [" F4 G# a% 调用cellfun对table列数据进行操作
/ T( ^/ Z1 G+ q8 o+ a>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap)
2 E' T2 O8 v& D$ G; @1 \nasdaq = / w* c0 N- t. F" T, p) R2 L

' Y3 W6 D  u1 M8 w' g0 ^. Q% o    Symbol             Name              MarketCap    IPOYear
1 p0 D" O5 T& U  V    ______    _______________________    _________    _______
& g: I* I6 N) c1 l/ k8 H% O; k# C3 x. Y' Z. x/ o
    'AAPL'    'Apple Inc'                742.63       1980   
' S3 b: }. u5 k1 f, V    'AMZN'    'Amazon.com Inc'           173.33       1997   $ B- O# N4 @" J. Y+ K" S" @
    'MSFT'    'Microsoft Corporation'     346.9       1986     ' X1 l  l, R- s2 e' J4 g
table类还提供了vaRFun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:
9 n' e$ J( d; {, W. s0 j% yhoo的table在命令行的显示
+ [% u* D; g/ k+ }; e4 n* ~4 |) vyhoo =
4 s# h, x" P0 v6 `8 n* M     date       open     high      low     closing      volumn      adjusted
3 ?- N5 K  K1 D: L" f  __________    _____    _____    _____    _______    __________    ________1 B6 [3 s+ L3 i
   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
7 n' Q7 B1 L3 g, T% e/ N* Q   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   
+ a3 I1 v: ^- z- Z   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   : b5 B7 q4 J% g
   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
: F  d0 `  C  z: V+ U. \3 B   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   : c* L8 J1 _' D& e
   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   8 u! g# f3 `# g# J
   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
$ \6 m5 p- X& E% z( o# S% ^, V直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入+ T8 n- d- p) [
% varfun对表中的列数据进行操作* q! x0 w4 a5 Y# t
>> varfun(@mean,yhoo(:,3))* j! w4 _! a! b, M
ans =
. E+ X( Z6 G' o# y3 \. Y6 _, a    mean_high
* j# a5 a4 D( I8 c" D% ?4 ]3 {    _________/ d5 O: y  n2 o+ {
+ @5 {4 h/ j5 }) J
    44.023     
6 Q1 U  M) K- G再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式, B9 x4 w; A( ?( @5 j. X! B
% 变换date列的数据格式; E) g8 k* l4 v! q  ?$ o4 j
>> formatOut = 'dd-mm-yy';
$ b& J) F3 l$ r3 ~. m& @: }>> yhoo.date = datestr(yhoo.date,formatOut)  % datestr接受table输入' A4 P6 o- @" Q( R" `
yhoo = 1 Y0 c: P3 D! v# m
date      open     high      low     closing      volumn      adjusted
$ D0 R! E: R4 e________    _____    _____    _____    _______    __________    ________
: h- F' l* s% E  H2 A' [, O& y' S1 B: ]1 A
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
4 ~/ b7 F2 F  R& Y. D: d  X09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98   & N4 j5 e1 y5 T9 P: H- g
06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44   4 s& j: P4 H3 s5 u3 W9 V) g
05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
3 ?9 L8 k; p+ x04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99   
6 j5 T0 c4 G, m0 V" d/ s  s03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62   + e- y5 K* L  `% v5 j  w
02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11     ' Q& I2 e' s: u; a6 K
有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去
1 E* N$ T0 l8 w% x% range列的数据来自于high low和closing列数据  |2 ^5 I+ [9 Y1 n5 ^" Q
>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing
9 J  E9 v$ K3 |' hyhoo =
. ], Q/ T: K3 T* h' kdate      open     high      low     closing      volumn      adjusted   range  * j2 r4 r6 K+ t
________    _____    _____    _____    _______    __________    ________  ________  y' v3 Z" H+ v
10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68     0.017338
4 }, @  c: d/ @8 P09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98     0.029316
9 Z& {" \: N! `5 d06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44     0.019337+ Q' e! u: w) A- i) _' H# a. S
05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16     0.018342
+ i2 P) f0 @# ^( j04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99     0.054785
, Z! V8 p# K) _/ Z- M2 }, J03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62     0.035899
0 _/ p. g* \! z0 J8 N02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11      0.01655  % ?6 w6 ]* ]; U' q% w! x
排序) c, W* ]) c! L" Q, _4 @- K. q
沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical6 n' |' \; X2 q
% 调用cellfun对table列数据进行操作
# \. ?( m5 a+ z" ynasdaq =
! Y5 ]+ L8 \5 [- d1 |9 V0 F  w    Symbol             Name              MarketCap    IPOYear% I  @& T/ {! `: W5 X% ^
    ______    _______________________    _________    _______
+ h! G$ F1 |9 c
) h) O* z* j# i5 w    'AAPL'    'Apple Inc'                742.63       1980   
: {+ M* j7 |2 P. a2 ?% s    'AMZN'    'Amazon.com Inc'           173.33       1997   
4 S- _- w6 i9 `/ g$ x% ^8 k" m7 h    'MSFT'    'Microsoft Corporation'     346.9       1986     . o; }8 n: H0 Y
现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下
, e% y8 B; U+ c: s. P% 根据MarketCap列数据进行排序
, s9 a( X0 _, f& q' @- y- f1 d>> sorted = sortrows(nasdaq,'MarketCap','descend')
1 l  B8 k$ `4 F0 j% ?. c, Wsorted  = ( `* W7 n. `& |4 }$ O
    Symbol             Name              MarketCap    IPOYear
% J/ X1 U" ?! E- M4 N, t* u    ______    _______________________    _________    _______
3 l3 U  X7 u4 o
/ s3 y4 m! |& x6 p% ]% S2 n    'AAPL'    'Apple Inc'                742.63       1980   7 \6 l+ `; {0 P8 \
    'MSFT'    'Microsoft Corporation'     346.9       1986   9 O: X# b6 ~6 {9 P; c
    'AMZN'    'Amazon.com Inc'           173.33       1997     : i) Q+ G: ], s8 p/ a
筛选和查找
+ t7 O& Y2 `6 Ytable的下标也接受logical index, 下例选出所有股票中市值大于200B的股票
9 s( ?/ z9 F" M8 f) s8 w) t& S% 筛选) X; b: H  H) ]& q& [7 I7 C" Y. U
>> nasdaq(nasdaq.MarketCap>200,:)1 H: R/ J! p8 I9 Z
ans =
1 P) L7 w5 s- g: i+ m! E- \, \    Symbol             Name              MarketCap    IPOYear8 \6 z8 s3 ^2 U, x2 Z3 {$ i% N
    ______    _______________________    _________    _______
) U: k# j; O8 o0 ]# f" e5 W( a' k
, B; s: |2 f$ W1 n9 Q/ j0 I    'AAPL'    'Apple Inc'                742.63       1980   
4 `; l: h4 H2 W( L6 l3 h4 ], F/ ^- D7 I    'MSFT'    'Microsoft Corporation'     346.9       1986     * A1 b! m+ i9 j0 B
如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票
& Q6 z- Y9 H7 w9 @6 P% 筛选$ u; u1 {! K% a$ j
>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:)8 D4 f. x4 f/ u
ans =
; h5 Y: R. y( P5 z' D* z  M    Symbol             Name              MarketCap    IPOYear
4 ^0 J/ x& {2 T* y. i& N    ______    _______________________    _________    _______) P5 k( k: P' G2 l
1 Q% }; y! j) t$ I1 I  @
    'MSFT'    'Microsoft Corporation'    346.9        1986     % v" m, ?  C! Q' Z8 S) g
logical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据
6 w3 Q1 }5 P+ o$ s% 查找
8 f' O  [+ q' A  R. q>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:)( v* J8 W3 i* A. d) ]
ans = 5 ~& p4 j4 y* H* v3 f3 @
    Symbol          Name          MarketCap     IPOYear. y" W! E2 m. o4 n' q
    ______    ________________    __________    _______
2 L$ M  p) ?8 }0 F' s    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     3 l. E3 i0 v( d# O7 X
输出到文件
7 L5 |% v+ c. b! j和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable; x( R% G- x" X9 L  Z
% writetable
1 n' e0 ]8 L: }8 S: g>> nasdaq = readtable('nasdaq.csv')
5 c( M2 a! k& J9 d>> wrietable(nasdaq,'mydata.csv')   
; z* b) y$ ?; W! a2 J) ]9 Wwritetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号
" k7 ~2 b  w2 J( z% 指定分隔符
6 e8 |) R# i+ hwritetable(T,'mydata.txt','Delimiter',' ')! _2 |5 O. u9 D! {- ^
结果如下
1 D# L+ ]4 L. _) S$ s% mydata.txt
6 M" k4 Q- ^: x- d9 @, `4 ySymbol Name MarketCap IPOYear
% l& \8 S  B# Z1 ?/ EAAPL Apple Inc $742.63B 1980
; I& @0 N3 g! _  k$ o, DAMZN Amazon.com Inc $173.33B 1997( I4 V5 ]6 S6 R- g2 S2 H: `
MSFT Microsoft Corporation $346.9B 1986  
( K% [3 p0 D/ A. B其它数据类型之间和table相互转换
3 k; \! S( f7 t; D% C! E7 RMATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:
8 ]/ ^9 D/ G% [7 X# fFigure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:6 [- Q; ^+ F: H: I! I1 K
Table.1 美元人民币换算表! z3 n% m, i( o% B, S. k! B
- A, K/ m: H% z9 n" i% s# b
USD        CNY
* y  B; U+ J, S! j1        6.21
/ D2 H) z" s. H0 T3 j, k5        31.03
3 o. V! m( b) z. h' o10        62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置
5 R: r# l! E) h# I% n7 Z% array2table! k0 n" V/ k- J; K3 Z/ X' w; B! @
>> a = [1  6.21;5 31.03 ;10 62.06 ]- _0 R5 f$ H2 Y7 C1 j; U2 `+ q
a =7 B+ i5 a' s, W( ^2 Z
    1.0000    6.2100
; U2 r! I2 u$ E, S  S    5.0000   31.0300
. j7 o2 `4 d! X; I   10.0000   62.06006 D- u) ?8 }# M: Y5 @% q, a" v% v
>> t = array2table(a,'VariableNames',{'USD' 'CNY'})   % 通过VariableNames提供表头信息& h6 n$ M! f  @% M1 p& S6 _9 I5 L
t = 8 M9 O( |9 U! d* m% Y+ w
    USD     CNY 5 ]5 R. Q2 `* M$ A# U
    ___    _____0 n: Y+ a0 \% X$ ?' Y9 G1 K) c
     1      6.21- |4 H2 T$ O. q7 p+ u: d% o8 w; k
     5     31.03# [. S, z) f! ]' o
    10     62.06    ! B7 x5 I3 B9 V: V/ Y( e
  
' E/ H1 M& E/ c+ }  ~, a如果把table再转成array,表头的信息将会被剥去
+ p0 R# a0 s' e7 g8 ?5 i- E% table2array8 `0 Q* q  y! f/ C, W
>> ap = table2array(t)4 R8 }/ J1 X/ ^/ H2 s
ap =( |" p& _0 o) s" t6 j5 |
    1.0000    6.2100* T$ X2 ^, d& r
    5.0000   31.0300
# A8 J1 ^3 w' @, @   10.0000   62.0600  # e7 l7 J, C1 q% E7 ]' I8 ?
操作如图Figure.4所示:% ?% F, N2 V2 M! x* k. v  u
Figure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。" Q0 T% c6 X% A8 s. a# w8 F8 k
% struct2table6 P( R! s) s% U
>> s.USD = [1 ; 5 ;10];' C' q0 s) w5 n* {; @* X) b
>> s.CNY = [6.21 ;31.03; 62.06];% y' E/ U2 R' u* }  c
>> t = struct2table(s)      % 输入s是标量9 T/ }- e8 q* p" }1 u* t
t = ' ^% q7 ^! R4 z: N
    USD     CNY
% \' n2 z7 O, @6 h9 V  k! F. r4 h    ___    _____
+ F, }' q1 h# A9 K& n8 r8 J1 D1 c     1      6.21
8 y0 }/ [- R; v" C( S  J/ a     5     31.03% h  l5 n& O' Z$ W3 [( P
    10     62.06      & v# B/ t5 |0 E$ w
      m: l$ `+ o9 ]( S
struct2table还接受struct是非标量的输入0 H; @' O: T- ^* L
% struct2table 矢量
6 k, ]3 ]4 S7 n% Es(1).USD = 1;- P, Y2 H  \! c) q' s. Y- F- i
s(1).CNY = 6.21;
3 j4 Y" }5 s, z! v! Gs(2).USD = 5;( O( w! r5 [: C: K/ J
s(2).CNY = 31.03;
4 G* o8 f- [$ ^6 d9 L  u: ts(3).USD = 10 ;
- b5 i! u3 J: s' o& m. R3 r& os(3).CNY = 62.06
! O, r% E2 R& r
3 p; z1 D+ K+ W, v/ s
  k1 t( y8 h) o( k( C' P% 输入s是矢量
2 }2 V/ C7 A( P, F; Xt = struct2table(s)% q8 q. `8 m4 R$ I! y$ A
" g- F" V0 p. ?
7 B- N3 y3 A' ]& r
s =
1 h1 T7 [8 f2 K& x% _, B1x3 struct array with fields:
8 @& e% X9 Q) C4 H& q( q9 x    USD( d( w: S  Z4 P5 m
    CNY
- E7 s/ Z+ M; s- {% J' g. ]1 \t =
9 Q. j1 H( i8 V9 G  C    USD     CNY 0 L$ O5 U2 u9 K2 Q) k' E% d" ]2 |4 U4 s
    ___    _____
& M+ z6 r; e- B# K, y9 m     1      6.21
  y: p3 N' [% W) A8 n/ m     5     31.03
$ @" D6 {1 |3 D- f    10     62.06
* A. r5 t1 ^7 ?0 e2 B把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。8 N0 V1 d, s% i  A& O
% table2struct6 \! e& R" w+ h! S) S
>> sp = table2struct(t)  % non-scalar struct 0 |1 w. c' B) H/ f. o6 s
sp =
( S) y7 U; @$ M; [3x1 struct array with fields:
9 l( D2 f" w8 S; s  C. Q' s    USD
' M5 ?7 J# n5 s1 |, ^: J# l    CNY  1 u0 y( O' T8 u) H! |
操作如图Figure.5所示:
- O: t9 e/ D6 x% F% `. L# yFigure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。- q5 Y1 }! ?, L" E
Table.3 电话号码簿
$ P% a$ N% z; R% ?& B1 j
" |: |% ^& |9 c2 a. Y姓名        电话号码
1 q3 H3 r' A& Z& NAbby        5086470001
2 T. q/ s) H: y& F' QBob        5086470002
+ W) h# r' k* _8 YCharlie        5086470003
9 N& |0 m6 _4 f1 H: ?c = {'Abby', '508647001';...# D( E. R% ?6 t) m5 A
     'Bob','5086470002';...' `* ^3 [" p& P  V% C
     'Charlie','5086470003'};
1 H- q5 K# `+ _$ d. vt = cell2table(c,...
) Z+ X! g( ^: M% U" D 'VariableNames',{'Name','Number'}): A8 {) \$ S: D. J# Y9 L+ G

1 Q8 t% p. w% g' e& i4 P& e- C; S1 W# U' v9 O2 Q
t =   r4 t% b7 m$ l: X7 Q
      Name          Number   
4 w  y# j/ s- R/ r- y' s! Y    _________    ____________5 M- A% s. a6 y/ E3 K
    'Abby'       '508647001' # b& K) i; j6 S8 r7 x  R# x
    'Bob'        '5086470002'4 u" w5 a: P: S: @. C
    'Charlie'    '5086470003'3 C) n# ^% J9 l8 S- G  P8 ^
把table转成cell,table的表头将自动被剥去
: k9 F0 w. M" D9 ?) U! n% table2cell: }6 h4 B# t5 q  A. S! v9 @
>> c = table2cell(t)$ p0 S! J: A6 [* R7 ^
c = % ~! S$ G/ G8 g, G+ m
    'Abby'       '508647001' ! N' F% f& h/ L; W& H
    'Bob'        '5086470002'
+ J9 W6 E6 X2 e    'Charlie'    '5086470003'

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-1 02:12 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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