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

MATLAB table数据结构(中)

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
' |9 v' z3 R( T- \$ u6 m
目录:
3 T* n9 o* E, k5 f2 F$ J2 K# L
; P' }8 E4 P0 Ztable的操作
- Y" X2 R2 B2 L删除行列
6 @' b% D7 `" q* C添加行列5 f# G$ R. U& V# V
合并table
/ Z9 Z0 t$ u3 A操作列数据
7 }# `' _3 Z  P+ Q- R" w* @排序
; |. S( u) C( c筛选和查找
$ q  j- X; P/ j4 a& a5 \2 `2 M1 a- t  ]输出到文件
: j0 j0 r6 R" J其它数据类型之间和table相互转换
$ t; B( D; l. t4 _table的操作
7 f9 c- T$ Z; u1 {; r  S' D' F删除行列
3 [$ |) r9 L7 Z! w3 U7 [% q删除一个table中的某行只需要对该行置空即可:, {6 d/ ]9 Q+ a/ m) X9 q2 t
% 删除行
" O* X+ h; D0 Z9 m, l" A>> nasdaq(3,:) =[]+ \4 q4 S# S6 @" l6 G7 x
nasdaq =   B9 j; I( @; ?5 L* C
    Symbol          Name          MarketCap     IPOYear
. Z: d9 ?( ^' o) k8 A" q    ______    ________________    __________    _______
: T: l, I5 v0 T! P% h0 l, G) Z2 r7 C
    'AAPL'    'Apple Inc'         '$742.63B'    1980   
! y* p0 L9 }3 M* ~  j    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     
# |6 E4 \+ v: F+ ~- ]1 G1 U4 v9 A% E以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。$ \% n0 c: G0 q* c; _" G  z
% 删除列1 @2 d' q6 y7 O9 j+ r4 E. I& ]" r
>> nasdaq(:,2) =[]
  ^, ?9 j* z* z1 K' ?$ rnasdaq = # ]' U. I5 D5 f7 V* P0 N4 Y
    Symbol    MarketCap     IPOYear
$ ~7 w4 B7 Q5 [' ~    ______    __________    _______
( P6 z0 D  y% E, k5 Y
1 R% z5 J# {$ ~+ U- Z  E% ^& d    'AAPL'    '$742.63B'    1980   # ^1 A- X, u1 N- E
    'AMZN'    '$173.33B'    1997     
/ s( P/ g! b+ l8 f; K1 u删除列还可以通过Dot的语法,只需对表的VariableName置空即可
* N; |5 @/ @# D/ R* k. f% 删除行
8 n) f* h( Q1 N) Q6 S>> nasdaq.IPOYear=[]  q# b& p6 N9 F1 A/ E
nasdaq = 5 T& V1 o4 N$ L; m  \
    Symbol    MarketCap
9 \5 T4 C) e) A* U6 z- G( W    ______    __________
0 w8 r" V# S7 T: m
' P" N- O3 o' O! A. h: R' [: a. c    'AAPL'    '$742.63B'
# S# M5 G3 H# b! _" x- {' l& H    'AMZN'    '$173.33B'  
0 S+ t2 I) u  L( q添加行列+ v! m8 o0 v- a; _# E: O' Z
沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成
1 ~9 u2 j; j) h4 S, A7 s% @8 }+ _  I9 a8 S% 添加列
: m# L/ _! X9 A" g$ |! g3 inasdaq.Sector={'Computer Manufacturing';...' X/ {1 r- J9 T$ I1 P& r
                'Consumer Services';...
* P4 @+ r) `9 H                'Computer Software'}  
$ b$ i' |+ u* I0 F! z: c注意,这里等式的右边是一个列向量元胞,结果显示如下:
1 T0 E; r, E0 c3 l& s0 W, i4 N%  table新增了Sector列4 x: o& B8 f% R
Symbol            Name             MarketCap     IPOYear             Sector         ' g1 T5 ?) E2 r+ `9 R2 I- ^% w
______   _______________________   __________    _______    ________________________
5 j. U9 [# o! @; B2 ^ 'AAPL'   'Apple Inc'               '$742.63B'    1980       'Computer Manufacturing'# f3 ^5 c! }, F4 q0 L2 y: i: c
'AMZN'   'Amazon.com Inc'          '$173.33B'    1997       'Consumer Services'     
; i7 |* f& p9 K+ g4 [! g 'MSFT'   'Microsoft Corporation'   '$346.9B'     1986       'Computer Software'
6 F- o6 u9 `5 e8 U0 t+ a* V  6 G8 L  u0 a, l3 X' |9 F0 `6 K. ]3 n3 v
前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:
1 k6 h. G1 b% b6 r, T9 h% 给table添加行/ W: c: Y' s# O! L) x( `
newCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'}   
. Z4 @; s) a3 D9 _newTable = cell2table(newCell)
# J" U, g6 Z5 O6 u0 @newTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};+ Q6 i8 _* C' s0 g. h: g
newNasdaq =[nasdaq;newTable]  
3 S3 N" Q" ]& Z- I8 l. r0 X其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。
5 u0 c& `) G+ K$ G合并table& T9 F/ f/ W  t7 e) L5 S5 m4 Y
合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:$ Y7 K) \' Y' r5 p! E
Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:
4 p5 K- l/ O) i1 _9 {2 T* X0 Ot1 =
" S/ F$ h9 q9 R; D% F4 {. `5 ]' o      Name          Number   - n4 j" q3 e, c
    _________    ____________
0 d  R) e" I2 Z" K# G2 z6 v' V
8 t$ t& f' x8 U$ J( i( D& U+ y    'Abby'       '5086470001'0 M% u: D. H8 _) P0 H+ v# v5 T2 C& \, G
    'Bob'        '5086470002'
3 u2 Q: f- u3 b% D5 w% H    'Charlie'    '5086470003'  
( M: R5 J$ A  m6 `/ |t2 = ' c5 N% m. w) @* b( T4 c
     Name         Number   6 }9 l, i% ?) d+ S- D
    _______    ____________
. e! l- y# H+ C$ e2 A0 e9 P5 H+ D" V5 l1 ]( b7 ^
    'Dave'     '5086470004'
- _2 `3 j2 s1 V3 |) s8 E    'Eric'     '5086470005'
0 j+ [0 ^1 A. x! S1 M    'Frank'    '5086470006'
( W( Q8 s; a1 l横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:
, A# ~' Z( n6 }( c; K  w# T% 直接串接table$ F- a' m/ ^8 X" }
>> new_t =[t1  ; t2]
6 _: I- C1 ^: p% h. X$ o$ {( @new_t =
* k+ n' n4 n. _      Name          Number   0 a& b! A% d( b. u! Y2 G
    _________    ____________6 ^- t) r2 b/ T& l) m: X
. Q2 k& ?8 q4 P4 M# }" X1 a
    'Abby'       '5086470001'3 H" P, O4 k! Y6 O/ Y. f  L! Q
    'Bob'        '5086470002'; b  t5 i" r6 Z! b2 N, X! T* i
    'Charlie'    '5086470003'
; s. u+ e" n9 h0 B. p5 V    'Dave'       '5086470004'( y6 K" H9 {( C8 c6 b- @, t$ M
    'Eric'       '5086470005'
6 E# `& K& W% X) R0 g  h, E6 `$ F    'Frank'      '5086470006'7 ^; s- J" i6 d, {& Q
% 使用vertcat  P1 ^) M! V- h7 M* }
>> new_t = vertcat(t1,t2)
: G+ g# Q, i, a3 r! V$ znew_t = 3 e2 d8 q! K9 `" U5 C  Y% p
      Name          Number   
2 I9 h0 y; O% I) D    _________    ____________
8 v. x- A( j9 x2 V! y+ ]
5 b2 X1 J. o( ~& T    'Abby'       '5086470001'
- v3 g3 J( s8 `2 h; K1 p    'Bob'        '5086470002'
- Y: G' @, j; u. z! k4 P    'Charlie'    '5086470003'9 d& t& T! V/ h2 z
    'Dave'       '5086470004', y- }2 j( w6 n/ [+ ^! ^7 t) N4 Q$ m
    'Eric'       '5086470005'# r! Y! `/ S3 p! ?1 I/ G; l
    'Frank'      '5086470006'
* O% {- s  c7 E6 V* Y$ H* ~5 b图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table" u. ]& B- k* b& I( W( {
t1 = 6 R+ t$ R/ B$ N4 S; A4 q
      Name          Number   
/ Q8 V1 A% F* R7 t3 U1 Y    _________    ____________
2 U$ t2 ]; g4 Y$ x; i0 M% f( r4 l! W+ i
    'Abby'       '5086470001'8 B$ K" Q6 j! a" \! j6 Y9 h
    'Bob'        '5086470002'
: }/ C2 U5 L, |# g$ r$ T7 a    'Charlie'    '5086470003'
; B# F4 K6 I8 {4 M: G2 }t3 = 3 w  n9 Z2 F, A
    Office    Building
! `" s7 U& O# @, }5 |    ______    ________
1 t/ x* I  ]% t, p% J$ j; K; m3 G! ]$ Q
    '331'     'A1'   
1 ~7 V9 w/ K6 C" z. Q, p9 ?2 h" j: _    '201'     'A2'    0 R1 ?/ f; q+ I. s$ Y: \- ]. Q. {0 q
    '328'     'A4'
# @- R' t: B7 Y: R0 u横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示
( C5 F0 R3 Y% |) R% 直接串接table
8 p4 G, E- y) c( O>> new_t = [t1,t3]) b# {8 z- d* M+ z+ |) b" p& e  A
new_t = 7 V: L6 k) I6 P5 q" B" K- y
      Name          Number       Office    Building0 n; }2 f4 q, W! b' ~1 r
    _________    ____________    ______    ________
& j6 `: I5 G) L
6 d/ Y1 D4 R& x2 ~% b    'Abby'       '5086470001'    '331'     'A1'    8 v. R6 F4 M( g5 b+ e- |) t
    'Bob'        '5086470002'    '201'     'A2'    : R! L9 i" t6 @8 m
    'Charlie'    '5086470003'    '328'     'A4'      
% `/ U9 K% [, ~1 m* H或者直接调用horzcat函数,如下代码框所示:, t* M% |+ G" Q! d$ Y+ L$ w
% 使用horzcat
) u; P9 ~, n. \8 \- O' r+ r>> new_t = horzcat(t1,t3)
7 W0 Q( ~  k3 O' m) d- tnew_t =
! c3 F+ G) p7 {) ]      Name          Number       Office    Building
  T4 c+ _8 j; Z) ?    _________    ____________    ______    ________2 |6 I- Q; G+ l/ C  `5 D9 ?

5 t8 u& U/ F- q8 j4 J+ g; h    'Abby'       '5086470001'    '331'     'A1'    " [/ a" Z# ]: q! x/ W" R. S4 |- j
    'Bob'        '5086470002'    '201'     'A2'    7 h4 I0 l/ l/ N) T: S; ]/ j" U
    'Charlie'    '5086470003'    '328'     'A4'      6 U! {. I' k1 ?: }4 g% F" f0 o
操作列数据/ F  z" b; d  x+ Q0 o
沿用NASDAQ表所导入的table:& `6 ^  N+ m* h
% nasdaq table原始数据
9 C/ ?) `8 M1 ?0 Z* P) Mnasdaq =
2 ~) I0 O* h4 X0 Q" p0 c" |6 n    Symbol             Name              MarketCap     IPOYear" w% |1 r4 ~% _4 X
    ______    _______________________    __________    _______; `+ c# X1 t3 ?
, c$ h5 p/ H% `, Q
    'AAPL'    'Apple Inc'                '$742.63B'    1980   : T9 g7 L" P1 j+ s
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   ) V+ T, f% o  Q" u+ f. C
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     1 O% _1 |) D) e3 l8 m8 S
其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B6 K6 t" i" J3 }$ q# x
% helper函数- Z: d4 ]8 J; ], W" N" W2 ~( L
function out_num = marketcap_helper(in_string)
5 O; I1 s5 D, |4 j% r8 v1 }  out_num = str2num(in_string(2:end-1));
! A8 Z, f  @$ ^' b2 Nend  
$ V' b& f9 H8 Z然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:! ?$ X4 A6 J; s% \; Y3 \
% 调用cellfun对table列数据进行操作
$ V+ T* N+ p3 T9 i: Y( [6 t# d4 G, P>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap)+ {& e; ~- u9 Q
nasdaq =
, \: Z' ~3 \' ]) u
) n6 ~' W8 P5 Z1 c    Symbol             Name              MarketCap    IPOYear
5 F7 e0 ]% O9 A' {1 x( ?2 D7 W    ______    _______________________    _________    _______
! k6 J$ _$ a8 a' x
% ]; ?" I0 L+ ^2 q    'AAPL'    'Apple Inc'                742.63       1980   6 ]4 m! D, _0 d6 ?3 f, S# H1 M! |$ q7 j; q
    'AMZN'    'Amazon.com Inc'           173.33       1997   $ H7 i" n8 @+ Q+ @$ p1 D5 @
    'MSFT'    'Microsoft Corporation'     346.9       1986     
8 t6 X3 L8 h7 A  i+ ztable类还提供了vaRFun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:
& U. J# q7 q0 D$ D+ B4 U8 {5 U% yhoo的table在命令行的显示
2 k6 p+ ?" C, `2 U  Dyhoo =
9 a& V* H+ |! ~7 t: z3 ~  m+ U0 I     date       open     high      low     closing      volumn      adjusted
5 M% u% q4 }: {) o/ W! d  __________    _____    _____    _____    _______    __________    ________; N" E% w" U2 M5 ]  L
   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   8 p' i& b1 z/ |: x4 ?1 u6 w
   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   
9 _8 ^! t% r9 S& Y9 J' z# U# P   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   
7 o1 `. K! S3 \2 w8 z8 N   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   , e& g8 L, u: i. o- {* B
   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   
( E# a. R7 j! `" p   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   / t6 o6 \/ x0 |' b) w" g
   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     ' {2 T2 Z8 ]+ C* S: p2 `$ j; l5 R. t% L
直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入
( v3 m* g, f- m0 |% varfun对表中的列数据进行操作
. @9 u  D! x! q* A) f>> varfun(@mean,yhoo(:,3))* g- y  V' Q; R/ T/ J* T1 _/ }1 ]
ans = " d) r) Q; W; P3 I1 H% d1 a) @" S
    mean_high
: ^& N) Z, G* U* W- D    _________
/ b! S4 b1 X2 J5 d1 [, z* I* z" j2 B
    44.023     
2 o& q- k) P( G' m8 P9 _再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式$ v1 a7 ]" I; W
% 变换date列的数据格式
# f" [& }5 s9 `+ B>> formatOut = 'dd-mm-yy';
% C- }3 J8 a' D+ v>> yhoo.date = datestr(yhoo.date,formatOut)  % datestr接受table输入0 \& _5 @' R# F& N# b5 Q2 Y
yhoo = ( Z, z3 n3 P$ c6 T9 W6 M* S  z
date      open     high      low     closing      volumn      adjusted
: I2 U2 G" q( N4 l+ }) u* N( \________    _____    _____    _____    _______    __________    ________; `9 ^5 s! v3 @/ K2 u; |  \0 U

" }6 s, `+ c0 D10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68   + S5 \* O% M! V9 @8 G' j- v* G
09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98   * ?6 z2 v7 O9 K, Z, V& x6 w
06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44   + l) R; ~& L4 X& }* A' m
05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16   2 b' h; \( U; a4 G& m3 t% |* I
04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99   + S/ C1 o( g2 S6 V+ b
03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62   
* @& h6 V; D4 Q5 b" Y( w: g02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
+ G7 p/ J! [3 @" Z有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去, E, `. t: A- w* `, z1 a
% range列的数据来自于high low和closing列数据
- D7 X: _# Q+ Z% S9 _>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing
" H7 O/ j7 ]( A* E" W+ T- H, ~yhoo =
5 ^9 i3 z) u% s! E$ r9 qdate      open     high      low     closing      volumn      adjusted   range  8 c, t4 [6 a# l; k% _! q$ X
________    _____    _____    _____    _______    __________    ________  ________
( C' l8 q7 H9 {2 d$ O. V) i, ]7 z10-03-15    42.57    42.92    42.18    42.68      1.0601e+07    42.68     0.017338
6 P( i1 a) s- u5 k( Z09-03-15     43.6    43.93    42.67    42.98      1.1802e+07    42.98     0.029316
* }. F( c% [& Q+ S& @06-03-15    43.98    44.24     43.4    43.44      1.1888e+07    43.44     0.019337
* O) R" [0 J( f7 j: N! h05-03-15    44.18    44.31     43.5    44.16      1.1868e+07    44.16     0.018342+ n* g) }8 B, |( a1 C- G
04-03-15    42.08    44.38    41.97    43.99      3.0099e+07    43.99     0.0547853 N3 j; m! }6 n# u+ M2 `
03-03-15     43.7    43.95    42.42    42.62      2.2392e+07    42.62     0.0358992 |; l8 C* o7 Q; G
02-03-15    44.06    44.43     43.7    44.11      1.1027e+07    44.11      0.01655  
) L/ g# M: Y6 K3 G; T排序! E9 y6 ]4 y# K* N5 a7 a
沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical
9 ?  z9 ]7 m5 F4 o- z4 O& `% 调用cellfun对table列数据进行操作
8 ]" {* ]6 S' w/ n( X) _nasdaq = + k' T/ W6 ]2 P$ O
    Symbol             Name              MarketCap    IPOYear
2 K0 f6 \3 ]' b    ______    _______________________    _________    _______4 V/ y0 w# k- s; q8 a* H. `" R
2 v. U- M4 ^" i9 X& j1 N7 T8 J0 L
    'AAPL'    'Apple Inc'                742.63       1980   2 s3 o; T' e- e4 A5 k+ {
    'AMZN'    'Amazon.com Inc'           173.33       1997   
7 ^! ?6 R1 L8 A* V    'MSFT'    'Microsoft Corporation'     346.9       1986     
# v! j# y3 j' k) t! g% E现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下$ y+ n3 P8 u* h, k
% 根据MarketCap列数据进行排序
+ r" E( N- g# I, S>> sorted = sortrows(nasdaq,'MarketCap','descend')$ q6 Z1 w4 B8 Q, S
sorted  =
/ H+ g* L* _* b4 X/ ~    Symbol             Name              MarketCap    IPOYear$ p  `8 l9 D5 X" f- w. t
    ______    _______________________    _________    _______
- @) e( a6 j3 a* U6 W$ x
: `2 n6 l7 q) S+ C# V( ~: n    'AAPL'    'Apple Inc'                742.63       1980   
' P3 S4 _; H" ~& U7 b, _9 m  \    'MSFT'    'Microsoft Corporation'     346.9       1986   $ D, c. s& V, ?! N/ \
    'AMZN'    'Amazon.com Inc'           173.33       1997     - S- X- Z) e7 J& _8 L% N& y
筛选和查找1 h4 }- u5 j- M! R: q7 D6 u
table的下标也接受logical index, 下例选出所有股票中市值大于200B的股票" G  J. F( o; [" S$ q' @3 ?4 P
% 筛选8 Y9 Q. p6 r! U& z
>> nasdaq(nasdaq.MarketCap>200,:)
& W' M( [2 h) s4 s7 O7 X( f4 qans =
, W: Z. |4 w* C, k/ b" M6 x    Symbol             Name              MarketCap    IPOYear
4 `+ K: O/ V$ _1 R( J- Q9 ~- ~    ______    _______________________    _________    _______* h9 C2 s( g" V: E6 c3 j0 `

- e; a# A% N: \. |+ }7 y    'AAPL'    'Apple Inc'                742.63       1980   * o" [) P$ [* I% q# L
    'MSFT'    'Microsoft Corporation'     346.9       1986     
$ T$ w. v& z  l  B如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票
; l8 E* E0 R; a& S! l! ]7 m1 j% 筛选- `+ g; [0 K( S" Y7 u( x6 T. f
>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:): B: x. s$ [6 ?) u( O8 n3 L/ w. U. l
ans =
. o; W$ u/ p5 G    Symbol             Name              MarketCap    IPOYear
; w+ O( M5 n- {! F$ p. G    ______    _______________________    _________    _______: m; `* X# U7 i3 E6 i3 q0 i

; \: M* f  |  T    'MSFT'    'Microsoft Corporation'    346.9        1986     
& N! N9 F" \" p5 Flogical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据3 o0 J- B4 d# C, _( B6 X7 n+ d
% 查找& I7 h8 Y+ x2 A: n  Y
>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:)
# |+ h! t( E  L- m& v, [ans = ) D2 [) }, _3 @
    Symbol          Name          MarketCap     IPOYear" X: F; g4 H# i1 \+ i+ m3 W
    ______    ________________    __________    _______7 U$ {2 R, u. c
    'AMZN'    'Amazon.com Inc'    '$173.33B'    1997     # P, w- c9 _; F9 i4 f8 T' ^9 u) ]
输出到文件
$ X0 Y; \' @- I和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable
! H$ y7 G1 x: ?% writetable
8 H4 d( n7 V+ J5 P>> nasdaq = readtable('nasdaq.csv')
7 g- ^7 d/ B/ w. A( ^5 P>> wrietable(nasdaq,'mydata.csv')   
6 [3 g) Q  [3 o" L$ \writetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号
- S$ W: m8 Z: B$ @& W! f, y2 Q% 指定分隔符# L! {) N+ {* Q3 s# Y
writetable(T,'mydata.txt','Delimiter',' ')
0 D! [  R/ u! h结果如下" n* Q2 p. D) M" L' E; i
% mydata.txt" z3 J* A; E, }$ n3 ]9 g( U
Symbol Name MarketCap IPOYear9 q+ K7 `$ Q5 U  n
AAPL Apple Inc $742.63B 1980
1 @# C2 M2 B* D) d% JAMZN Amazon.com Inc $173.33B 1997
) ^$ A) r! S7 }# f  _MSFT Microsoft Corporation $346.9B 1986  : v2 J+ W$ }1 @( T: y# |
其它数据类型之间和table相互转换
: z) `' ~) e# F3 bMATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:( {) H1 V( M3 Y- a& A4 ?& X
Figure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:
/ _/ B! D4 k, r! R: I' LTable.1 美元人民币换算表
) U4 @+ W! j4 T/ P- B0 ]; V0 X3 @
& `2 v# ?2 G  e: j4 {1 w& oUSD        CNY+ Q. R% I) O& l+ K
1        6.214 k6 y7 |' h" c" x; r8 u% S- U
5        31.035 c) Y* Y4 |9 Z1 x
10        62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置- W( \, {% i' g1 ^2 e: j* x$ q8 r' S
% array2table
: b$ m2 m3 E+ r- t7 X  q>> a = [1  6.21;5 31.03 ;10 62.06 ]
, |+ n9 C- x& @4 a# Ya =0 q2 ~" N4 c, Y5 s* M1 Z: Q
    1.0000    6.2100& Z' m- |) V5 d1 I1 C4 T' B, Z
    5.0000   31.0300
/ U3 R+ G5 [; P. b   10.0000   62.06000 D, J6 S$ y* t* X3 h# ~5 T' v3 a
>> t = array2table(a,'VariableNames',{'USD' 'CNY'})   % 通过VariableNames提供表头信息
. w9 @9 i5 s* O$ S$ c3 u4 at =
+ u* G0 B; ~2 f  m) `( D    USD     CNY 8 A2 @& N0 Z& s
    ___    _____& A3 ^* h" E, m3 y9 N' J
     1      6.21
& m% _+ U: l8 R' b% J* O$ w     5     31.03
+ U% Z) j( r  q7 O/ E% k2 l8 V    10     62.06   
4 x# G% G: M8 |  ! z5 a3 S" u+ E# m; a
如果把table再转成array,表头的信息将会被剥去3 t9 ?: \1 ?! F& C0 k+ v% j
% table2array% |9 ]2 G& D+ Z. u2 Q) ]8 B
>> ap = table2array(t)
: M$ a2 M0 p# G/ v; P( Hap =
$ F. M' r9 d- u! u+ U    1.0000    6.2100
! t& F( `4 t& ~) a3 W. f  X9 f+ M    5.0000   31.0300
( ^' O6 B. n5 v$ W   10.0000   62.0600  
0 m9 n9 r! n) U- {+ N. u# |操作如图Figure.4所示:9 Y% u  g; g, |  `" l2 ^9 r1 |
Figure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。
# I. q' _9 c+ R$ U! w% struct2table
2 g6 W8 A: [* g4 f/ f2 R>> s.USD = [1 ; 5 ;10];
$ G! v  q4 U' i6 k4 h$ p9 K>> s.CNY = [6.21 ;31.03; 62.06];* X9 q  A* A; g+ j+ w1 J
>> t = struct2table(s)      % 输入s是标量- d4 l6 N- g0 W' @
t = ) m. P9 k$ w' E1 b+ o/ V
    USD     CNY 3 n4 ], n/ u6 N' Q7 r
    ___    _____3 H; p$ y0 w! \6 e
     1      6.21
0 c% T- N- t0 o1 g  c/ A7 `     5     31.03
' ^# M( O( z) u    10     62.06      9 n. L: o! [; z9 w$ Y4 z8 n
   
! q) C. l, I. G: j: n' X" ?) n4 ]struct2table还接受struct是非标量的输入4 X4 V; B0 x0 l  m$ o- t# ^
% struct2table 矢量
" L) r! L" W% Y! X6 q+ s3 as(1).USD = 1;" T& u3 a  P7 n/ `- b- ^7 V
s(1).CNY = 6.21;
" J% h$ f8 |  ?% x) t( Cs(2).USD = 5;/ @+ \# O" L/ O. r
s(2).CNY = 31.03;
, z2 {0 y. e. g. o/ Z. ~s(3).USD = 10 ;  h% M" j8 {0 t5 v: }
s(3).CNY = 62.06  n4 i  b5 t* L2 m0 j# v

3 L3 I) V% J8 S: p# @+ H
" y7 ~+ {/ z2 i; O* t9 z% 输入s是矢量+ G. g' ?2 i/ x1 B0 X- C' p( N
t = struct2table(s)# C2 g1 Y6 U+ T7 |7 `! Z& p) F# f0 Q7 p
5 f9 S# m8 z) [% O0 o

7 G9 y& x0 t  u, B! d0 zs = ! O. f! |+ j# ]8 V; q
1x3 struct array with fields:
2 g7 J$ [% S+ s7 ?" w! g2 K    USD0 i  `' z) @7 p. C' k+ w
    CNY+ ]" o  y( Y& |3 ^) _6 a$ C
t = 9 o9 C% E# m: ]$ z5 p
    USD     CNY & i0 |5 R  d2 n
    ___    _____: O% a+ a' A# Q) R3 b
     1      6.21
5 _# j" i1 I- B1 M$ s     5     31.038 X# B! l9 X- a( T) ~
    10     62.06  ]1 E+ i3 w( D( \! ^& P
把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。
1 b# a7 k/ Y( B6 }% [: \. S% table2struct
6 @' `& \* |( p1 j, u6 W>> sp = table2struct(t)  % non-scalar struct ! B+ C* r( T! g* z) z; v
sp = 0 k" B. v% g3 ^
3x1 struct array with fields:' k( D. b7 v4 I9 H& u- B. `
    USD/ {/ i9 a* h+ h% ~: v
    CNY  $ O5 N- s$ m& e% O
操作如图Figure.5所示:
5 s! H3 E; L. H1 ?" _% r+ w, b! _Figure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。8 |* K- [7 [7 Z
Table.3 电话号码簿: b9 u4 R) T( J$ d
- @7 Y2 |$ c( ~+ [2 u
姓名        电话号码3 |" @! m* ^. g4 x/ Q
Abby        5086470001; P" G) b! Q& g1 E8 Q2 E
Bob        5086470002- I+ u: h7 w! k2 [7 ]
Charlie        5086470003  ~  |& E. i6 F7 [
c = {'Abby', '508647001';...: Y& h  H9 u- I$ P1 A# F4 {
     'Bob','5086470002';...3 |- D( |& p1 V6 U, h
     'Charlie','5086470003'};
8 a+ X4 n) F5 p3 N" I. I; v) Q6 ]t = cell2table(c,...
+ m( K8 _) V, G& k 'VariableNames',{'Name','Number'}): o' {' }+ S! z: R- I
( T' m* F6 M6 F2 _: k+ h: Y# j9 e1 ?
# [$ l4 o/ W, @& H& H
t =
! C% w9 O6 \" A9 \* j2 P      Name          Number   
# n0 M8 f+ D: m' E/ {+ K    _________    ____________' V4 q# D9 }* T
    'Abby'       '508647001'
1 F' O) f& V7 d4 p    'Bob'        '5086470002'/ W$ [1 n" k! M9 I7 @: `- T
    'Charlie'    '5086470003'7 \" V" N5 \( ~8 v
把table转成cell,table的表头将自动被剥去  J8 a6 C. F( c& d2 x0 i9 u
% table2cell
& p4 p( W+ A! d5 ~>> c = table2cell(t)' x6 k/ g+ d! v% j/ I
c =
, b4 R* O0 b4 X. M4 K. S1 Y8 ]3 i: q    'Abby'       '508647001' 1 T! D/ q3 u  B# m) e% Y8 _
    'Bob'        '5086470002'
" K2 e1 q& C6 k5 ]( [    'Charlie'    '5086470003'

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-6 21:06 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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