|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
4 \# p* Q6 F% L# a! x目录:
/ y1 b) z( G# _9 o
Q8 _9 q5 p b; Btable的操作
. v: [4 L, t' O- \+ m7 P% U删除行列8 K$ D W+ u ?7 z1 B- `; d, m
添加行列$ o/ P/ E# H+ Z/ s8 p
合并table
) P& }' t. R2 V操作列数据/ y2 `- w4 M+ ?
排序; M* H9 [. s1 P! y0 e
筛选和查找8 J- K* Q9 k" i- g9 [: }( j
输出到文件1 J8 S+ U& }* H- D1 \' p
其它数据类型之间和table相互转换
9 G% f8 b; u, rtable的操作# w$ f8 ?( H3 ^
删除行列# ^; t9 H% S; e! L
删除一个table中的某行只需要对该行置空即可:* ~7 {' u- P3 I+ m8 ^
% 删除行* Q9 W3 W0 t" R- d! A: e# [
>> nasdaq(3,:) =[]: s. u/ U9 |" w! Q2 z
nasdaq = . y1 ?7 Z& j# X1 M5 E
Symbol Name MarketCap IPOYear9 Q- f+ o8 I7 y+ ]$ e5 ?/ y* C
______ ________________ __________ _______ \2 l1 j8 ]4 h
" E$ b- t* k* }5 T* E8 `" c
'AAPL' 'Apple Inc' '$742.63B' 1980 3 R9 ~* W2 d: v9 g( A8 s3 u
'AMZN' 'Amazon.com Inc' '$173.33B' 1997 , J$ K8 v; E+ }/ r# q0 i
以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。
, u+ h3 ^; F- |* C+ q+ K& {% 删除列$ O- G. S$ @* _ O
>> nasdaq(:,2) =[]6 D9 ~1 d, U" `
nasdaq =
" |" i6 M) ^0 S1 K e" t& F Symbol MarketCap IPOYear
! [' J: L0 @. F# r9 R1 p ______ __________ _______" S( o" P9 o4 U* \: v# w) q
5 k- Y7 E: u6 ] o
'AAPL' '$742.63B' 1980 % S: U; I* @! P" s' `9 ]* {
'AMZN' '$173.33B' 1997
k& c7 r5 m8 r6 I, e& X7 q. N9 N3 d删除列还可以通过Dot的语法,只需对表的VariableName置空即可
4 n/ T: t3 R& V. I/ t1 L/ s% T% 删除行3 ?" S5 D3 e! F$ ]- m' j7 s& m
>> nasdaq.IPOYear=[]2 N }7 z) D( N+ F4 L) d: d
nasdaq = L/ q3 O' d; x
Symbol MarketCap ! N5 D' R# t- ?
______ __________0 j6 ~2 C. k0 H9 w8 y7 D- F
2 q( r+ s, U, o: |. W: P
'AAPL' '$742.63B'% @- D+ ]7 T1 C7 S) _' u) H4 S# O
'AMZN' '$173.33B'
8 b2 o: A* F( k. I# a j! |添加行列6 z) W* Y7 s& K) [* ]2 D
沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成; u: u! Q/ R% K9 [5 z% f
% 添加列6 q6 g& B) G4 \0 k
nasdaq.Sector={'Computer Manufacturing';...
2 g# m9 j5 s0 B3 R4 ^0 C 'Consumer Services';...
3 P8 z$ u+ [1 O3 Q' ] 'Computer Software'} 1 T7 u' |6 W# x; s
注意,这里等式的右边是一个列向量元胞,结果显示如下:
4 |5 h7 ^/ ]* f( r/ {- X% table新增了Sector列" ]2 v% Q" e8 E5 D
Symbol Name MarketCap IPOYear Sector ! c0 u% e0 n; `+ I8 C
______ _______________________ __________ _______ ________________________/ k+ g+ R: y! [0 d) e
'AAPL' 'Apple Inc' '$742.63B' 1980 'Computer Manufacturing'% Y0 m+ \- Y$ ~/ x, D4 \, r
'AMZN' 'Amazon.com Inc' '$173.33B' 1997 'Consumer Services'
& B ]* o$ t( f9 W* h 'MSFT' 'Microsoft Corporation' '$346.9B' 1986 'Computer Software'" W o; x2 L8 {0 \
# ^( k) q% @9 O! O; p$ |前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:) I4 H2 D+ z2 O+ f$ Q N, I
% 给table添加行
+ m- ?5 m( |8 MnewCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'} ( [9 f: x/ k9 U( c4 ^: T5 Z" ~
newTable = cell2table(newCell)* X# J1 m) y0 C* q
newTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};
$ {' f9 m7 H7 [% [4 jnewNasdaq =[nasdaq;newTable]
) u* m7 P5 y p1 a: N* Z其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。( a8 h( _6 O7 E7 H) N0 c8 i
合并table
I; @) l! N- b* @3 s. O9 Q合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:6 X8 w3 H* J+ n1 I, @
Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:
2 U1 ?3 c: ]+ v" C" [' [& a, Y3 n3 \t1 =
5 O: Q8 _% v8 U' y3 Q1 _3 I Name Number ' t' I: T; U- z
_________ ____________
7 m+ k8 c$ P% q/ [9 K* _2 v* a* I0 ^
'Abby' '5086470001'
2 v2 Z" {. `! B+ P 'Bob' '5086470002'
* |) {$ E' i1 z! {4 l 'Charlie' '5086470003' / b) d |. m f( e
t2 =
8 C( ^! e) I0 ~, z0 T Name Number
- @& k9 |; Z z; l" D+ P3 S4 {! Q; { _______ ____________ s4 L5 @! S+ g! d- g! A) N& ?
3 i3 }2 i0 x$ z9 n# w/ Q) @! m
'Dave' '5086470004'% L( u& R7 n5 H! ]$ M
'Eric' '5086470005'
8 t' O2 I- F$ v. [6 m4 V 'Frank' '5086470006'0 m0 i: T# h8 o! \. K9 y
横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:3 ~, U* e+ x6 m9 C
% 直接串接table
8 T6 k; u/ J) m$ @9 |4 ~0 ?$ i>> new_t =[t1 ; t2]
8 b% N8 f2 ^4 Hnew_t =
1 ?/ G1 _ }! ~5 f5 k: p Name Number 3 X, G! }- I6 s/ C. r
_________ ____________
7 H z o" t8 O0 B0 M! z, X, I3 w) g4 ~0 O7 o! B
'Abby' '5086470001'$ T7 b1 Z. T9 O; _4 c
'Bob' '5086470002'
7 J# `$ S/ Y5 X1 e 'Charlie' '5086470003'
! {1 J& M" [( u, o) j* b1 v& j 'Dave' '5086470004'- N7 `0 d& N) n" b) m
'Eric' '5086470005'3 @5 h$ y+ W4 Z
'Frank' '5086470006'
6 T. \: s6 S" m& q X A5 `% 使用vertcat
& |8 s6 S7 ?9 e* J>> new_t = vertcat(t1,t2) e4 g. }0 y4 W( B+ A
new_t = ; u& L4 _# h8 n9 l& C4 v
Name Number
- c/ T& r/ `% Q9 p; h3 Z+ Q _________ ____________6 _+ E/ C2 C. \% Q1 R, Q# V
7 f# Y. W0 p1 G% ? j 'Abby' '5086470001'
! X) g1 C) I: @7 s 'Bob' '5086470002'
3 ~4 N4 e7 f* j% t% n9 F, ~% E, U 'Charlie' '5086470003'# n, E6 g: u7 K6 n
'Dave' '5086470004'
; R ]& d$ u$ a2 n% L j) X2 N+ e2 e6 ? 'Eric' '5086470005'
1 t- V, q Q! e8 I1 R7 j6 ` 'Frank' '5086470006'
: ?$ u: `& P5 Q' Y7 q* [图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table% P5 z1 E3 s% ~+ p
t1 = , A* j1 D3 i" l! x L
Name Number 1 z9 M$ _2 x* J8 d
_________ ____________
, k, X4 M3 C/ q
2 I: W9 }" _$ P7 u$ z; Y 'Abby' '5086470001'
7 M; R3 ?/ H2 j" C# y# \/ r 'Bob' '5086470002'
6 S4 d1 P$ J* y1 X7 x 'Charlie' '5086470003'
& d! U5 [ X5 D* v" L6 m- }# Tt3 =
0 Y% p. f* J) P) O7 z' ` Office Building! ^0 B" |( W) t: E+ ]6 a) a+ Z+ P
______ ________0 o- h) E1 G: ?$ E4 v
+ w* C$ V8 ^1 S r! d
'331' 'A1' 3 C4 S+ l" J7 K5 r' u6 f- S- B
'201' 'A2' 6 l3 S& o+ ~! Z N$ C
'328' 'A4' ( m: t0 e. o! O: o0 \; y5 {! g
横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示+ w4 V' D; t( i2 Z; W/ J9 f
% 直接串接table
2 i! v( n2 _$ u( g, r>> new_t = [t1,t3], W3 C9 [) z b' Q0 E
new_t = 9 k* Y5 Z: Y4 ?
Name Number Office Building
M4 \0 ?) O& L _________ ____________ ______ ________
: d6 e) @0 w& W- G! w
* t8 n) X2 Y+ F# F& G% O( j" ~ 'Abby' '5086470001' '331' 'A1' , i |+ g \: ]: B6 c! a
'Bob' '5086470002' '201' 'A2' . S/ z7 }* P. X% {
'Charlie' '5086470003' '328' 'A4' / \, G" K' L' o: `7 i/ C. c8 q
或者直接调用horzcat函数,如下代码框所示:
) b8 y' M- t6 a" G, |# o- B% 使用horzcat% W' l" G- H9 x# k; O
>> new_t = horzcat(t1,t3)% @2 ]4 b7 x) Y5 n1 N T
new_t = " a2 P1 y2 b2 a/ k# ^
Name Number Office Building
0 u- `% y9 F3 m F/ F5 L7 z, z _________ ____________ ______ ________
l( a6 i \) ?8 ^+ \4 I% I) L4 M$ ~. H7 Q& d8 i9 l/ G
'Abby' '5086470001' '331' 'A1'
4 Z6 S7 G2 O. K; Y7 l) D& R/ d& o 'Bob' '5086470002' '201' 'A2'
( U; f! z# O: ]6 J0 l5 l& s$ A! P 'Charlie' '5086470003' '328' 'A4'
0 ?0 s0 L' }% S8 T* F操作列数据% a+ P! }7 e0 z
沿用NASDAQ表所导入的table: Y& ?0 D+ V7 [7 ] v E
% nasdaq table原始数据
" L$ d- G+ l' H! Vnasdaq = 7 [& w4 @+ n: f9 h
Symbol Name MarketCap IPOYear8 q, B1 y/ M/ W5 F! I
______ _______________________ __________ _______$ u" w A; Y9 i" J
+ Z' d0 Y/ s; T4 Y5 v/ v$ g# O& g( a
'AAPL' 'Apple Inc' '$742.63B' 1980
9 v6 B) H" J/ U& h 'AMZN' 'Amazon.com Inc' '$173.33B' 1997 ! ?- P4 [1 [9 h6 a
'MSFT' 'Microsoft Corporation' '$346.9B' 1986 # \7 z- d5 `" Z. ?
其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B
( P7 W- w2 d% g, ]" O% helper函数- Q3 q" w: \1 v" P
function out_num = marketcap_helper(in_string)5 ~5 W! I6 x/ h6 r/ r: ?$ S5 B
out_num = str2num(in_string(2:end-1));" B# }! Y5 q$ N! B/ G
end 2 d. S; M# B6 W F, [+ ?/ r
然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:
* N3 S7 N1 k7 B' l" ?6 g% 调用cellfun对table列数据进行操作
$ F7 |( E) }) C>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap). \) l) p5 l+ c
nasdaq =
- j! n* y' G* [) E
: H0 i- H n y2 l! Y, V" [ Symbol Name MarketCap IPOYear
M. `5 T, X8 Y/ y# t5 L w2 k) i. L0 g/ W ______ _______________________ _________ _______
- {/ R: c' o+ K) B, h! \% ~9 S. ?! x" K0 B$ N$ B
'AAPL' 'Apple Inc' 742.63 1980 / {$ Z( I4 ?# P* z% ^
'AMZN' 'Amazon.com Inc' 173.33 1997 . W9 Z8 q8 j# b4 x4 E8 w
'MSFT' 'Microsoft Corporation' 346.9 1986
$ ?1 g r e$ o* o/ Q( k5 g. D# ctable类还提供了vaRFun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:' ]9 [" T8 V- X1 h
% yhoo的table在命令行的显示
" |, i+ y% M- dyhoo = * ^! l# A+ _) K8 U: r$ E0 w; ^
date open high low closing volumn adjusted
0 z& M6 f; n+ r1 d$ I __________ _____ _____ _____ _______ __________ ________# j, e9 n# K/ h& @2 [
7.3603e+05 42.57 42.92 42.18 42.68 1.0601e+07 42.68 5 U- e8 f& n) t6 Z
7.3603e+05 43.6 43.93 42.67 42.98 1.1802e+07 42.98 W+ s) M" f* B- s9 H" q" W6 m
7.3603e+05 43.98 44.24 43.4 43.44 1.1888e+07 43.44
1 z" z" b. n% R. c8 ?; V. ? 7.3603e+05 44.18 44.31 43.5 44.16 1.1868e+07 44.16
$ t- B1 v# z) }7 k& c, y ]( x 7.3603e+05 42.08 44.38 41.97 43.99 3.0099e+07 43.99 9 }1 W( O6 m* D0 s) ^
7.3603e+05 43.7 43.95 42.42 42.62 2.2392e+07 42.62 ' S9 C; R/ L% R$ D6 p/ T! c6 u
7.3603e+05 44.06 44.43 43.7 44.11 1.1027e+07 44.11
+ i( c0 N; h. ?; z. e/ O2 o B直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入1 T3 s" J3 l3 |" N1 F! f
% varfun对表中的列数据进行操作9 M$ A. {% L* i- F7 F- s
>> varfun(@mean,yhoo(:,3))
2 l/ y {+ X. P3 ]3 ~ans =
$ r$ ~7 H" O+ {' t) K \. [ mean_high
9 V& }$ F* b! y* H) p8 ] _________8 c3 c4 P [' E9 \' L7 z
w. s0 ?: H9 W, b% _# d$ k( R
44.023
7 K5 j1 n* f5 Q, Z: Q/ K$ K; y再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式
3 T: d8 j, i& D% 变换date列的数据格式
$ s7 M: n. K; t8 p>> formatOut = 'dd-mm-yy';3 m# I% n) q+ m" J: g
>> yhoo.date = datestr(yhoo.date,formatOut) % datestr接受table输入9 K- q: B# \/ O+ f: j" r
yhoo = ( f" S* E5 E1 T! }2 ~1 ?
date open high low closing volumn adjusted- K# `: G, ^' }) I, H/ e8 b
________ _____ _____ _____ _______ __________ ________/ ]6 j: P. H" g p! G9 b/ t. n
5 f" p5 I8 s# @: F9 ~5 X0 Y6 [10-03-15 42.57 42.92 42.18 42.68 1.0601e+07 42.68 4 S" e# b! j B
09-03-15 43.6 43.93 42.67 42.98 1.1802e+07 42.98 / z3 G! i% A7 q' ?+ f. a
06-03-15 43.98 44.24 43.4 43.44 1.1888e+07 43.44
4 D1 M. @6 }1 v0 f4 g05-03-15 44.18 44.31 43.5 44.16 1.1868e+07 44.16
) j( ~7 \. g: g8 m. R04-03-15 42.08 44.38 41.97 43.99 3.0099e+07 43.99
5 w& ?5 C0 |$ d0 N% U- o03-03-15 43.7 43.95 42.42 42.62 2.2392e+07 42.62
) ?, h( m& {& h, j7 }$ ]02-03-15 44.06 44.43 43.7 44.11 1.1027e+07 44.11 . L& H. q' o- C. o8 X" ? Z
有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去
; C1 Q0 G8 ~3 u8 i* \% range列的数据来自于high low和closing列数据7 T4 s8 t6 g2 N( P* i' B+ o8 l
>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing
O3 C: a9 I' j$ `1 H/ G2 H( p \" tyhoo = ! v$ Z/ W0 ~$ B- k7 g6 r2 e
date open high low closing volumn adjusted range 4 |; j0 }9 Q* z1 z
________ _____ _____ _____ _______ __________ ________ ________6 W5 D) T9 S* T% x) k
10-03-15 42.57 42.92 42.18 42.68 1.0601e+07 42.68 0.017338% |; R( `: L y U
09-03-15 43.6 43.93 42.67 42.98 1.1802e+07 42.98 0.029316+ q9 I {6 e, O( ]4 I& U
06-03-15 43.98 44.24 43.4 43.44 1.1888e+07 43.44 0.019337
9 q5 o: a% h- G7 E: m2 N( ]: T05-03-15 44.18 44.31 43.5 44.16 1.1868e+07 44.16 0.018342
8 k/ b; ~# W2 b04-03-15 42.08 44.38 41.97 43.99 3.0099e+07 43.99 0.0547855 ]& ?1 K6 k3 J* t$ S
03-03-15 43.7 43.95 42.42 42.62 2.2392e+07 42.62 0.035899+ M+ a2 }2 U5 o6 b3 ^
02-03-15 44.06 44.43 43.7 44.11 1.1027e+07 44.11 0.01655 / p; R4 ]0 A f. ~& i
排序
/ O8 S0 W1 b4 D沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical
+ N' _1 s. |7 `2 ~! A+ K% 调用cellfun对table列数据进行操作
% [- {+ G0 P+ ?- Ynasdaq =
5 p1 i. T) b5 H. r Symbol Name MarketCap IPOYear
* D2 D4 \5 E$ M7 Z* b8 I# U( x ______ _______________________ _________ _______
8 T* I: J( o% p4 P
* x5 E' i! b% }$ ]2 F3 _" k 'AAPL' 'Apple Inc' 742.63 1980
" L R3 X$ \& p# U0 O 'AMZN' 'Amazon.com Inc' 173.33 1997
4 d( g! O* Y5 M& b 'MSFT' 'Microsoft Corporation' 346.9 1986
# Z8 P# W% Q8 a2 `现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下
- i' T" {7 M( |4 S8 ], I! D% 根据MarketCap列数据进行排序
* F6 M* s8 t- q% O>> sorted = sortrows(nasdaq,'MarketCap','descend')! e- r" h7 q1 K+ f! x/ r
sorted =
2 d4 T w6 k. A1 I& m; X% }" b Symbol Name MarketCap IPOYear
" C$ W5 u6 t4 a$ o3 ^ ______ _______________________ _________ _______
& h6 W+ H4 v. v) |$ g7 I
" M& x' L/ a) Y3 }% y7 b( t& u# `" B 'AAPL' 'Apple Inc' 742.63 1980 : L. `' M/ _ ?* U
'MSFT' 'Microsoft Corporation' 346.9 1986 * v7 R. Z. q! f- I
'AMZN' 'Amazon.com Inc' 173.33 1997
) K& r$ s2 `5 n" e! U筛选和查找
- I" q0 X: v$ v( N ~/ P( Itable的下标也接受logical index, 下例选出所有股票中市值大于200B的股票
. @# E# b5 ?; B4 N% 筛选
2 l4 H8 ^9 Y9 W>> nasdaq(nasdaq.MarketCap>200,:)7 m2 P5 N) v f+ O8 o, n
ans =
( n' c; }5 C O) a Symbol Name MarketCap IPOYear3 v6 K9 I0 _! p! z1 ~
______ _______________________ _________ _______
. V/ U5 ?, z/ j" V
+ E8 ^# u/ t2 |( [ 'AAPL' 'Apple Inc' 742.63 1980 & U _9 M5 s) w: t' z: Q
'MSFT' 'Microsoft Corporation' 346.9 1986
! Y. D2 l8 ]( x6 ^如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票
# p4 E# R8 L# ^/ m# \8 C% 筛选
) x1 o3 Y; P0 ~0 M2 H" W>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:)0 h0 s; k! n0 i' ?- R; a6 z$ P! o" c
ans =
1 E( h: T1 F6 b4 u9 r2 }4 S Symbol Name MarketCap IPOYear; w7 y6 `. l# J/ g' a9 d
______ _______________________ _________ _______
- t: S2 @! `+ n$ \; `& Q% j1 g* M% h2 L; S B4 {( p$ z
'MSFT' 'Microsoft Corporation' 346.9 1986
# K U# R% A( o: u0 Z! ~* \logical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据
" N4 |3 q) \6 g, c% 查找
% y. l3 |% h4 p! z! n6 U% _>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:) w: e+ g" P" z3 _; k8 e! u5 C* e2 l/ ^
ans = % c* ]0 ]4 N/ \1 `' |
Symbol Name MarketCap IPOYear) b1 e; o ?- r8 @. e' A
______ ________________ __________ _______
4 X7 h$ }1 M+ f- \8 } 'AMZN' 'Amazon.com Inc' '$173.33B' 1997
0 d" x9 o" i/ h a输出到文件
7 e3 z$ g- y8 t2 F3 k和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable
# e2 f6 `3 C' y$ N a$ F% writetable8 }: B) B |4 G
>> nasdaq = readtable('nasdaq.csv')
4 ^% k3 @9 y- G8 S, \7 f>> wrietable(nasdaq,'mydata.csv')
9 t& [$ p& D+ N4 Y# ~3 G& u( Bwritetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号& I5 B+ N) x; e! M0 l$ c% M
% 指定分隔符
" V t" N# _( O# t' ywritetable(T,'mydata.txt','Delimiter',' ')/ b" \, D- ~# Q9 [0 M% S/ q1 B
结果如下: Z( ~1 ` b8 ^6 @5 G
% mydata.txt( {. S3 r9 _/ v
Symbol Name MarketCap IPOYear' q& t1 R9 {; Q/ c* z
AAPL Apple Inc $742.63B 1980
, ^2 w! W* L4 b3 D" nAMZN Amazon.com Inc $173.33B 1997
2 C+ _6 S4 U5 z' I; Y9 r, V# AMSFT Microsoft Corporation $346.9B 1986 " B0 n! }9 j* x0 _' x/ {: [) b
其它数据类型之间和table相互转换
1 U* m# {: E3 |1 C! k$ WMATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:
; O `( X* g; y8 J3 DFigure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:
( a! `) j* ~: R8 u, j% |% LTable.1 美元人民币换算表4 o$ p2 ]4 h8 q4 P4 j |9 X3 @
! a8 m8 [; r4 [& ]; M" r
USD CNY
- n+ S0 w: |! E! A1 6.21) d! D8 Z# X4 G
5 31.03+ X1 j7 t" v l* t! X' F& R
10 62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置
& p. s0 u z# S/ j# c% array2table% E2 @. P6 b V) @7 m2 A" O: J, K( m7 m
>> a = [1 6.21;5 31.03 ;10 62.06 ]
+ Q% T6 ]$ N8 C, Na =+ X3 _" @- v$ ~& b3 m) D
1.0000 6.2100
( ^* L3 N6 H. r6 F0 \ 5.0000 31.0300
$ _6 A$ c* k% o 10.0000 62.0600* {5 l8 t; c) ~3 @, `2 P/ C
>> t = array2table(a,'VariableNames',{'USD' 'CNY'}) % 通过VariableNames提供表头信息
9 @$ s4 v9 c* O: a( Q! lt = {8 c# ?: M# |+ M4 b: r
USD CNY 0 ^( M6 e# w; e9 ]# K8 B* I
___ _____) P+ i" Y! D& k4 Z# {/ j0 Q: p
1 6.21* T& I/ b" U k0 A/ N8 a& X
5 31.03
7 ?3 ?/ I) U g4 _& i* b5 ~ 10 62.06
% e# h. L, j7 r' L
5 A% u( [. @' J' |如果把table再转成array,表头的信息将会被剥去
' B7 v0 |7 Z, u* {% table2array
" h9 x# ]9 c8 d* `>> ap = table2array(t)
, `8 m% i, ^: @; {+ @9 Nap =
9 K" f: o8 W$ H9 @) I n, V 1.0000 6.2100% U3 l( ]) r @
5.0000 31.03000 f6 w* F7 T1 K) k
10.0000 62.0600
; a8 z$ W3 ^9 l$ s操作如图Figure.4所示:5 z: L4 E3 r0 o, g
Figure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。5 f2 G1 I& W# _6 Y# k3 c: Y+ H" T
% struct2table: v. r. E0 P ~9 |
>> s.USD = [1 ; 5 ;10];: P: y, W: i' V' n; h: V; \/ t
>> s.CNY = [6.21 ;31.03; 62.06];% T3 M+ n8 _: N. p% a' D# @9 j
>> t = struct2table(s) % 输入s是标量* Q( e. Z* ~' _# M5 G
t = . W6 o' A1 y; x% {9 \2 B
USD CNY ! U: e" C4 R" r4 P5 v, f
___ _____* M4 s1 l$ S* F/ J6 [
1 6.21% Q; O; v1 }, \
5 31.03/ A3 c/ D" U1 Y5 _/ F9 Y
10 62.06
. ]& E4 f& _& u$ o) H! G. X) {
$ t; F( V( I7 X: wstruct2table还接受struct是非标量的输入$ M4 C& D0 k' c2 e: w& r( n# g. |
% struct2table 矢量7 o6 M. w& }! H8 N' D9 M
s(1).USD = 1;
. J2 l+ h% ^8 ~s(1).CNY = 6.21;5 K( X) u' W5 H' b+ A% v* i9 o; a
s(2).USD = 5;
, F6 k" C' q% C, V5 y1 `1 J3 @( Ds(2).CNY = 31.03;8 @, j _) A( a' y
s(3).USD = 10 ;; c- _9 _, N) M" `
s(3).CNY = 62.06
! D: b: R. `/ T! Y
0 A8 Q! o( i& U, w+ h, T$ b7 U. Z; @7 ~2 E+ n; ?
% 输入s是矢量
6 ?5 m! G" L8 e& [t = struct2table(s)
2 b& L1 T% h/ T& A- b
6 ?8 U0 f1 N7 E4 S& n1 r: @! [; f0 k3 d3 \ Q
s = b- ]! @7 m2 p8 p
1x3 struct array with fields:) K! I- N1 ?1 C% V4 }7 X( d$ K
USD0 S; j1 }; k/ F
CNY
" K E5 n2 ~0 s& ^6 r- U6 ct = 6 P4 {) ~9 l, t. v& Y" M
USD CNY 5 ~8 k0 B, v7 q% _8 p0 @
___ _____
- ?7 [$ n! M! f* ^& E 1 6.215 w1 k+ h# W" l
5 31.03
+ h) ?5 C) h0 x 10 62.06
4 B, h) I/ t) V& ]) C0 I' X* m4 K2 L9 {! j把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。
, ?+ I6 b; c) ^ P" S% table2struct' p3 m5 |5 q- |2 J0 F: x l
>> sp = table2struct(t) % non-scalar struct
9 \5 \: P8 O/ ^3 X0 C6 G! fsp =
# M4 m' S( X# Q; B: v3x1 struct array with fields:
8 L# m7 q( R6 A7 Y' g+ h USD
( D+ D) j+ R9 z* Y% M1 i CNY
! I% a s# B. O操作如图Figure.5所示:
9 E5 {3 h) G2 U$ ^$ q7 R" ~" wFigure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。8 f6 ?& a6 Y$ j0 t& V
Table.3 电话号码簿
: k1 f8 y* e% A* \ {- K, C5 T- }* J0 h+ ?- ^& Z1 `
姓名 电话号码1 v5 l, E. }; L- Z$ j; n4 r
Abby 5086470001+ x" l$ @0 Q" J0 g3 s4 h
Bob 5086470002; ] e2 b* N$ W/ e& ~9 J
Charlie 5086470003$ F+ M$ @" |6 G( |
c = {'Abby', '508647001';...
& ~4 Q. b9 ?- Q2 [. \0 v B 'Bob','5086470002';...& O7 W- q3 @: e# L
'Charlie','5086470003'};
1 A9 k8 ?$ i/ J: g7 jt = cell2table(c,...
# o$ ]+ z$ k! W; u1 g. } 'VariableNames',{'Name','Number'})3 D7 X; h; e9 | P* E
% z' f9 q- v6 J7 \, E
9 g% E$ k8 d- k. Ht = . X' ^% ?) E" H/ N0 T. G4 m
Name Number $ [3 }" d" [; ^3 B
_________ ____________
% R* O2 P$ U* O* H- R& x# L 'Abby' '508647001'
6 C, S5 G7 s! d* q; u; w/ \+ D 'Bob' '5086470002'. A) }# U" t; I8 [( E
'Charlie' '5086470003'
; A# \" E2 e' k4 R: U) p# R6 h$ l$ }把table转成cell,table的表头将自动被剥去; r3 Z) d' O) i0 r# A: b' U
% table2cell0 y6 e6 b* o4 G" L$ A$ U1 |! E4 P
>> c = table2cell(t)
. G' h. r/ B# n; O0 q* {c =
% M% }# {) P0 N- G8 r& l7 D 'Abby' '508647001' $ y$ ~* | n( a& E. K' S7 w+ o
'Bob' '5086470002'
& ]" s/ O4 v/ Q 'Charlie' '5086470003' |
|