EDA365电子论坛网
标题:
MATLAB table数据结构(中)
[打印本页]
作者:
uqHZau
时间:
2020-12-8 15:29
标题:
MATLAB table数据结构(中)
6 S7 x3 T! J' S1 Y4 N9 L% H
目录:
, U- q/ {2 [ i8 e& w
H1 l n( z' g, Q/ J0 u4 ~' K/ N
table的操作
6 K0 y9 n. r3 x) t' r8 z
删除行列
1 o8 L& l0 m( O% i$ t+ Q8 _4 z
添加行列
3 z! U7 ? y- `: o) r2 ?
合并table
$ V9 J0 X5 v) [+ l
操作列数据
8 K; g$ v1 x+ U) O: p w/ e; t
排序
0 \7 ^4 _8 h) {) G! A6 J9 J
筛选和查找
& z4 B; ^! f/ B
输出到文件
' h' o2 E% w- ~4 a
其它数据类型之间和table相互转换
8 b! s N; V7 m$ Q, L8 W0 y
table的操作
' w0 t. t$ s' G: \ W' e
删除行列
+ I7 |0 \1 q4 l
删除一个table中的某行只需要对该行置空即可:
$ a6 j+ f* n6 d" Z
% 删除行
$ h/ _7 s' v/ J1 m0 v8 H
>> nasdaq(3,:) =[]
. [5 q6 H1 L2 w3 p" w
nasdaq =
8 i& u, O# Y8 K1 B
Symbol Name MarketCap IPOYear
/ p: v9 n0 b6 L+ v2 x
______ ________________ __________ _______
2 H i( E2 a* C; h
% ^7 t" R& u! v
'AAPL' 'Apple Inc' '$742.63B' 1980
( w$ K9 @: a) ~* U* D6 T5 A
'AMZN' 'Amazon.com Inc' '$173.33B' 1997
9 a: `# c; ]) V8 g
以上是nasdaq中的第三行MSFT被删除后的结果。 同理,删除一个table中的某列也只需要对该列置空,在上面删除了第三行之后,下面的代码继续删除第2列,于是nasdaq变成一个2行3列的table。
( y# T1 E1 S3 }3 _" Y: {, s
% 删除列
2 ^! j* D5 a7 @# W
>> nasdaq(:,2) =[]
8 X; C/ A ] ?: Z; U+ g2 l
nasdaq =
+ [8 k/ h9 Y4 Q( C
Symbol MarketCap IPOYear
) ]) e u, C+ g
______ __________ _______
% u6 ^7 ]) O. ^! s! J0 j/ r
, {3 A5 h* a# x* Y- J( [/ {% T6 g
'AAPL' '$742.63B' 1980
7 Z _# F+ Z2 s' v
'AMZN' '$173.33B' 1997
S: |1 `1 C4 m! t/ j! M
删除列还可以通过Dot的语法,只需对表的VariableName置空即可
2 x" `1 \( r8 \0 ?- O$ _
% 删除行
* \" T6 l, Z" j/ [4 ~; s I
>> nasdaq.IPOYear=[]
( b$ q" {6 J/ r' t) S# d
nasdaq =
2 i( e2 Z+ u. ]$ g8 W0 z3 J' K
Symbol MarketCap
( x) V' Q5 H: Z. F) Y
______ __________
. F; S2 p! J( ^+ D
4 _: G$ E& z. }+ x- ?4 S0 t% r
'AAPL' '$742.63B'
8 p: t5 e) S$ u! R! S
'AMZN' '$173.33B'
) d* a Q* F7 M4 D2 @7 y& b$ ?
添加行列
; F* ~& K J! E) V2 M3 x
沿用上节中的Nasdaq的数据,假设我们要给表中添加一列,名字叫做Sector,该列关于公司的文字的描述,可以通过Dot语法来完成
: J9 V. u0 N) k
% 添加列
/ Q7 j. C' H( f+ }
nasdaq.Sector={'Computer Manufacturing';...
: C, o4 X$ p$ ^. U
'Consumer Services';...
! K/ ]4 N" f. c- Z3 P4 ~
'Computer Software'}
7 z: t9 B+ {4 \% r& D8 [0 y
注意,这里等式的右边是一个列向量元胞,结果显示如下:
3 k4 G3 u5 p* w0 w) v: O( X2 m
% table新增了Sector列
' d. F/ n5 v- M+ ?9 l( Z
Symbol Name MarketCap IPOYear Sector
9 b2 r: j9 g' L1 X% Z4 F% M
______ _______________________ __________ _______ ________________________
. J9 Q9 y% C# R$ R+ p
'AAPL' 'Apple Inc' '$742.63B' 1980 'Computer Manufacturing'
8 {! M; H3 [) L1 U. k* [2 w
'AMZN' 'Amazon.com Inc' '$173.33B' 1997 'Consumer Services'
% t0 O3 ?& A# }0 |7 V' B6 K
'MSFT' 'Microsoft Corporation' '$346.9B' 1986 'Computer Software'
; G6 v. A" c% K
/ I( T1 b6 B7 a4 C7 k7 _
前节提到,把table中的行数据取出来,该行的数据类型仍然是table。同理,如果想要给table添加一行,该行也必须是一个table,可以通过下面的方法给table添加行:
A3 b! d) W- d9 Q0 n3 f& @
% 给table添加行
* `' g7 D1 N: a4 O
newCell={ 'FB','Facebook Inc.','$ 231.62B',2012,'Computer Software'}
: d9 A2 C; K6 I3 l5 q- m
newTable = cell2table(newCell)
. f! T5 r S! H+ `9 X+ R: Z2 m
newTable.Properties.VariableNames = {'Symbol','Name','MarketCap','IPOYear','Sector'};
, a. `8 O4 h( u, R/ B# s) P! M
newNasdaq =[nasdaq;newTable]
4 S2 z" \. ?" N
其中第1行先构造一个包含数据的元胞,第二行把该元胞转成一个table,但是尚未指定表头,第三行指定表头,第四行把nasdaq和新建的table进行串接构成新的table。
) Z# {6 d/ B. A+ q$ w! F) j
合并table
2 o( G2 D- A- k1 G0 }( y3 F9 u
合并table可以理解成给已有的table添加多个行或者列。如图Figure.1,Figure.2 所示:
& j- S$ s, q( R4 [
Figure.1 横向合并table Figure.2 纵向合并table 图Figure.1横向合并示例如下,已有两个电话号码簿table, 分别是t1和t2:
2 W5 R! B4 w' e5 ]7 t5 x7 p
t1 =
* g1 m5 `* T. j6 t
Name Number
! g4 }7 P& r+ d6 h/ N$ W
_________ ____________
3 H( g/ L3 q7 x* k1 ?
: ^' v2 ^% e5 B4 s- f, @) N
'Abby' '5086470001'
2 |8 m5 v5 l: G) {( n0 O5 t
'Bob' '5086470002'
/ D, q$ s6 Y7 j0 Z4 N+ j
'Charlie' '5086470003'
! |! u6 m: N( w4 n
t2 =
9 r! u8 s- \; C5 f) Y3 a7 J: b
Name Number
$ w: V. W: [! F; S, ^, D( s
_______ ____________
0 v# W) `, ? r! J
6 P, _+ k3 C$ t4 J& p, r, g
'Dave' '5086470004'
2 r# T9 A& H: G( |
'Eric' '5086470005'
6 w- S$ X' D, R$ L, E
'Frank' '5086470006'
) g0 S7 ]4 t" \; G( F
横向合并table可以使用MATLAB的数组串接的语法,如下左做所示;或者直接调用vertzcat函数(table类重载了vercat函数,左边的代码将触发对vercat的调用),如下代码框右所示:
) G3 E( p! Z3 b. l2 |
% 直接串接table
1 q E' {0 K' c
>> new_t =[t1 ; t2]
5 z# s/ m' m/ ^) s- P6 j" }
new_t =
0 e+ K1 m* w- |
Name Number
9 c2 Q6 N8 U5 k# C: W1 Z
_________ ____________
/ T# Z, {; B# q6 N
F/ H+ O/ S0 ?9 `; T0 F3 a
'Abby' '5086470001'
0 r& l% }% N% k" y
'Bob' '5086470002'
6 M3 {& l: E, j0 \5 B8 C
'Charlie' '5086470003'
$ v% Y( s* \* d) @/ l+ J1 H4 b o, i
'Dave' '5086470004'
/ G9 g7 Y+ |( Q) ?# d; a
'Eric' '5086470005'
% a* X; L B0 n
'Frank' '5086470006'
1 }) u m5 z+ b- P- k$ c
% 使用vertcat
( T0 [ }6 T% Q8 w+ T
>> new_t = vertcat(t1,t2)
9 ]; q, @! H$ U' [. n- X& K
new_t =
: r4 h" M- H1 ]* d% [7 h9 m
Name Number
% q7 _" G- M6 t4 {3 F3 \
_________ ____________
- i( B! L \" @! M- c
+ E4 g" C3 G" q
'Abby' '5086470001'
" {, D) a: |6 T' o$ Z9 H
'Bob' '5086470002'
2 s' h- B6 V# t- b1 U' e$ j+ \
'Charlie' '5086470003'
X! N( Z) P" k7 c' p. ]8 e
'Dave' '5086470004'
' A; L* a% J y8 O' U) g9 j
'Eric' '5086470005'
m9 I" @5 }8 c" k& x) \
'Frank' '5086470006'
s! X+ h: l; i; t7 ^: o/ T
图Figure.2纵向合并示例如下,已有号码簿t1,以及另一个关于办公室和楼号的table
6 p9 F+ l/ p8 B3 L$ ?' O
t1 =
`1 }/ v6 O1 M( U$ a3 C
Name Number
" T z1 a# o/ r2 H& g% U
_________ ____________
' j9 u% J, L' G1 z
9 h; r9 \8 w7 f6 Y" M
'Abby' '5086470001'
$ D7 _7 U4 G% U: q, Z
'Bob' '5086470002'
! O( w/ w% ]* s; @ P; P5 }3 X
'Charlie' '5086470003'
6 L: `0 x- r# F7 E+ p( j
t3 =
E2 k1 K+ U# R; S* P
Office Building
8 O; K: e4 X( \1 \% J& z( V
______ ________
' Z$ e9 p* \7 i; [
# `6 C. e) i U+ K
'331' 'A1'
: O% P5 o# z3 ~- ], s8 e
'201' 'A2'
4 x7 F5 |5 P0 H8 m$ |' |9 h8 \
'328' 'A4'
* S! h- s3 ]+ s( R5 N& ]
横向合并table可以使用MATLAB的数组串接语法(这样的直接连接似乎有些不和逻辑,Abby不一定正好对应了331 A1这一行,在Join Table 节中将完善这个例子),如下做所示
( v# W# `4 I) H/ q" C' ]& x8 x
% 直接串接table
; J: K5 C3 Y: g# h, S
>> new_t = [t1,t3]
5 v& i# N! c* x- R5 H+ g
new_t =
( `! U# a, w' M1 W1 S$ ~# k8 g( j9 u
Name Number Office Building
1 Q: l( ?5 A) T6 v: M
_________ ____________ ______ ________
@6 {7 P4 @- I; W5 O/ t% W% m
; R# S& Q: l. q" S" P7 J: {- ?
'Abby' '5086470001' '331' 'A1'
) g$ x$ B* _; {$ ?/ B& z
'Bob' '5086470002' '201' 'A2'
* f6 E+ p* F4 o6 C8 c' E* q3 @" C# p
'Charlie' '5086470003' '328' 'A4'
" L1 j; P% p$ q* E, C
或者直接调用horzcat函数,如下代码框所示:
! R7 P( h1 a) t3 n/ L. B9 } q" Q
% 使用horzcat
$ z+ t8 m- Y0 v* e0 J
>> new_t = horzcat(t1,t3)
5 D/ v1 Q* O/ q# \# V$ r1 N* o
new_t =
! P8 Y$ l) g% M& @4 m
Name Number Office Building
- V3 F2 W+ O+ k/ y# S# J, L
_________ ____________ ______ ________
0 O8 L+ |$ p0 _* a
! X, S" g6 h4 W& b6 C) R
'Abby' '5086470001' '331' 'A1'
) Y! \2 M. p' H+ E) W/ |
'Bob' '5086470002' '201' 'A2'
8 T% @6 B0 H8 ~ ?0 W9 I: l
'Charlie' '5086470003' '328' 'A4'
$ N& D; P6 ]" n( k& \
操作列数据
$ P* E; e, ^9 R( ~1 {
沿用NASDAQ表所导入的table:
1 e$ S6 ]" h. Z. N& R
% nasdaq table原始数据
" \% a8 X3 x* E
nasdaq =
! f& o; w( [: m! C2 w0 I r N) F2 q
Symbol Name MarketCap IPOYear
( d( K$ v) h+ d- S
______ _______________________ __________ _______
- d0 `! V5 _! q" @
. P. S6 O) B* |/ G% X& ^! ?8 W ~" E
'AAPL' 'Apple Inc' '$742.63B' 1980
9 z9 B1 G/ p) |. f
'AMZN' 'Amazon.com Inc' '$173.33B' 1997
3 Q, z; s9 T! Z/ O' b
'MSFT' 'Microsoft Corporation' '$346.9B' 1986
" Y0 w$ L4 q6 {3 O/ e3 v4 N J' P
其中第三列市值一项中的内容是字符串,这节通过去掉MarketCap列数据中的$和B符号,把该列转成Numerical的类型,来演示如何对整列的数据进行操作。 前节"访问table中的数据"中提到使用nasdaq.MarketCap访问table数据返回的将是一个元胞数组,所以最简单的对该table的MarketCap列的操作方法是使用cellfun。我们定义如下helper函数帮助去掉字符串开始的$和结尾的B
7 z9 a8 m4 q- Z& q7 q
% helper函数
- }+ t z4 ^% ]' R( Y
function out_num = marketcap_helper(in_string)
, f! G) L3 f; F2 k+ W. q
out_num = str2num(in_string(2:end-1));
. X. v: O4 Z m& v9 U
end
4 u1 ~4 I4 N5 |) ~
然后直接调用cellfun,并且把得到的结果再赋给nasdaq.MarketCap,结果如下:
1 { q9 |" X" T$ k( x
% 调用cellfun对table列数据进行操作
: s. k6 Y- M" S
>> nasdaq.MarketCap = cellfun(@ marketcap_helper,nasdaq.MarketCap)
( e: k( |- w) V4 V3 v. x1 A; O# J4 _9 w3 B
nasdaq =
1 w) W. [- J+ J. t( {- t+ w
3 p, q+ `6 x* O; k; c" m" G, r
Symbol Name MarketCap IPOYear
" w. e) M3 ^: u1 i) e* V
______ _______________________ _________ _______
, B( e6 k) B$ K* r* Z
, K$ I% O8 P' v# F1 }" u, s8 D
'AAPL' 'Apple Inc' 742.63 1980
2 V. f$ O! ^/ g; G& }3 r. k* {0 h
'AMZN' 'Amazon.com Inc' 173.33 1997
& H! X% g- x' W& M5 I. E
'MSFT' 'Microsoft Corporation' 346.9 1986
& Q% Q, c" Z) ~2 F9 R
table类还提供了varfun方法来进行列操作,和使用cellfun的区别是,cellfun的处理对象是table中的一部分,即元胞。而varfun处理的对象直接是table对象。下例中对Yahoo股票table的第二列7天的开盘价求均值:
4 q, E7 `3 }$ R
% yhoo的table在命令行的显示
$ I7 y+ h9 k% q1 L1 A5 e
yhoo =
5 u. Y1 l/ P# \$ H. g
date open high low closing volumn adjusted
5 C# }! j- ~# T9 r4 U/ }# e
__________ _____ _____ _____ _______ __________ ________
- K/ r" P( Z; h0 z) N
7.3603e+05 42.57 42.92 42.18 42.68 1.0601e+07 42.68
v e7 g) f% l: E
7.3603e+05 43.6 43.93 42.67 42.98 1.1802e+07 42.98
9 r+ f9 W5 A7 `! k9 Z
7.3603e+05 43.98 44.24 43.4 43.44 1.1888e+07 43.44
1 m! a% V/ L" A9 w# O
7.3603e+05 44.18 44.31 43.5 44.16 1.1868e+07 44.16
' Y! `% F) W* r+ ~% y
7.3603e+05 42.08 44.38 41.97 43.99 3.0099e+07 43.99
2 t- J+ A5 a9 X
7.3603e+05 43.7 43.95 42.42 42.62 2.2392e+07 42.62
9 _, X' c+ ^" E4 y$ ?' ` k Q/ q
7.3603e+05 44.06 44.43 43.7 44.11 1.1027e+07 44.11
" {4 h) o8 h6 z- c1 r& \. k
直接把table的第三列提供给varfun即可,注意varfun的第一个参数是函数句柄,该函数必须能够处理向量的输入
$ Q" R" V! t, ]: I7 W% X$ A7 m$ h
% varfun对表中的列数据进行操作
Y; @" o3 d- f# z+ s1 k7 u
>> varfun(@mean,yhoo(:,3))
+ \; q9 G; K0 |# k" M
ans =
e1 m6 s; E: L% j+ q0 o' c
mean_high
+ g$ A& y+ J, z
_________
w1 u6 L4 W% B5 l6 U5 w2 ^- h: K
- E8 {4 q/ B4 h$ U8 u4 \* |
44.023
0 n9 a S) Z! L9 l0 P M! p
再举一个例子,观察上表的第一列,其中日期使用整数形式的输出,难以阅读,我们可以通过datestr函数对其第一列做操作,转化成易读的字符形式
U' A3 d7 c3 G4 ~5 b
% 变换date列的数据格式
( a$ w8 ?) v: U
>> formatOut = 'dd-mm-yy';
4 @- K ^ D$ ~& X
>> yhoo.date = datestr(yhoo.date,formatOut) % datestr接受table输入
& f+ k" t+ O i1 K7 T
yhoo =
" x" P$ g5 b2 ?+ h0 w8 o
date open high low closing volumn adjusted
+ o6 w* |+ S J b9 }
________ _____ _____ _____ _______ __________ ________
$ C. h1 z, B" Y7 P4 G
# {, n, {/ f" Z' U% o8 [
10-03-15 42.57 42.92 42.18 42.68 1.0601e+07 42.68
6 B8 r& }+ S$ c1 A( x) R6 W
09-03-15 43.6 43.93 42.67 42.98 1.1802e+07 42.98
% V6 |2 c) S) M0 t# a' J8 N V6 I
06-03-15 43.98 44.24 43.4 43.44 1.1888e+07 43.44
0 v' Z/ f2 O8 c7 Y) D# Y
05-03-15 44.18 44.31 43.5 44.16 1.1868e+07 44.16
* |- |& I; t0 L1 H# E- K% E- Q& Z
04-03-15 42.08 44.38 41.97 43.99 3.0099e+07 43.99
4 p$ @4 ]) P- g$ S0 T( L
03-03-15 43.7 43.95 42.42 42.62 2.2392e+07 42.62
! c0 m/ }6 {2 I7 p, r n
02-03-15 44.06 44.43 43.7 44.11 1.1027e+07 44.11
[1 i; O, B/ }3 A4 B
有的时候,我们还需要计算一天的股价相对于收盘价的变换范围,下面的程序用最高价减去最低价,并且除以收盘价,并且把得到的结果放到一个新建的列range中去
/ A5 X( a [: E& T* p% a- }
% range列的数据来自于high low和closing列数据
5 W: c0 P7 N( m$ l& c3 j- _
>>yhoo.range = (yhoo.high - yhoo.low)./yhoo.closing
! f9 x3 _: w' m7 A' }
yhoo =
& f5 q9 ?3 C/ |
date open high low closing volumn adjusted range
8 T4 P' o$ w# p. q! O( g* o
________ _____ _____ _____ _______ __________ ________ ________
" m6 U- l. H+ w' n
10-03-15 42.57 42.92 42.18 42.68 1.0601e+07 42.68 0.017338
8 n4 j/ `6 J4 u& W2 Z+ e }
09-03-15 43.6 43.93 42.67 42.98 1.1802e+07 42.98 0.029316
( E# E0 |, c% Q- [
06-03-15 43.98 44.24 43.4 43.44 1.1888e+07 43.44 0.019337
# C( S# c# M" ?8 W
05-03-15 44.18 44.31 43.5 44.16 1.1868e+07 44.16 0.018342
1 G. E; \/ D: @# C+ l
04-03-15 42.08 44.38 41.97 43.99 3.0099e+07 43.99 0.054785
/ T9 t9 n# p5 J+ F3 w6 ~+ }
03-03-15 43.7 43.95 42.42 42.62 2.2392e+07 42.62 0.035899
( `/ S6 `/ h3 a/ q' x
02-03-15 44.06 44.43 43.7 44.11 1.1027e+07 44.11 0.01655
6 m0 I) X" L, G1 c
排序
7 f+ I: C9 Y8 k( j$ h% k
沿用上节"操作列数据"中处理过后的数据,现nasdaq表中第三列中的数据类型,通过调用cellfun函数变成了Numerical
+ H p$ z9 ~: W& M
% 调用cellfun对table列数据进行操作
3 Y7 l! L* Z6 m7 L# h; s0 ]
nasdaq =
; l9 z7 P& r- N. u) U1 ^8 O
Symbol Name MarketCap IPOYear
- l- |$ ?- L% [' r6 v. q9 T: @$ J
______ _______________________ _________ _______
) G! B; Q4 W: f' a
+ Y% ?% Z/ F2 |! K: a" q
'AAPL' 'Apple Inc' 742.63 1980
3 u- R0 {! a# E4 o( r7 h; f
'AMZN' 'Amazon.com Inc' 173.33 1997
: }6 U W/ x- R+ p' s
'MSFT' 'Microsoft Corporation' 346.9 1986
1 ^/ B8 ~, n( M; O
现在我们可以通过调用sortrows函数对三支股票的市值进行从大到小的排序,结果如下
8 P2 |2 j. v; r5 T- j7 i5 [
% 根据MarketCap列数据进行排序
* d) O: G4 U- Z' c1 N5 y5 ]
>> sorted = sortrows(nasdaq,'MarketCap','descend')
4 |0 o# _7 B9 y# V8 z
sorted =
3 E, c- K0 m7 y' v# e
Symbol Name MarketCap IPOYear
/ S( _. r+ u& H. p; n9 t( Z
______ _______________________ _________ _______
& S9 }0 J6 y# @& R4 X) f
+ d+ i0 ^) P8 g8 _' P* N$ ]
'AAPL' 'Apple Inc' 742.63 1980
) ~5 o& G( E% Q- V( U
'MSFT' 'Microsoft Corporation' 346.9 1986
' S1 F) V3 ~* i) H$ E
'AMZN' 'Amazon.com Inc' 173.33 1997
# ]8 v4 Q( E2 X
筛选和查找
- Y; V) V3 [; c. @+ X
table的下标也接受logical index, 下例选出所有股票中市值大于200B的股票
% l" u) A6 G3 C, l% ^
% 筛选
% W2 j2 e$ H/ w8 F
>> nasdaq(nasdaq.MarketCap>200,:)
9 W0 t/ y! N! i" K( D8 [( h
ans =
: i- A4 P/ k+ K+ o
Symbol Name MarketCap IPOYear
5 S' f! k# W% y+ Q& d8 k, Z2 [
______ _______________________ _________ _______
: d$ d6 s/ H) I
5 I6 G' S. R7 y: G7 H0 X5 H) z
'AAPL' 'Apple Inc' 742.63 1980
1 Q- a4 M+ [( J; y6 @2 A% T
'MSFT' 'Microsoft Corporation' 346.9 1986
9 p# G; V0 T' i+ t- F/ M
如下选出所有股票中市值大于200B的股票并且在1985年之后IPO的股票
; y5 l5 S! e' e
% 筛选
6 [9 Z% `+ `+ K- v! }3 i4 B2 Q& P
>> nasdaq( (nasdaq.MarketCap>200) & (nasdaq.IPOYear > 1985),:)
. z) M& \+ B8 i2 A6 M( n( n
ans =
* M/ x$ R" q6 c* ?# ^! M
Symbol Name MarketCap IPOYear
) v4 ^4 H* `" d2 T2 _# @
______ _______________________ _________ _______
; Y! V4 z& Q6 X1 |0 a3 R" E: c
; j8 i. i' i: _3 \2 R
'MSFT' 'Microsoft Corporation' 346.9 1986
5 g% O4 G2 g3 D
logical index还可以提供查找功能,下例查找所有行中Symbol='AMZN' 的数据
$ p' o( y% R3 d7 `/ H
% 查找
( q! h8 r# h7 d A, L7 R
>> nasdaq(strcmp(nasdaq.Symbol,'AMZN'),:)
4 k7 T8 s! r ~
ans =
7 P; e/ V W; u; N9 _" t
Symbol Name MarketCap IPOYear
0 H/ [4 {9 i1 Z$ s: E* g- A# B
______ ________________ __________ _______
6 u* J, h) Z1 z$ Y5 n* {* w
'AMZN' 'Amazon.com Inc' '$173.33B' 1997
* H ]; K& S+ T" [% B- @
输出到文件
+ k4 E, a( y# R8 X
和readtable对应,把一个工作空间中的table写到文件中去可以使用writetable
% B% ?: h, A. k5 R
% writetable
1 ^ N6 E& @- i! V
>> nasdaq = readtable('nasdaq.csv')
5 B6 e {$ p: g
>> wrietable(nasdaq,'mydata.csv')
1 p) V9 O- N4 C" [8 K
writetable默认的分割符是逗号,writetable还可以通过delimiter来设置分割符,下例空格代替逗号
& F. m& X" }, e, V0 c
% 指定分隔符
& [& B! U% q& S' B) ]
writetable(T,'mydata.txt','Delimiter',' ')
1 h" D1 m- }" ~3 i3 i( o- Y
结果如下
- }1 R) H% Q5 q$ ?9 Y Y
% mydata.txt
1 w: c8 A6 h- i. {/ I" u% s9 D
Symbol Name MarketCap IPOYear
0 b; R+ j% u( L# `3 o* u" P- z5 Z, S
AAPL Apple Inc $742.63B 1980
% X+ t2 h1 ]3 f( J2 o9 E1 j2 n; D; C
AMZN Amazon.com Inc $173.33B 1997
b8 o" L, E% j3 M
MSFT Microsoft Corporation $346.9B 1986
) {9 `. w% l! O# n N! `
其它数据类型之间和table相互转换
4 C/ A: H) Z) a$ I( a
MATLAB支持table和struct,cell,array之间的相互转换。如图Figure.3所示,下面一一介绍:
! ]0 U" }8 Q9 H
Figure.3 table和其它数据的转换 本节使用数据如表Table.1所示,内容是美元和人民币的货币转换速查表:
8 G. z& w* k0 f3 j1 }" Q; w1 }
Table.1 美元人民币换算表
8 C% x Q6 @3 m. X. n x
. U7 I0 ]. l2 R$ I
USD CNY
) ]- W Z& W) w& S5 j! h
1 6.21
% I' R; p. C7 E! @1 g
5 31.03
1 Y6 P8 J5 X) t
10 62.06 先讨论array和table之间的转化,下例第1行用数组a表示表Table.1中的内容,第6行把a转成table,表头的信息需要通过VariableNames来设置
3 l; H) _# r# T. u) q. [: _9 |
% array2table
' ~# D9 l5 @. K# b
>> a = [1 6.21;5 31.03 ;10 62.06 ]
$ X2 o+ z# w9 i. h
a =
2 H7 j9 b' ^" [( H' y4 z) @6 }. |
1.0000 6.2100
) Y* e1 E) B$ V& G8 Q; `
5.0000 31.0300
: l K+ c: s2 x* b0 F, }
10.0000 62.0600
( o( ]* L7 P) J9 x
>> t = array2table(a,'VariableNames',{'USD' 'CNY'}) % 通过VariableNames提供表头信息
9 R- h) v# a/ L( U p
t =
1 e; R; [! a" \$ S4 I0 ~
USD CNY
: s6 L. B) f' y1 ]1 T
___ _____
7 b) |8 T0 O) k
1 6.21
" z9 G# l) Q4 ?0 G* q
5 31.03
# W C$ ~* R: k) S1 |( m5 T( w( x
10 62.06
" p4 q/ Y. ^+ I7 u8 y
; B, o" M7 y9 e
如果把table再转成array,表头的信息将会被剥去
8 ^+ `+ c3 J) h( c+ g+ o9 d
% table2array
2 b6 M5 B6 j' P
>> ap = table2array(t)
4 {" y/ v9 z; ~, f9 m } Z
ap =
3 H" K7 ]0 E0 V$ s2 r4 a
1.0000 6.2100
/ i/ u2 Y; j' ?* O8 s* \# D
5.0000 31.0300
0 r/ J# s$ N( E1 j. H( O
10.0000 62.0600
. F3 c& g' y0 E2 V0 t
操作如图Figure.4所示:
6 x9 Y. G9 M; j$ Y5 o5 m
Figure.4 table和array的转换 在讨论struct和table之间的转换,下例第1,2行给struct的field赋向量,来表示表Table.1中的内容,第3行并且把它转成table。
: v- h' ^- U* ^) e& x0 z. x0 v( t% \, l, J
% struct2table
* S- f& J5 S) B8 j$ F: Y
>> s.USD = [1 ; 5 ;10];
) d) f1 \3 g# H, B% c& G' Y4 S
>> s.CNY = [6.21 ;31.03; 62.06];
4 r# F5 n( |0 P& L
>> t = struct2table(s) % 输入s是标量
/ d# H4 B9 y( T4 e* a
t =
' y, {6 Q6 T; H
USD CNY
' h+ z( J ~" N+ j/ y
___ _____
4 }: O2 T- J! \6 l1 k I
1 6.21
! Z% A, L, R9 U2 v$ X: h2 h
5 31.03
9 r* J$ W5 B) Q/ {. B; V
10 62.06
. ?- U1 [1 k0 G& G, v, N, y, m2 ~
0 O& @$ h: D& Y; ?
struct2table还接受struct是非标量的输入
6 y6 }/ B/ a0 O X* \3 |
% struct2table 矢量
; [/ {7 C0 X( x3 ~- x! o; \* v
s(1).USD = 1;
) N2 q4 W, ]3 O- r' }, g& ~
s(1).CNY = 6.21;
( e: {% O2 n' D+ p+ |( ~
s(2).USD = 5;
4 D5 L# P$ N2 l$ I4 K
s(2).CNY = 31.03;
: y/ Y# }. o+ P! F: V
s(3).USD = 10 ;
" K3 L7 W+ D# P$ f, y
s(3).CNY = 62.06
, V1 W" Q3 b z6 P" R8 Z
0 `/ h: Z' d B
' f( a9 a) W. I0 H
% 输入s是矢量
/ a5 S: A2 v( I8 o4 G
t = struct2table(s)
/ P# r# o7 D5 l" N; q |
5 ?, k6 N; x. G4 G" v4 |3 \
4 t( |7 E/ y I
s =
3 N: x0 L# X( d, i. Q
1x3 struct array with fields:
. {+ @, U; P% j7 K# H/ P
USD
% ^0 g. Z4 y3 e4 j( b0 W; C
CNY
. `2 u0 F1 y4 _, i; V' y: O' T! e/ \
t =
: Q. d, E! A& L1 F: O
USD CNY
! o4 H- \ t# Y9 w, V
___ _____
' V$ Q; ]3 N A2 j4 d" g/ T
1 6.21
( n x2 a. R$ j2 A6 T% D+ \7 z
5 31.03
" |) L- M Q, ?& m4 j
10 62.06
6 o8 Y1 O% B5 c$ g# o
把table转成struct,table的表头将自动变成struct的field的名称,得到的是结果是结构体数组。
" Z- N4 n. }# P! D# D
% table2struct
! D( i& _5 Q9 u
>> sp = table2struct(t) % non-scalar struct
/ I. j1 _2 B) n
sp =
1 b. V( I4 L5 v" q: Q
3x1 struct array with fields:
2 d7 K$ O6 D9 c! m
USD
' H" [: D% _; v2 r7 V' p: N! q j
CNY
( x k' k S. j3 m* t/ r% v2 |
操作如图Figure.5所示:
% m* t! T+ s7 H5 U- d
Figure.5 table和struct的转换 最后讨论cell和table之间的转换,下例用cell表示表Table.3中的内容,并且把它转成table。
- @& R0 O- v6 e9 |. Q
Table.3 电话号码簿
+ ?3 C; l5 M. D% q& H6 Y' f1 \
7 {( D& {5 \& _4 G9 V
姓名 电话号码
" |7 q. Z! H1 s1 |% {' ]: R
Abby 5086470001
. K* S& X) ~/ g& A6 X+ m
Bob 5086470002
6 Q& c0 G3 K( T7 H3 i
Charlie 5086470003
- s$ ~$ D" E4 S* y7 V; h: ?
c = {'Abby', '508647001';...
- ]/ K# u) E) w# T$ Q7 }
'Bob','5086470002';...
: [( L- y" L( u. _7 ~
'Charlie','5086470003'};
9 E( }+ C8 x! a, O7 }
t = cell2table(c,...
3 u, h; J! O6 Z3 q q
'VariableNames',{'Name','Number'})
" O: m! V! M M; x" F; z! F/ f
; r4 j g' o' F) C$ o! e2 f
( O% |( o+ `! U% u' t
t =
- C4 ], v6 @) @. v
Name Number
7 `0 W) |8 i3 T/ |8 h3 ?% }& H' ?
_________ ____________
! @' r0 F- \/ J+ h) Q3 L# Z, U
'Abby' '508647001'
/ J" I9 w! ^0 {1 N1 P
'Bob' '5086470002'
' x# w4 d5 {5 p
'Charlie' '5086470003'
4 ?& ~2 s; g- s) |( ]5 s+ _) ?
把table转成cell,table的表头将自动被剥去
0 n$ B* h; |1 _7 z, }8 L
% table2cell
$ R# W, \9 d7 {" W6 x3 R
>> c = table2cell(t)
. @1 O! Q* y6 e$ E" N( I" n8 m: @
c =
f) \. t- J! s* C# d
'Abby' '508647001'
4 D$ G8 K- a+ A+ }6 v4 @' d
'Bob' '5086470002'
) t, `9 M6 _1 T
'Charlie' '5086470003'
作者:
CCxiaom
时间:
2020-12-8 16:19
MATLAB table数据结构(中)
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2