|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
! n) }) B2 A' b目录:& B( y, P1 Z0 b8 o
# }& w5 p" E; B' \
table的操作6 o) |2 S S) z, l
删除行列
; H. p- X% U( K% ?( C t添加行列- D k0 I) m2 w3 `% V. a4 c
合并table+ ^5 q$ d# X' A% E) g
操作列数据5 [. I( ]$ w8 F1 j
排序
- W6 z$ [% f7 \8 I( G筛选和查找- E# P m& b( {9 C
输出到文件" D$ Z- ?. y2 O2 h" ?& e* W
其它数据类型之间和table相互转换
% g# M# Y1 E# ^6 F* {7 i [table的操作8 C- _& E# c2 w& E8 l& |( P F. ]
删除行列, v0 k- |6 Y0 ~; Y/ T5 O
删除一个table中的某行只需要对该行置空即可:( c2 {9 G) h! A
% 删除行
9 ?( ~; @9 v; _$ L# P% t>> nasdaq(3,:) =[]
' H C2 N4 }( ]8 w: K1 n8 a& Tnasdaq = 0 b: {* _; r. Y! ]4 T6 k
Symbol Name MarketCap IPOYear! \0 s$ l" y% P0 d. i3 _
______ ________________ __________ _______
& @! c1 Q( d. Q5 B5 ~! a; ^9 w2 Y& Y% A1 k* T( ?
'AAPL' 'Apple Inc' '$742.63B' 1980
7 v- K" c% P. c( L 'AMZN' 'Amazon.com Inc' '$173.33B' 1997 5 R4 q' J* J. K- K: s. d: Z7 O
以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。
8 W( z- N: c$ ^% 删除列
, u+ j! T3 E5 g' o>> nasdaq(:,2) =[] G5 q* N% B6 }$ d
nasdaq = 3 M" g0 p# R! \ d1 x, r# ^1 R
Symbol MarketCap IPOYear7 [. R& M- b) c1 K
______ __________ _______5 F6 r" f6 m4 r6 T5 q3 y9 f
/ z: N6 Y3 I$ T* D* A- M 'AAPL' '$742.63B' 1980 ; I6 a/ I' o% E* p, M8 S$ p3 U z
'AMZN' '$173.33B' 1997 ( g% v& H# _/ N& B1 S; [
删除列还可以通过Dot的语法,只需对表的VariableName置空即可
/ |. x+ e/ n# r4 ], j% 删除行+ l+ \* K; v4 k2 @. |1 c. U9 v, E
>> nasdaq.IPOYear=[]& {7 A# A( V/ x. {# c; ~, {3 O# e
nasdaq =
* m9 x! z0 F# D$ A0 U* | Symbol MarketCap
/ m2 \& M. S) y( |. A ______ __________
8 P! g- Z; D {
1 X# j w7 ?, r: I 'AAPL' '$742.63B'
: I) u" i$ x0 R4 d& V2 @ 'AMZN' '$173.33B'
( w3 x$ ?) A9 X* _添加行列1 R, x" Y/ R7 C9 o9 g' r
沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成
: _8 {2 ?; ]7 u( `4 `. s. f* _. K \ ]% 添加列( w5 ?- v4 Q) R* `! c
nasdaq.Sector={'Computer Manufacturing';...$ C4 I9 e4 w5 U6 w( A
'Consumer Services';...) ^+ u) u6 N; j
'Computer Software'} 2 Y+ C7 K) U. x6 l
注意,这里等式的右边是一个列向量元胞,结果显示如下:6 `5 q0 z. Z6 T
% table新增了Sector列. d5 R! y' ~1 B8 Q5 I0 t& Q
Symbol Name MarketCap IPOYear Sector ! ~1 W5 Z2 [/ Q1 F( s# Y9 m( m- k4 K+ F
______ _______________________ __________ _______ ________________________5 h% h1 G3 D- O. `3 q4 U, U% m
'AAPL' 'Apple Inc' '$742.63B' 1980 'Computer Manufacturing'
$ E i- R) p5 L) p' q% p 'AMZN' 'Amazon.com Inc' '$173.33B' 1997 'Consumer Services' ! F5 B; x% i) v! ^; o
'MSFT' 'Microsoft Corporation' '$346.9B' 1986 'Computer Software'; D Q4 C7 z/ L- X
3 [ Y! d3 c' M5 a) M) c( {
前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:$ C" n0 k! I, r' d' _. v. m
% 给table添加行- S! N# G4 s5 y) K3 Q' z9 ?
newCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'} & y& g) q2 y* f" @; R% i! k" L
newTable = cell2table(newCell)
1 o6 W. H% S* O y- inewTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};6 [8 N! M9 U9 ? K2 A
newNasdaq =[nasdaq;newTable] " {: j, D/ [! f- F
其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。& z6 b% f* C- r; {
合并table; H2 Y0 { _! [3 ?1 D
合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:- ?9 U* Y% Q- X) Q0 J
Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:
9 m! B7 L, [ v0 z1 A# Dt1 = : t( ~/ F& U, S4 m$ `( M' _
Name Number w+ q: y4 Y) R, W0 [! i3 \
_________ ____________
0 B+ Z8 n& o' R: j4 l7 f! j
* e: k8 ~ o. }1 N6 T. l 'Abby' '5086470001'; G& M# S& h ]/ k* m2 f: j* B
'Bob' '5086470002'
: M+ G& {" G2 ?' e 'Charlie' '5086470003' & a% y* X$ p- V( d+ D8 F% r' v
t2 = 1 W9 ?" s l5 M3 l) l- L' N
Name Number
0 e6 r- C4 {3 r3 n$ _9 X& X5 t" G3 a _______ ____________
1 n9 |$ B ]: C% G6 L1 r# b( y" i: f: p3 y) b( m
'Dave' '5086470004'
- |: N1 T! k w$ X 'Eric' '5086470005'; t. o1 T1 V# B) E
'Frank' '5086470006'
. v7 A2 R. N; G& j) J+ V; Y$ Z' G- Z横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:4 J$ H% b' a9 ~* P9 p, [
% 直接串接table
4 }2 n0 F! G5 B; R! `) q6 k/ ^) w>> new_t =[t1 ; t2]
, n/ N' t2 B) ?9 |2 e9 P4 D" A+ p6 Unew_t = 9 A, j, o& f) r
Name Number 0 q) [4 B5 Y0 J
_________ ____________
$ Q4 T/ q( \+ q4 ^! w2 r# U8 V( h' M0 D: `! Z
'Abby' '5086470001'% p! b: E, }: a6 k( ~
'Bob' '5086470002'
4 D8 z- d o/ a 'Charlie' '5086470003'
6 y7 N! T P4 |1 n; _. }) ` 'Dave' '5086470004'# T( i& [. z7 U6 ]
'Eric' '5086470005'
5 Q" e! ~3 v: j; U* {6 C* ^- m: X 'Frank' '5086470006'
, |6 `, W$ d% L/ X [ P% 使用vertcat
+ @5 A/ z0 ?5 S) Y, p7 r>> new_t = vertcat(t1,t2)1 h% t# ~- m5 T' x3 {8 l
new_t =
. g2 T+ P) @) H Name Number , b. S9 z% ~0 S
_________ ____________
. N7 M2 M8 x/ v+ \. b8 p" Y3 K3 E) p& {& B
'Abby' '5086470001'1 d4 t7 F8 N$ ^+ n; t: g6 T$ q/ O
'Bob' '5086470002'2 d1 Y, [+ A( S$ b
'Charlie' '5086470003'# z w5 i# m3 t" ^
'Dave' '5086470004'
; z3 k' _6 o7 V. D2 Z7 C1 m) i 'Eric' '5086470005'
8 J& l9 k" }. a9 i 'Frank' '5086470006'
" x* Q- B% C4 X1 j8 O+ m V图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table
! q( Y9 Y$ o$ lt1 = 9 S0 a C) N$ w7 q$ K3 |9 G
Name Number
8 \# Y8 r3 I" R5 M _________ ____________
% U* {% |2 W0 ~$ y, C7 l6 p' s: M; c( G; k5 t" m
'Abby' '5086470001'
& o2 i! @8 n) W 'Bob' '5086470002'5 ~# k) I2 ~, j% H& U
'Charlie' '5086470003'9 o3 i% _ C+ T
t3 = 5 B5 e) y* z/ W/ F/ J& O
Office Building/ S1 T+ W, [" e
______ ________8 @( L5 o" U% V& n; a
- [' u5 b$ L' m. V" x
'331' 'A1' 1 ~7 z1 J# i0 p# X
'201' 'A2'
! r/ B: q) C% R$ j& R6 o% D* i '328' 'A4'
0 B! b! f$ T% A1 ^. Z- j6 n横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示% z T O ], R" q+ L
% 直接串接table7 y, h7 P" T. p) _
>> new_t = [t1,t3]
$ X% L5 [% o3 b. [( Unew_t =
9 j! G$ a/ e5 e4 `. b Y9 \ Name Number Office Building, x1 S/ V* {: J3 e; S
_________ ____________ ______ ________) m. X4 x2 ~$ t% J0 e9 ~( c
/ X; o0 q) l- q1 U; H! z
'Abby' '5086470001' '331' 'A1'
7 ]' k l& s- f6 Z$ n 'Bob' '5086470002' '201' 'A2'
% Z8 F2 `% _3 \; d7 i2 K1 w 'Charlie' '5086470003' '328' 'A4'
$ {3 P! n1 @& z或者直接调用horzcat函数,如下代码框所示: u4 S5 L L4 t6 l
% 使用horzcat. h( o! B" \( g
>> new_t = horzcat(t1,t3)& u% d* Z' z. \' D
new_t = 3 F* |1 m3 i$ @
Name Number Office Building Q: O( l7 h! K5 p0 G c
_________ ____________ ______ ________6 y% [0 ]+ B- P( q( P/ Y& o
- v+ X( C. L" z' F
'Abby' '5086470001' '331' 'A1' w, F/ j: E4 p( p# K
'Bob' '5086470002' '201' 'A2' ' C$ E1 i* }( Z! V" v3 B; t% I
'Charlie' '5086470003' '328' 'A4'
- t: A3 |, }; M' @操作列数据
6 G6 `/ ~2 e u- T/ ^沿用NASDAQ表所导入的table:0 S- h+ B, W* Q: @5 E. q
% nasdaq table原始数据
7 C+ |) r0 V4 L2 z o+ ]9 e snasdaq = ( G' y. C+ t9 `& H
Symbol Name MarketCap IPOYear
0 H* u+ x) T$ z( u ______ _______________________ __________ _______* D2 f( ~6 O; N+ t
1 t# e* o w2 d3 i; V
'AAPL' 'Apple Inc' '$742.63B' 1980 ) Y/ U1 M1 C& K+ C' c
'AMZN' 'Amazon.com Inc' '$173.33B' 1997
. U' @) y/ D @- {+ k! T" s+ l* G 'MSFT' 'Microsoft Corporation' '$346.9B' 1986 3 u+ a2 w/ j& r! C% O
其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B
/ b0 J/ J) O2 ?% helper函数/ [: j7 E4 @, u% C4 s
function out_num = marketcap_helper(in_string), M4 \& D- @; }
out_num = str2num(in_string(2:end-1));
6 [0 k0 l3 [; y' {5 i! Bend
- c: @' [$ b; ?) z4 ^* u/ w然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:0 j+ @8 K4 _0 @! _# Y& E+ Z4 s o
% 调用cellfun对table列数据进行操作
, w! \/ V6 i+ I( e( z8 }>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap)8 o3 g: Y2 e6 Y5 ?
nasdaq = 7 ~2 e6 s0 A- G8 i' C8 l3 K, ^+ h; F' G
, D/ q: K% a: a* w2 Q# m% I& C Symbol Name MarketCap IPOYear$ A3 _: Z' H/ R0 v7 Y! J/ g, z
______ _______________________ _________ _______
: o. }/ Y& S J
3 K- I" z# n6 o" D, l: W, e 'AAPL' 'Apple Inc' 742.63 1980 ; Q- z2 Q( c, P, w
'AMZN' 'Amazon.com Inc' 173.33 1997
. n$ u1 g1 k1 ^3 s. K3 V$ V9 k 'MSFT' 'Microsoft Corporation' 346.9 1986 7 t8 u8 W9 { r+ p
table类还提供了vaRFun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:
: e8 x# y* d2 ~0 E$ R% yhoo的table在命令行的显示! o, W* |& v1 T8 n& h- s
yhoo = ' ~8 |0 L. U, u$ G" h- ~8 q
date open high low closing volumn adjusted9 x7 _5 o0 M- x) X8 e/ l6 j
__________ _____ _____ _____ _______ __________ ________& I7 Z4 ~0 ]: n4 p% v
7.3603e+05 42.57 42.92 42.18 42.68 1.0601e+07 42.68
0 @: B9 A$ k$ Y x 7.3603e+05 43.6 43.93 42.67 42.98 1.1802e+07 42.98 : T( P8 Q- m, _6 s4 f
7.3603e+05 43.98 44.24 43.4 43.44 1.1888e+07 43.44 0 e+ C" z, n' e% y5 H I
7.3603e+05 44.18 44.31 43.5 44.16 1.1868e+07 44.16 $ e6 ~9 e. q' d* h( T
7.3603e+05 42.08 44.38 41.97 43.99 3.0099e+07 43.99 % s" F2 Q) d7 j, r) V: R
7.3603e+05 43.7 43.95 42.42 42.62 2.2392e+07 42.62 & s6 ]# q/ J' Y* ^5 m1 P6 f
7.3603e+05 44.06 44.43 43.7 44.11 1.1027e+07 44.11 ( A2 {0 v5 g5 X. g0 ^3 P6 m
直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入( X2 P# E1 T _, z
% varfun对表中的列数据进行操作
4 W; ?4 g P# p! T% r6 Q2 ^; l>> varfun(@mean,yhoo(:,3))! _' s! u# ^: t+ d& ^
ans =
; \5 k+ l5 T! L mean_high9 J8 u/ ]/ `, V
_________, S% b0 M2 e0 Y/ [7 @/ A6 X
, t$ p! \1 H0 }+ W" o9 w5 |% u2 ` 44.023
3 \. D+ X- D' ?; ?* Y' Z: x再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式3 t7 }$ h' v9 ~0 V5 p) Y+ V
% 变换date列的数据格式( b! L* R" r+ s8 ]
>> formatOut = 'dd-mm-yy';
3 X: s) m. }% ~! V( V5 R. R' h>> yhoo.date = datestr(yhoo.date,formatOut) % datestr接受table输入! _' s3 y* J l# D
yhoo = 3 A, H' c* ~' D
date open high low closing volumn adjusted
, s% M2 E P8 |4 e' Q i! X________ _____ _____ _____ _______ __________ ________9 v! n3 n7 Q, M( E& l4 J
+ W3 L7 I6 `2 k. U) K: l; @
10-03-15 42.57 42.92 42.18 42.68 1.0601e+07 42.68
4 w: ^6 |1 ~4 [9 D& f* l09-03-15 43.6 43.93 42.67 42.98 1.1802e+07 42.98 8 l: d' m7 D: ] i
06-03-15 43.98 44.24 43.4 43.44 1.1888e+07 43.44
! Y' `) Y4 @4 k9 Q05-03-15 44.18 44.31 43.5 44.16 1.1868e+07 44.16
9 l p) g% @! x' R' i {, M04-03-15 42.08 44.38 41.97 43.99 3.0099e+07 43.99
7 V6 m. n9 i& R, ~03-03-15 43.7 43.95 42.42 42.62 2.2392e+07 42.62 0 i! z; `6 u/ D9 c) S- `
02-03-15 44.06 44.43 43.7 44.11 1.1027e+07 44.11
2 \! ^! B# s: v% ]% R: A有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去: R4 u$ W8 s0 [1 b/ `, L5 L
% range列的数据来自于high low和closing列数据
9 L& s' t! m' S9 W( y>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing
6 i1 M9 i4 N* L5 j0 Ayhoo = 9 V" d+ u" s( r6 N; U$ \
date open high low closing volumn adjusted range 1 E( d: ?; x" I# z
________ _____ _____ _____ _______ __________ ________ ________1 X( E3 C& H3 z# V3 V; _
10-03-15 42.57 42.92 42.18 42.68 1.0601e+07 42.68 0.017338% }6 S( ^8 ?; Q% W
09-03-15 43.6 43.93 42.67 42.98 1.1802e+07 42.98 0.029316, S: B" v3 t! b( n& v8 k
06-03-15 43.98 44.24 43.4 43.44 1.1888e+07 43.44 0.019337
: e$ U* c* F& \! M& c05-03-15 44.18 44.31 43.5 44.16 1.1868e+07 44.16 0.018342
6 f$ W% H& C5 \$ ?04-03-15 42.08 44.38 41.97 43.99 3.0099e+07 43.99 0.054785
1 y \$ Z1 @2 O Z- `: _03-03-15 43.7 43.95 42.42 42.62 2.2392e+07 42.62 0.035899
. W* [: b2 y7 B: Q7 J0 X02-03-15 44.06 44.43 43.7 44.11 1.1027e+07 44.11 0.01655
; E& G' t% o% s5 p# F排序9 t' g# U: F, R! y! E
沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical/ b, \# a) l: o# J: R3 b/ t) ~& q3 b
% 调用cellfun对table列数据进行操作
5 X( B) r) k' c/ B* O% cnasdaq = ' c! f8 f0 x7 k8 g; U
Symbol Name MarketCap IPOYear1 Y$ }7 ]7 c5 t" u1 t) v
______ _______________________ _________ _______! }& X5 o/ F" @9 I6 E% l/ Y
, I9 g/ O6 X0 x, w' ^( O
'AAPL' 'Apple Inc' 742.63 1980 ' P1 {: H+ k* x/ o! E
'AMZN' 'Amazon.com Inc' 173.33 1997 " C. W& Q+ ^9 ]6 I/ e+ a
'MSFT' 'Microsoft Corporation' 346.9 1986
9 m& _- L" t" U% O! }现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下* Z3 I i6 F! f F A {% u8 v
% 根据MarketCap列数据进行排序
y/ I& h- |: S7 v# O- N>> sorted = sortrows(nasdaq,'MarketCap','descend')
1 g9 H+ ]) x! V& Ysorted = - J N: h. S& w5 n3 f; u P
Symbol Name MarketCap IPOYear$ \* A% q. J$ w& @% M! c ~$ @
______ _______________________ _________ _______
: X- J2 h: m" C8 I8 T h, I) t; P2 y9 p. t( Z+ Y5 j2 U# U! X
'AAPL' 'Apple Inc' 742.63 1980 $ ?7 ^4 [1 j' [
'MSFT' 'Microsoft Corporation' 346.9 1986
9 ~6 i& {+ C6 K5 f% E* D% Z 'AMZN' 'Amazon.com Inc' 173.33 1997
* y' K( ~, n+ N( x: q筛选和查找
3 _4 H) x5 M1 ^9 T4 y3 Itable的下标也接受logical index, 下例选出所有股票中市值大于200B的股票' t8 ~7 O7 i, L* m
% 筛选2 ]7 R, L- D/ }7 y3 v' Y
>> nasdaq(nasdaq.MarketCap>200,:), k& u1 I7 T0 S- K% @
ans = 7 Z* l* S( b8 S, Y! N3 F
Symbol Name MarketCap IPOYear
0 a. ]& z. `8 P" Q ______ _______________________ _________ _______: m' N5 {$ X; ]# w( v$ V
0 F' ^# E: K' f% ^ 'AAPL' 'Apple Inc' 742.63 1980
! t) k! _0 q7 n, f 'MSFT' 'Microsoft Corporation' 346.9 1986
) u7 X) F* N v V' F! x如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票
: t% m/ V: m0 A5 L- t2 y% 筛选8 @4 h9 q! X; ^& ]( q2 f2 ^; v
>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:)) b1 p: Q- k9 ]9 O8 x' ~0 g0 X
ans =
& \0 t" F$ S2 k Symbol Name MarketCap IPOYear
' l# K5 Y* f J# @8 O ______ _______________________ _________ _______! Q" {8 E* {2 o# Q& P% `2 o( @' l
# S5 `5 w7 ]$ x' |# v3 M 'MSFT' 'Microsoft Corporation' 346.9 1986
2 n- F6 z* T# B' [( M) j$ r8 {logical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据
" T1 j2 I9 C2 |. s# N% 查找
5 I0 k3 A; z! g7 W>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:), X' N- F5 |- p; m6 t9 ]% R& N4 U
ans = 8 H: i+ u; m& a% c& ?
Symbol Name MarketCap IPOYear ?) m1 ~2 n6 l6 K$ u
______ ________________ __________ _______* c% T4 j3 Y# q9 K# y
'AMZN' 'Amazon.com Inc' '$173.33B' 1997
% c" @$ R) G9 Y" V4 @2 m输出到文件
) \. F7 g& y8 \ w1 v' s和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable
# _2 z' h+ g7 `3 B7 N3 i4 y6 u% writetable
5 W W# _& W( [7 g. c2 h>> nasdaq = readtable('nasdaq.csv')
# `, m0 m7 j; {) q8 x: p>> wrietable(nasdaq,'mydata.csv')
- v9 q6 `$ X- b2 d# |0 Nwritetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号, L, P* @5 v4 l8 f& {) L; i) U) \
% 指定分隔符
2 Z2 F9 Z! Z4 }$ ]9 ]writetable(T,'mydata.txt','Delimiter',' '), }* I) w% X+ v
结果如下
! q" Z% W9 k- i" E3 I( C% mydata.txt
( m% t: t) `& ~+ i7 ?5 H% w- KSymbol Name MarketCap IPOYear
# ]3 T% K( N: s/ B2 {8 lAAPL Apple Inc $742.63B 1980% \2 b, z. ?% z& C K T! J6 `8 B
AMZN Amazon.com Inc $173.33B 1997 g2 t+ h3 X1 M( f3 o( R7 a% c- m5 T
MSFT Microsoft Corporation $346.9B 1986
& a# C! M0 O* z5 C; v其它数据类型之间和table相互转换
9 K/ [; K" o: I) h7 |3 q i/ uMATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:' ~7 ?1 Y; Z0 \0 E3 J9 q& V8 O' q
Figure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:! K6 @! d$ M3 t2 K3 s
Table.1 美元人民币换算表
/ [' t, g1 N0 b+ l* |( x6 y& `
* `3 r$ x C1 l5 ^7 ~# H! KUSD CNY$ \' v% u/ y2 h7 a( H
1 6.21
5 ]. P% k, d: Q& N$ w5 31.03
! W$ M- w( X; ^, C5 i5 o2 p5 P: M10 62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置; q+ S5 T% O/ s( L
% array2table' y6 }5 B: U& s( u. Q% w
>> a = [1 6.21;5 31.03 ;10 62.06 ]: ^6 K1 }: Z; W* y/ z
a =
* P \* W! A" D, K- a 1.0000 6.2100- `) @9 W/ i* S4 D
5.0000 31.0300
5 ]$ c5 \/ j* a* a1 d 10.0000 62.0600& v6 g7 u6 E$ U6 q0 r7 u7 V9 w* x' {
>> t = array2table(a,'VariableNames',{'USD' 'CNY'}) % 通过VariableNames提供表头信息
4 n+ j! t. r- d2 B; J& Z( ?/ R- yt =
# _7 I7 u, e( ? USD CNY 2 B, {% b! j3 b8 Z- P
___ _____: j& C2 A# o5 Z# f5 S
1 6.212 P# {* M* {6 M+ @4 |
5 31.03
$ V& I1 b! K6 b4 h) {# {6 X% i4 Z" \: U 10 62.06 : i1 e7 V# X7 Y' b
* f8 o3 {) k7 C* i: F) ^; R( \如果把table再转成array,表头的信息将会被剥去
4 `8 N& p- G% M% U4 W$ {% table2array9 R+ Z. R; @2 ?& V4 k5 }
>> ap = table2array(t)
+ p6 v/ C- ]0 N9 ^; [8 G# {% cap =+ ]4 ~" f# J3 ?' {
1.0000 6.2100
) V5 j3 d0 K) y. c: m2 i% H 5.0000 31.0300* H6 E2 T+ C$ Y: M5 m1 T8 p
10.0000 62.0600
- r" F/ S9 ]# y* ^操作如图Figure.4所示:
/ y7 n0 E# q$ S9 n' g. E y2 m, N! M$ |Figure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。
2 a; P* k& c3 P' I- w x* ?0 p% struct2table
M: O+ R H$ ]5 u>> s.USD = [1 ; 5 ;10];( x9 r/ I0 Y' q: S; \
>> s.CNY = [6.21 ;31.03; 62.06];. o0 O! l# v" O
>> t = struct2table(s) % 输入s是标量
. F( g! M8 M$ D( L" }t = ' S4 z# G& @8 ~1 i. K
USD CNY * p2 V9 s( ^# {) S) L0 j% z
___ _____
% p/ b, T" e$ U6 J1 o 1 6.21: o! c( b' K3 Z# B4 d1 p
5 31.03' ^. a: [5 o+ q# G) D
10 62.06
* l4 k1 d4 I5 r9 Y J" m/ X* J+ ]
; r H; b2 r5 Q) F0 {: ]( cstruct2table还接受struct是非标量的输入
: }. f( Y0 I5 g$ m0 h( j; [% struct2table 矢量
/ \+ Y+ t# p6 y/ f* j1 K, k, Ls(1).USD = 1;: s2 b* v3 U/ h7 g C
s(1).CNY = 6.21;
! B0 A* k" U% H# B- A1 |; X$ U: ts(2).USD = 5;, k9 f0 u- c! j y
s(2).CNY = 31.03;5 p1 J4 ]% c5 W% p
s(3).USD = 10 ;
2 E! m8 ~; H7 L9 y7 |7 Y" ]s(3).CNY = 62.06" R8 {8 j" i) Z$ u! u3 w
1 l& O' V1 s% g3 t7 K3 ^- {0 K
$ P1 M( D0 \1 O6 d
% 输入s是矢量7 z' \4 h8 W) r" g$ {, [+ Q( C
t = struct2table(s)
: f* @- ]. _7 t7 l. I. y! G) E4 c* T" i# |9 p6 H! \2 H
+ m. E0 g8 c( C0 A; w, us =
" Q7 x( X0 B! S, }) E1x3 struct array with fields:
1 u4 T* v& v, j _# ]' N; l USD
$ {& H7 y4 t% U* d: s8 @ CNY& c" `% N$ @; O) c
t =
2 ?( @6 I$ [ A/ V6 T p0 G USD CNY
. `3 }; z! y! }: ` ___ _____
! G1 \* F' c- |% q( n 1 6.21
: V" }% x) f% f$ X 5 31.03
( S m8 V8 `$ q! N9 S 10 62.06
5 V3 D7 s* t2 V% o把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。
x1 T# S/ x$ {% H- i% table2struct5 z: i/ a" E& j
>> sp = table2struct(t) % non-scalar struct + l0 x0 F. \. y7 ~
sp =
! e3 A' g8 `+ @( P8 {/ U; ?3x1 struct array with fields:
8 f: Y4 C3 k& O$ t( r Z( g# x USD3 P5 U) Y3 i5 v) h- d9 J
CNY
- r. d) \& y* I `操作如图Figure.5所示:$ Y1 \, C5 {& a8 W/ b
Figure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。
+ F8 G* _- u' ^, J, ]( P6 m) i; lTable.3 电话号码簿5 ?: d+ @) |+ `. y2 t/ M$ H h
; _# t# u; ~% I p- T9 p$ `9 X2 I姓名 电话号码
. j% y, h: F: H# O8 @; H7 mAbby 5086470001
3 G- U( z$ E6 `8 y& O* I% U& cBob 5086470002
& ^0 p5 G3 z/ C1 P% Y* K WCharlie 5086470003
# x1 X5 |" d2 z0 j# ac = {'Abby', '508647001';...( v5 x6 l3 V+ F! z# K; k) l) l+ Q
'Bob','5086470002';...
3 M# y% l ^! W" ^9 L# _1 k 'Charlie','5086470003'};$ s g1 A1 k" V3 x
t = cell2table(c,...
) Q; C) _& }5 ]/ h' c& T; R, v 'VariableNames',{'Name','Number'})
# x5 W) m5 ]6 }& W+ R' j) k4 N! G k
" }6 F4 v, J8 ? `" U6 @6 v. ~t =
( |. F) n# B, }5 v- g Name Number ) o( `0 o2 c. Z3 J$ m
_________ ____________
2 y! B$ d. m& z# O6 C2 @ c8 Z s 'Abby' '508647001'
# K& R: B: e* f. l1 G. ? 'Bob' '5086470002'
`2 ]" i3 ^/ B" c2 t+ l. G 'Charlie' '5086470003'" I: S+ D: f2 b
把table转成cell,table的表头将自动被剥去
! j/ L& z* A& s5 W* ?& q1 m" |) f& ?% table2cell7 x# M% h! i" \+ Y: f7 q
>> c = table2cell(t)* x* \2 p2 l$ ]5 [, w
c = , B; j+ W* g1 E
'Abby' '508647001'
0 @( t9 y' ^+ V 'Bob' '5086470002'% F) O0 P3 y+ c' ?9 m
'Charlie' '5086470003' |
|