|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1 W/ K0 F! u! k7 ?# n+ Q5 |( ?目录:# f* m: _3 g; w& K$ l* |
% f' b# B& A3 g2 t1 d! `' Gtable的操作, U/ O: a8 b F' k
删除行列
8 ~2 ]2 Q; [. e4 r8 d添加行列
3 p! X: R ]* y# p- U合并table
: [2 ]3 V D) B& r1 B操作列数据
& u+ E+ r" q% D5 h排序
) V3 ^4 U2 I K+ k# }筛选和查找
I6 f9 e4 T" S1 h3 X' a; n输出到文件
' h' [; i6 d+ R) E" H y3 M其它数据类型之间和table相互转换. z) P' j" p3 h, q) p+ `5 m/ r
table的操作
L; X. i5 g+ `& {! g; n0 M9 t% Z删除行列! [' o' e- x' d' F
删除一个table中的某行只需要对该行置空即可:9 S& t) R9 a* J: w
% 删除行
3 v! j, \9 A q9 [- Z>> nasdaq(3,:) =[]+ `6 n- q' s3 |# Y' [, T. R- k5 [; [
nasdaq = 5 [4 T( U5 ?0 j! P+ i7 F
Symbol Name MarketCap IPOYear: \+ M# h( Z5 j% ^ p' _
______ ________________ __________ _______
- q2 c/ N5 k W0 N4 A, K
% q) o. c) P( `# f# E 'AAPL' 'Apple Inc' '$742.63B' 1980 5 j3 J- g9 v; O& b1 X5 ?
'AMZN' 'Amazon.com Inc' '$173.33B' 1997 P0 d& }: K3 q" u6 G0 Q( j( [
以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。5 f( V; |, v8 o+ J/ Z
% 删除列
3 L9 O8 N k7 A, n/ ]>> nasdaq(:,2) =[]
# Z2 X2 {' i! b/ O3 p: q/ hnasdaq = * r: U: e M; `6 q
Symbol MarketCap IPOYear
5 g" L4 a2 n$ K) e! j7 {/ q ______ __________ _______
; W6 r. v) f/ A! }* z% |. o
. t! _" O1 k- v1 m 'AAPL' '$742.63B' 1980
0 k+ }1 F1 [* S5 L% L 'AMZN' '$173.33B' 1997
/ p( c5 E- D8 P m% E删除列还可以通过Dot的语法,只需对表的VariableName置空即可
! R3 i9 l0 `# }$ @/ M- p' X% 删除行
) s/ V+ R$ l. o% C>> nasdaq.IPOYear=[]
, W. {5 I! _! M0 P5 `nasdaq = 1 z+ k6 K! ] }$ w# e4 l$ t1 m
Symbol MarketCap
7 o7 W M$ E8 ] ______ __________
) _% F8 d- W/ F, \
: S6 b' L( e6 D0 q* W2 n 'AAPL' '$742.63B'% U0 f+ f6 _+ y" Y; h3 |$ s
'AMZN' '$173.33B' 3 P2 w8 \9 P& l! D# ~: a+ a3 f
添加行列 d; C! B5 V( J3 W7 w' T. p
沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成
7 x/ s7 u r% v2 n2 F5 F0 |7 ?% 添加列9 J- e S, @' e7 j+ _( Q. Q
nasdaq.Sector={'Computer Manufacturing';..., M1 P) e3 y7 @6 G0 x0 N& b+ c
'Consumer Services';...& K8 n- O$ l) n" U
'Computer Software'} - U; h: y. ?/ W" R+ N4 W
注意,这里等式的右边是一个列向量元胞,结果显示如下:, }! C e* p E2 Q+ E% ^
% table新增了Sector列
* x+ p: f: e- _: H% H2 pSymbol Name MarketCap IPOYear Sector 1 k% n+ l) q2 B% Z* ]9 i
______ _______________________ __________ _______ ________________________- A+ s! }- ^: c0 N
'AAPL' 'Apple Inc' '$742.63B' 1980 'Computer Manufacturing'* t; b# Z& K$ |6 |4 {* G
'AMZN' 'Amazon.com Inc' '$173.33B' 1997 'Consumer Services' 3 Q0 V3 F( L: K# w! |
'MSFT' 'Microsoft Corporation' '$346.9B' 1986 'Computer Software'
; _/ `0 x% F( V( \
/ U$ M5 e: c) A8 u前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:' ^! W3 T! i0 e7 q
% 给table添加行
B9 `4 E! |* ~* V$ u: knewCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'} 9 [' B, {7 r6 E: h9 s1 N
newTable = cell2table(newCell)! Z# H; c- h8 m7 s4 t6 t' f" y
newTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};
9 h u$ b. B* j m6 BnewNasdaq =[nasdaq;newTable]
8 y" j# M! g! }" a) d其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。
) X' X: @: M$ a8 v8 N' n+ `" ~合并table
, Y4 h6 P+ H# T8 }合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:' a7 S% R% ~: Y- t* R
Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:$ J% e, `4 b( j
t1 =
4 ~5 h1 R+ K2 a% I+ {; d; l Name Number
0 s+ d3 P) b4 a8 k1 s- H# u. o _________ ____________* m2 T% L2 z( J7 t3 J
3 J0 V% o* S. ~# Q- h 'Abby' '5086470001'
; t2 y {3 m! b+ F s# m 'Bob' '5086470002'
" P$ F# ]6 i( q, ]% |9 \ 'Charlie' '5086470003' 5 E2 F: k9 d% d' {
t2 = 6 u& M7 n% h, m" t K3 i
Name Number
# k$ ]0 \7 C D h- P" i _______ ____________7 |3 A% I- P& w( y* O: X
4 n8 z; A- N3 {7 k1 L/ V 'Dave' '5086470004' h: b, r& l: A
'Eric' '5086470005'( ]7 }/ ^1 |' V9 l, A( p
'Frank' '5086470006'
& L4 M8 O2 p' J8 m9 @3 _, q9 K横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:
7 h( H o8 p$ E( C+ ^% 直接串接table
( k2 a- u/ ]; e- I+ h/ O8 M>> new_t =[t1 ; t2] 9 S. d7 s$ z4 K) q
new_t = 6 X+ U! O0 H8 M# Z; F
Name Number " v1 g- z1 l/ n5 H/ a5 r7 U$ U
_________ ____________
: |, L9 b( U' \+ ?
, g1 L y5 v! Z& j) y6 V 'Abby' '5086470001'6 c9 K4 J0 O! `& f" y& Q1 S
'Bob' '5086470002'
2 d( }! Q" s7 R 'Charlie' '5086470003'
5 `/ }3 o: m. \. y 'Dave' '5086470004'
* m% D0 p8 r; J0 S; A/ d 'Eric' '5086470005'
9 m; i4 _* z- y5 G; E3 L6 m 'Frank' '5086470006'
& U" i _% N6 e* R6 X2 y: U% 使用vertcat h5 z. Q# v _" [: D. p g6 c
>> new_t = vertcat(t1,t2)
. ?; {2 y# P% S3 G9 k% p& t* R& Y6 Cnew_t =
8 t8 l: Z/ d& { Name Number
) Q5 t+ S; w2 ~& I" V( \) n7 v _________ ____________
% H( p. |1 K8 H! X% |4 |. y) h, R; h. `5 ]
'Abby' '5086470001'
$ x: X! @, ?1 Y' S( X$ g! i& m; t 'Bob' '5086470002'
$ _1 P& e/ J/ t2 s$ c: t) A# L 'Charlie' '5086470003'% T! }6 O: ?+ Q9 C3 y& }# J
'Dave' '5086470004'
' R0 S4 g9 ^- u% n4 I3 O$ B7 C/ b% V 'Eric' '5086470005'
; ?% h5 R+ |7 y 'Frank' '5086470006'7 w, w7 S8 M6 k3 T$ f
图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table v: L0 a2 F1 F5 b* f* K
t1 =
" g1 M) P3 e! ~% Q9 j( x Name Number 2 Q) W5 N7 h$ j& Z+ E5 `
_________ ____________" j/ l( U. L. h: j# h) }7 T
% ^: j r" e$ \ 'Abby' '5086470001'6 G3 l* W: u" X: b& ?6 g$ @5 F x
'Bob' '5086470002'3 i! b; v) x8 u0 v4 e. w( K
'Charlie' '5086470003'( b1 p8 U5 _" m3 H% i6 i
t3 = 9 ?0 l$ N' {0 b" ?4 `
Office Building
6 P/ M4 M7 \7 ^2 ?6 [2 T ______ ________4 M2 e5 o7 ~0 e: r
6 A1 H* M. A5 D2 I* U% X '331' 'A1' 5 P* O6 P; S6 } f# _/ C4 _/ t
'201' 'A2' " {& f9 u$ E V9 k) Y2 P. \5 O
'328' 'A4' ! r, v+ [0 q+ i" ?4 F
横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示
" |. n3 Z* K1 T4 [- J% 直接串接table
- F. p* a, Y% |% @- n6 Z>> new_t = [t1,t3]$ A5 I! P( B/ z0 S$ }7 C
new_t =
6 }8 y" y) ~( H; X# p& d/ ]1 k: ~ G7 z Name Number Office Building
+ J& F/ B) W! X/ b% j) p4 \ _________ ____________ ______ ________/ a, A5 b- Q; C8 ~: W% j9 f
$ s9 h* T% |) V4 X+ R R 'Abby' '5086470001' '331' 'A1'
- N/ l7 k, X: @! c( k3 O8 t 'Bob' '5086470002' '201' 'A2'
1 \$ D4 b4 H { 'Charlie' '5086470003' '328' 'A4'
0 B8 l# s3 z4 A# ^+ A: J% n或者直接调用horzcat函数,如下代码框所示:
9 J( U! M. M7 u/ v/ {0 a+ g1 d2 w8 B& B! ]% 使用horzcat
# O7 d9 S" s4 T! A>> new_t = horzcat(t1,t3)
7 }5 v6 B5 R: L+ K4 J& _new_t = ) I1 n( Y; [3 D& u4 I- h
Name Number Office Building: m P/ s2 g5 C. p' g
_________ ____________ ______ ________8 @: j8 u: ?: l, S7 b8 q# j
& c8 b: B! ?0 W' U4 o- l 'Abby' '5086470001' '331' 'A1' , u3 a' e4 M" Y+ @# v
'Bob' '5086470002' '201' 'A2' ! B d4 W: b; ~! O& a4 u3 @
'Charlie' '5086470003' '328' 'A4'
4 r& p" P6 v6 j4 m$ Z0 X1 Q$ L1 S$ z操作列数据- k7 x5 p* h5 `% y8 y9 \$ a
沿用NASDAQ表所导入的table:
, ?5 c" Q$ U' z) Y( h5 d% nasdaq table原始数据9 t y) f0 s/ w0 W9 K$ t& u( Z
nasdaq = 3 z# \+ E3 B2 Y: C* N/ U8 g4 t
Symbol Name MarketCap IPOYear
5 B- d' d) a4 z9 m G7 C4 L ______ _______________________ __________ _______2 T8 k0 G7 u# S0 }) R
' ~( ~3 ]9 M' b Z
'AAPL' 'Apple Inc' '$742.63B' 1980 2 I7 ?8 @. s+ c) w2 n# p3 y
'AMZN' 'Amazon.com Inc' '$173.33B' 1997
, ^' H) V3 h# D( c6 Q1 I' E 'MSFT' 'Microsoft Corporation' '$346.9B' 1986
( r) v: ? Z9 J% b0 u其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B- F, k' D: S9 ?" j! N
% helper函数 z! b8 }1 R8 M4 ~- k G0 J' z; h
function out_num = marketcap_helper(in_string). u: F; b( j# y3 K$ {1 U% U
out_num = str2num(in_string(2:end-1));
. A! E/ C) J. S% m9 C. I" uend
; W0 {2 N2 B: ^/ L& Q% I3 H1 ?然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:. S: J) M) \( Q
% 调用cellfun对table列数据进行操作
+ Y* T$ y0 p8 p% h>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap)6 l+ c" ?+ n/ `8 L P X( ^
nasdaq = 4 o5 m% q l" v% ]0 S
3 N, x D# S6 V9 z* H4 g Symbol Name MarketCap IPOYear0 W& K! \) T6 P) m" j
______ _______________________ _________ _______
/ p4 H/ A! { R% t$ N
; _6 T/ {9 Z; H- W* y: r7 _" o 'AAPL' 'Apple Inc' 742.63 1980
v. O% a3 q0 a; [- u" [9 B3 O 'AMZN' 'Amazon.com Inc' 173.33 1997
: F2 {) b, ?9 o. E6 ? 'MSFT' 'Microsoft Corporation' 346.9 1986
, ]" m) J# V4 x6 v& ^table类还提供了vaRFun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:7 ^8 F( s# D' Z- P+ @2 C
% yhoo的table在命令行的显示
* k+ f) C( c$ I9 P$ d! k- Lyhoo = + F8 A! p- E) e' Y0 q3 }0 x
date open high low closing volumn adjusted0 N5 w# \. U6 u: z: B1 i ]
__________ _____ _____ _____ _______ __________ ________
, b- q2 i( w' @! @& H+ ~9 N 7.3603e+05 42.57 42.92 42.18 42.68 1.0601e+07 42.68 J8 B+ u( e# l
7.3603e+05 43.6 43.93 42.67 42.98 1.1802e+07 42.98
3 T) n7 S4 W. H2 ?' b1 `0 I, N 7.3603e+05 43.98 44.24 43.4 43.44 1.1888e+07 43.44
" s6 i4 Q# |0 W6 H. i7 q 7.3603e+05 44.18 44.31 43.5 44.16 1.1868e+07 44.16
5 L" s+ d, \4 A9 i 7.3603e+05 42.08 44.38 41.97 43.99 3.0099e+07 43.99
$ X- }( ~7 w) Z4 e- P/ n 7.3603e+05 43.7 43.95 42.42 42.62 2.2392e+07 42.62
, H( Y5 b: h2 R, |! m 7.3603e+05 44.06 44.43 43.7 44.11 1.1027e+07 44.11 # ? X! K p" E+ w9 ^3 n. ]. @
直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入+ m6 o5 I: d8 i# B) n( S
% varfun对表中的列数据进行操作
2 D) f: g: J1 r6 f9 z) l+ `2 t o>> varfun(@mean,yhoo(:,3))
$ S1 w/ m8 w$ Dans = 9 L+ P- M8 h) K
mean_high
8 I; N7 p2 F0 K$ _" f9 ^. q _________1 ~7 Y: k7 A/ l& c$ z' P
1 O0 V: V( _9 B% M" P+ G% U$ X 44.023 0 G8 z; A- [$ t- G- v$ ?% h: p7 }
再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式
6 b) S8 J f+ G) |1 S& U% K4 x& ~% 变换date列的数据格式$ e, S( n4 \# t; X/ [/ }
>> formatOut = 'dd-mm-yy';8 w: ?& i+ f; G; P' \5 [6 V& c& x
>> yhoo.date = datestr(yhoo.date,formatOut) % datestr接受table输入
8 [2 R+ W* a( c& fyhoo =
* V8 b$ c* H3 |' w6 O* vdate open high low closing volumn adjusted
; F% i; O9 R8 {+ A' r+ F. U$ \9 x________ _____ _____ _____ _______ __________ ________/ j* x% Z+ w M& G! g' G
0 O1 R. X+ B0 i4 D
10-03-15 42.57 42.92 42.18 42.68 1.0601e+07 42.68
2 e8 p7 r6 M' N% }09-03-15 43.6 43.93 42.67 42.98 1.1802e+07 42.98 . z( U, v6 _/ H3 P
06-03-15 43.98 44.24 43.4 43.44 1.1888e+07 43.44
9 T$ l+ S# C, I05-03-15 44.18 44.31 43.5 44.16 1.1868e+07 44.16 ) R: F: x) k# O j* a0 u' L
04-03-15 42.08 44.38 41.97 43.99 3.0099e+07 43.99
! j- E' Z8 X; v: s03-03-15 43.7 43.95 42.42 42.62 2.2392e+07 42.62
% S( C0 j1 I3 u5 [9 z; q& T0 I02-03-15 44.06 44.43 43.7 44.11 1.1027e+07 44.11 ' ]7 ]* m8 z+ N" ^
有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去& b0 L0 \/ Q- K1 N. B3 s
% range列的数据来自于high low和closing列数据( ~4 A! r: L8 ?1 A; ^0 f
>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing
/ B# C. g; ^$ K+ }6 j1 Wyhoo = ! s8 ?9 F5 }! I, O2 @( C% d, t3 i
date open high low closing volumn adjusted range
4 U+ R( s+ Z- O' f0 Z u________ _____ _____ _____ _______ __________ ________ ________
# g& K' `7 ]: {: A7 t10-03-15 42.57 42.92 42.18 42.68 1.0601e+07 42.68 0.0173383 B2 [/ O" e C2 N/ W
09-03-15 43.6 43.93 42.67 42.98 1.1802e+07 42.98 0.029316
' k: G6 o( z, [- e/ |$ [06-03-15 43.98 44.24 43.4 43.44 1.1888e+07 43.44 0.019337
( N! e8 Y5 M Y m7 }/ F05-03-15 44.18 44.31 43.5 44.16 1.1868e+07 44.16 0.018342
0 W: y+ [2 X7 Z; R" o04-03-15 42.08 44.38 41.97 43.99 3.0099e+07 43.99 0.0547857 O9 y4 R1 r k: r4 { j7 M
03-03-15 43.7 43.95 42.42 42.62 2.2392e+07 42.62 0.0358995 b! i+ e9 \# E( z6 f
02-03-15 44.06 44.43 43.7 44.11 1.1027e+07 44.11 0.01655 7 ^/ C+ |9 ?' t% ]9 _( X
排序
! b2 x. t9 C1 Q/ W3 @" R( g沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical6 ?. h8 E% N& X3 R6 Z' x
% 调用cellfun对table列数据进行操作7 p' ]9 b/ [: S# _9 p3 ?
nasdaq =
: k G4 q' T1 G: z Symbol Name MarketCap IPOYear
: j/ h9 G$ c/ o+ p$ C! \) D s* I ______ _______________________ _________ _______
m2 x4 M& a6 P5 s; y; T* A/ o$ ], h- A: g+ y
'AAPL' 'Apple Inc' 742.63 1980
`4 b0 |: S$ `. G 'AMZN' 'Amazon.com Inc' 173.33 1997 2 F, \" M$ }/ i; v# B" N
'MSFT' 'Microsoft Corporation' 346.9 1986
7 } Q) a6 f2 g2 t现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下- _7 }' L* }& p* m( O# W2 d
% 根据MarketCap列数据进行排序1 d) r% @) v$ _, ^
>> sorted = sortrows(nasdaq,'MarketCap','descend')2 b, s3 l- J: l% i9 i: n9 A
sorted = 3 T' d( _; r; v
Symbol Name MarketCap IPOYear
( z3 F3 i. ]5 n: ~& w2 L6 u ______ _______________________ _________ _______
+ P. |" U9 K8 m* w9 S; N$ `7 n, Y7 M Q/ Y9 k" n- ?
'AAPL' 'Apple Inc' 742.63 1980 ; c9 m+ b, [. i1 m1 G
'MSFT' 'Microsoft Corporation' 346.9 1986 k5 ~* ^4 i7 e/ V2 B: T& E2 Z* }
'AMZN' 'Amazon.com Inc' 173.33 1997
7 f/ ~$ L$ V% o* C4 f# d筛选和查找. e% }" t: H/ k6 s, {. M3 u
table的下标也接受logical index, 下例选出所有股票中市值大于200B的股票 ?, X7 Z0 B! A3 T3 b
% 筛选
# \9 @* X3 v$ d$ {5 Y4 j>> nasdaq(nasdaq.MarketCap>200,:)
$ n, O( e( J& S- [ans = # Z$ O/ M5 u2 ^) \* O# W: A
Symbol Name MarketCap IPOYear
3 F$ C# D5 X" [* e q9 X ______ _______________________ _________ _______' u: s7 l3 ?4 P( z# z" N" i
# |7 z2 R S$ k/ N& U% [ 'AAPL' 'Apple Inc' 742.63 1980
9 }1 E9 m! P2 o, O 'MSFT' 'Microsoft Corporation' 346.9 1986
; y! x5 H) \0 S( K9 l2 N+ ]如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票
9 S/ W. k1 J! }# K- [% 筛选8 z3 x, c/ r9 s
>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:)+ {- F6 V+ T! f0 q& M7 ~9 ]0 ?
ans = ) w6 b$ Z( g* ~( {5 [8 v3 l5 l
Symbol Name MarketCap IPOYear/ B& E n+ s% k% K7 t
______ _______________________ _________ _______
4 c# J* _8 o1 r, y. h6 M2 I+ f& @8 T
'MSFT' 'Microsoft Corporation' 346.9 1986 " l7 l; [2 I# F9 j U
logical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据 G/ I9 W" X) N+ T$ d
% 查找5 x& P. ~5 }& k' o6 X
>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:): x5 \$ S$ W6 |# R Z( `* O
ans =
0 j% G( x8 j: t5 a& W5 R Symbol Name MarketCap IPOYear( w I. E# L: x I! P* n
______ ________________ __________ _______
, V8 u. g, Z7 u 'AMZN' 'Amazon.com Inc' '$173.33B' 1997 2 R5 Q# J$ [$ @) \4 E2 u: ?4 _+ e; a
输出到文件. [# l3 {8 }5 z( c. b5 w
和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable4 r; S5 V) c8 n" g- W6 `
% writetable ~! @ V4 \* k2 Q9 A0 x
>> nasdaq = readtable('nasdaq.csv') ' c* Y7 q6 |6 G4 z5 O N& J
>> wrietable(nasdaq,'mydata.csv')
. e) E# v, _+ N) e5 g6 W. hwritetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号: _; I& z% r ^ }5 C: X
% 指定分隔符
: ^1 c/ g8 d: _5 hwritetable(T,'mydata.txt','Delimiter',' ')9 ]8 \- Q2 a9 Y3 k! C
结果如下
" H% g- A. l4 J* t9 M) j% mydata.txt, V! w9 ^. X; y5 e6 |5 K. r! W
Symbol Name MarketCap IPOYear
0 v& Z W1 q# g. A h7 x4 p- |% OAAPL Apple Inc $742.63B 19806 @7 e7 T3 Y8 F) J& F
AMZN Amazon.com Inc $173.33B 1997
2 N2 N/ _" Z& e/ M* H% aMSFT Microsoft Corporation $346.9B 1986 - v) G# n; h0 d( v! I
其它数据类型之间和table相互转换
& `/ `) R9 J' d0 xMATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:8 G% A) a: }/ ~
Figure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:1 c8 }/ P0 I; X# T+ G# l
Table.1 美元人民币换算表! V& J2 d: B- V
5 J' O5 _8 `1 @, I5 \USD CNY
9 I% v! A& x- h* K M+ w; |1 6.21
& S0 k# A- D3 q8 c% g& B, w5 31.03 i3 u$ t6 T; y3 T7 Z+ c
10 62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置
- n- q* [0 T' L% S% n7 c: O# S% array2table% o/ V. T3 e2 p; e- o8 R
>> a = [1 6.21;5 31.03 ;10 62.06 ]1 x% U+ q( ]3 |: }3 a
a =! l) o; `( A4 ~& ~, q8 c
1.0000 6.2100
7 d% V$ m a2 W6 j8 J2 k K! a 5.0000 31.03005 f0 t5 a; b3 A4 |7 v. N4 }
10.0000 62.0600
$ u$ C- s& B3 N1 ^0 Q0 t# o>> t = array2table(a,'VariableNames',{'USD' 'CNY'}) % 通过VariableNames提供表头信息
0 Q* h* Q6 _+ B3 P0 i% {t = / y* x! e7 X7 J4 D
USD CNY 1 G2 l8 E4 }/ {% k$ |
___ _____
" Q" b: B/ A, U i6 t8 T1 y% W$ \4 B* X 1 6.21
6 p9 w+ h/ [: \% |: u O 5 31.03/ o4 u0 r2 H% |6 }
10 62.06 , [3 @. ~5 E! S' u
) @: T: ?0 J, T- M( {- l
如果把table再转成array,表头的信息将会被剥去" C% X: b8 M$ b
% table2array8 U; b, M9 K/ p9 X1 J1 O! X) f
>> ap = table2array(t)
& K" L' I3 D" n+ _$ H" Aap =
' V7 _+ L. q w8 g5 y! j3 u 1.0000 6.2100
6 Q: {* `6 L- j2 |( m) Z- b" t 5.0000 31.0300/ Y+ n: |$ a' Z9 o6 F( D* c
10.0000 62.0600
* m+ q/ t- t: y" S1 |操作如图Figure.4所示:5 z. E% L; A) n! ]1 c" g. V
Figure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。
' J. x) l& V+ M6 G) `7 r% struct2table
+ X- A& c- `6 F# i* h+ O>> s.USD = [1 ; 5 ;10];
6 l8 h6 ` M$ P C7 P>> s.CNY = [6.21 ;31.03; 62.06];8 j' ^6 H/ [" g( C @2 T ?
>> t = struct2table(s) % 输入s是标量
/ n0 U: ~( j' N# v; @* |t =
( u' d9 j% g6 A* i) s. t USD CNY 3 x+ H# g! ]5 q- ?# u9 N; o" @
___ _____
9 |& F3 y+ n: x- a9 Y0 E 1 6.21
- [9 b; k7 x4 Z, ?2 U5 E 5 31.03
0 j. S v' K5 U A4 N1 F U9 E3 f2 R; ] 10 62.06 3 K- w) h# z4 t
8 I+ k7 ~9 l$ I5 u' v* Zstruct2table还接受struct是非标量的输入
1 U* [/ k; d: b3 G) o% struct2table 矢量
6 O" E: @/ Q: G! L+ U) ~s(1).USD = 1;% y- H5 H' R1 k5 s) w5 s% ` Z2 p
s(1).CNY = 6.21;
2 p( `; V& @# J! ^% h* zs(2).USD = 5;
. v; B8 _( Q1 _2 S, r# ~" z3 ys(2).CNY = 31.03;/ r" _ _! c! f# [6 v. P
s(3).USD = 10 ;& E. L. |. X9 I. S
s(3).CNY = 62.06
+ e2 B+ ^4 g3 F( V1 m
% ]. O5 ?( ^, n( t. i( H
+ W& X( n" P, d% 输入s是矢量
9 N+ L+ W% m' j) s2 N6 |) x; Ut = struct2table(s)1 Z. q7 {, C( Y
1 I- ~/ a5 U/ O1 `* I
$ H, B8 j( B9 r9 M5 j
s =
2 }" G- e1 S- n! q9 Q1x3 struct array with fields:
2 j5 g J9 V& j6 G0 X USD
! @% x" D! U. B! d CNY
9 B4 C6 M S9 Z4 r' Mt = 2 B* x% ^5 g1 Q% V% Z6 J
USD CNY
# k x: A4 {2 b& V8 i3 s: @ ___ _____8 ]3 E" R: C+ c; X0 G, R
1 6.21
- P z( n4 D/ ?) A 5 31.03
, s* ?6 }: w" t% ]$ D 10 62.06
! V7 S4 Q# X$ F% z9 v$ g- T/ a把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。
6 u2 y: U Z2 }' s8 t0 @0 e% table2struct5 t4 S7 ^3 ^* J: M& e. }( ?6 ]
>> sp = table2struct(t) % non-scalar struct . W' S0 `( u: p$ P' d
sp = - n e* H R& d2 i: B
3x1 struct array with fields:; L" `7 z" r1 b" \+ A, }. `( G1 i
USD
9 O) ?9 R2 t" v# L; g- d, U CNY
! ~" n w5 [: `! j/ R- h2 Q操作如图Figure.5所示:! q+ A* L: g- P) g
Figure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。
/ L1 V9 ?1 J% i/ f* i1 T: y: [+ l3 CTable.3 电话号码簿# V9 q5 r7 X- [. l
; z! f' ^! b2 z
姓名 电话号码 _. U- d- T. t% T( m, w
Abby 5086470001: W8 l* ^. M* W- ^( z. Z
Bob 5086470002; y; `4 P1 t+ \3 ]$ E+ {. i2 H
Charlie 50864700035 e9 f, d% Y; r: H" Y; N0 M
c = {'Abby', '508647001';...
- H" d @: t( b7 l 'Bob','5086470002';...
" |( K6 c% H; O& U% w 'Charlie','5086470003'};/ [+ m' ~+ T' H9 M' J8 J4 o/ L3 K
t = cell2table(c,...; k% L. U# V' y! o7 `' ^: `
'VariableNames',{'Name','Number'})( |3 V: N- J# X/ n8 X' G) d1 I. j
' o( H2 L0 ^) ]. U. l. N( `- L+ ~1 v+ C3 n1 `) I
t = . g _7 q, d" W. a/ \9 U2 R8 y
Name Number - F' H% y% O' y& S
_________ ____________
0 e1 A" n+ Y: h6 S: W) m 'Abby' '508647001' : |5 J" z; R, r7 J0 x$ c' u* W
'Bob' '5086470002': ?9 q) l, F$ z
'Charlie' '5086470003' I9 M' r' l- p0 v
把table转成cell,table的表头将自动被剥去1 \0 X B' N# s1 N0 W
% table2cell. X. E0 g5 h9 |( E2 @+ h
>> c = table2cell(t)# N3 Z5 ^; R6 b
c = + ^0 ~. b- u7 Z, C, Y
'Abby' '508647001' * d) D% s) ?( ]( `
'Bob' '5086470002'
8 K ^0 l4 r4 l 'Charlie' '5086470003' |
|