EDA365电子论坛网
标题:
MATLAB table数据结构(上)
[打印本页]
作者:
uqHZau
时间:
2020-11-30 11:18
标题:
MATLAB table数据结构(上)
本帖最后由 uqHZau 于 2020-11-30 13:25 编辑
# j& i/ j Z0 b. p" n9 E
. c1 y3 F( m5 v& G* y
目录:
2 P. G$ A1 M$ @/ J
table简介
为什么需要table数据结构
通过导入数据构造table对象
调用table构造函数来构造table对象
通过转换函数构造table对象
访问table中的数据
* w8 K% V0 J8 p1 F
9 X% V) K% t9 n
MATLAB常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除了这些基本数据类型,MATLAB还有很多其它的数据类型不为人熟悉,这些数据类型在编程中也非常有用。MATLAB高级数据类型系列旨在向大家介绍它们:比如containers.Map, tables,enumeration和time series等等,它们为什么有用,用来解决什么问题,并且怎样在科学工程计算中怎么使用。上篇我们提到了映射表结构(containers.Map )。本篇将介绍另一中新的MATLAB数据类型--table。
% \1 y Q' X$ |/ C
3 {% S' z7 t9 |$ Z+ C0 F8 Z+ {9 g8 V
table简介
, D4 l' g( _: L* Y3 l9 C2 C9 k
为什么需要table数据结构
, k9 s* H4 ]. f: ]# W1 d9 ]
MathWorks在MATLAB R2013b中引入了一种新的数据结构叫做table 。table类似统计 工具箱中的dataset ,其引入的目的就是用来取代dataset的数据类型。因为表状的数据在工程计算中越来越长久,有了table 类型,MATLAB用户就可以不用购买统计工具箱,也能使用表状的数据结构了。 table本质上来说是一种可以存放各种数据类型的容器,比如下面表Table.1中的数据,其中既有字符型,又有数值类型,其中第一行作为表头:Symbol,Name,Market,Cap,IPO, Year是各列的名字。
( M/ r) D8 D3 b( E
3 d1 [1 R- @/ l7 z3 B' X' `0 r
Table.1 NASDAQ股票名称表
Symbol
Name
Market Cap
IPO Year
5 @! X x, B7 s0 o0 z9 |
AAPLApple Inc$742.63B1980
3 \; q3 E9 ~9 Z& z
AMZNAmazon.com, Inc$173.33B1997
2 n5 ~5 \3 a2 x6 q3 P; y- m
MSFTMicrosoft Corporation$346.9B1986
& h+ p" V$ s3 Y- S
在conatiners.Map的章节中,我们介绍了MATLAB的基本数据类型(比如数组,原胞数组和结构体)在表达某些复杂数据类型时的局限性。这里不再一一赘述,读者只需要认识到:数组的局限性在于不能用来存放数值以外的数据,而使用元胞读取和索引内容时有种种不方便,比如无法区分该数据中的表头和其余的行数据。事实上,如果数据存放在如下的CSV文件中,并且用importdata 直接读取表Table.2中的CSV文件。
7 {4 H/ S" q3 D4 k4 W
4 v# U9 f" Z" O4 b
Table.2 Nasdaq 的 csv 原始数据
9 j9 o/ t" r7 z# ?0 X
"Symbol","Name","Market Cap","IPO Year"
. ]; K3 n/ l) c( I3 _- [- W0 M
"AAPL","Apple Inc","$742.63B",1980
1 \6 W! z& u' ~; _
"AMZN","Amazon.com Inc","$173.33B",1997
0 J, _$ Y$ W9 ], q& ?3 J+ }
"MSFT","Microsoft Corporation","$346.9B",1986
! F F1 l0 `8 Y: Z+ k
' P: u" J! ^( P- x8 q' L
读入之后数据将会被分成数值和非数值部分:
- @6 D( a b0 M% ?. _; v
% 用importdata直接读入CSV文件
& n7 q& }3 `5 D& n2 q
>> nasdaq = importdata('nasdaq.csv')
9 ~/ M" V/ v0 P+ ~4 J
nasdaq = % 结果存在struct中
% L. c. K' c! Y
data: [3x1 double]
' b- O0 u8 D; x6 B
textdata: {4x4 cell}
' g! Y4 v8 b3 L* G& X
>> nasdaq.data % csv中的数值部分
' o; `7 r) \3 F$ k; _2 U8 F! b* i
ans =
/ e3 l4 `0 S4 i Z1 R3 g1 V# d
1980
* L' p1 q" G t& z6 _
1997
. c1 {% X! ^/ O& U1 S
1986
8 I8 ^& Q) a5 w+ i
>> nasdaq.textdata % csv中的字符部分
1 l6 K! G7 u/ ~$ u/ |
ans =
+ R3 l2 m( H/ m( m8 n# v4 B7 i
'"Symbol"' '"Name"' '"Market Cap"' '"IPO Year"'
3 F5 ^; B' U8 }# V
'AAPL' 'Apple Inc' '$742.63B' ''
3 u& F) Z' k+ D* O% L' ]& ?
'AMZN' 'Amazon.com Inc' '$173.33B' ''
" M, ^0 O* o$ F
'MSFT' 'Microsoft Corporation' '$346.9B' ''
. ?+ ~# B0 I8 x
; N/ P3 W: F; z2 N) r+ o) \ J. A
显然这不是我们所期待的要导入格式。
8 v) l0 I! K4 i7 M3 D
4 ?0 y* l2 K& W9 K
通过导入数据构造table对象
9 K/ S7 o3 `2 _+ Z( t. v4 c7 z( C
沿用表Table.2中nasdaq.csv文件,我们可以使用readtable 函数,构造一个新的table对象,把csv文件中的数据导入到该对象中。readtable函数接受文件名称作为输入,返回一个table对象。
6 ], I" v7 J, C
- d) q" y& P8 r- b2 {
% 通过readtable函数来构造table对象
+ M5 G4 z6 Q! q" U6 J8 B) w& e
>> nasdaq = readtable('nasdaq.csv')
" r E! u, d- A2 s6 a% `' G
Warning: Variable names were modified to make them valid MATLAB identifiers.
) H6 u1 a6 ^4 Q8 Z
nasdaq =
, s- i R7 {- G3 z
Symbol Name MarketCap IPOYear
- D: X' B* x# a
______ _______________________ __________ _______
: j6 c' X9 K$ ^( I
'AAPL' 'Apple Inc' '$742.63B' 1980
( E% ]0 d) V0 N* k6 i) T: M9 T" h# f
'AMZN' 'Amazon.com Inc' '$173.33B' 1997
( c9 _ M' P5 B
'MSFT' 'Microsoft Corporation' '$346.9B' 1986
; C+ e( ^3 o v" Z p
! _* {9 q3 z" T9 C6 H$ I4 w$ M# T% d
注意第2行的warning,因为readtable 函数把nasdaq.csv中的第一行自动变成了这个table的表头,在创建table对象的时候,MATLAB会对做表头的文字做处理,这里把Market Cap和IPO Year两个词中的空格去掉,缩成一个词,这样做是为了方便将来使用dot语法来访问表中的数据。因为MATLAB修改了原来的表头,所以这里给出了warning。
# U. I+ {3 N4 U6 ~. u% ^ J
& f. u1 a! G8 o( a1 j1 `4 F7 O
调用table构造函数来构造table对象
7 l* e8 }) L- u% e
我们还可以通过直接调用table类的构造函数来创建table对象 (什么是类的构造函数见参加<>第2.5节,构造函数和类的名称相同)。在containers.Map 的介绍中,我们举了电话号码簿的例子,如表Table.3所示,它是我们这节要构造的table对象的原始数据
' @; n) c+ R* s; j3 @( M7 l
/ g+ O& r& _$ Z9 s) g2 A
Table.3 电话号码簿
6 W% E& L8 n6 g. A: Q& ?7 P) s; b: E
+ I6 N5 v- t8 q% B1 W7 ]& G2 Y
姓名
电话号码
0 ^2 O; p( b/ l
Abby5086470001
4 w/ f! `' S! o! y& ^4 e( y
Bob5086470002
+ T+ z. \9 o) j! C
Charlie5086470003
' j# y5 [, R7 T" K
下面程序中第1,2行用元胞数组来表示表中每一列的数据,第3行规定了表头的名称,第4行调用table的构造函数创建table对象,先输入数据,再输入表头的名称。表头通过table对象的VariableNames属性来设置。
( Y6 X0 [4 t; f F5 h' s
2 f% R1 `8 R: j
name={'Abby';'Bob';'Charlie'}; % 3x1列向量
' a5 {0 h2 U1 s8 P ~, Q6 r4 \
number={'5086470001';'5086470002';'5086470003'}; % 3x1列向量
% C+ ^0 q$ G0 y+ ^% P4 w
colName={'Name','Number'};
# U: X& |4 c$ h3 ]7 i
phonetable=table(name,number,'VariableNames',colName)
' t5 m( d! U; h) d& Q: @( o5 U
; `$ Y2 l# [! S7 [" _
命令行显示如下
5 u( f5 q( @' ]6 Y
8 t1 ]/ Q7 j7 N. @8 M
% phonetable在命令行中disp的结果
4 q5 X3 `3 S# `6 E- o3 d+ @& H
phonetable =
3 Y) b, o5 X6 \" P# k: ~$ k
Name Number
, m% [8 j" x4 b T, j- i
_________ ____________
! @2 }$ v* j3 @8 B+ H
& X4 E6 k8 h. k! ~2 Z+ B5 W
'Abby' '5086470001'
! k; q! q; F, v. B, n
'Bob' '5086470002'
# M: v: ?5 g5 R
'Charlie' '5086470003'
) s* N( D5 m+ Y" H7 J$ w
3 v- |8 u" Z$ `1 j5 e) n
第4行把Name和Number做为table对象的VariableNames,可以这样理解VariableNames,我们可以把table看成由一个个列数据组成的数据结构,每列都是矢量,其中存放相同类型的数据。如果一个table有两列,它就有两个列矢量,每个列矢量都是table的一个变量(Variable),给变量名字就是Variable Name。
+ Q/ c/ x! p E- M1 T
; H! z, J, d. G' N0 z1 s6 D* d) v
通过转换函数构造table对象
2 R3 K& s6 M# W" l: p
除了使用table的构造函数来创建table对象,还可以使用转换函数把其它数据类型转成table,下列通过数组数据类型类构造table。下面的程序的1-2行,我们利用financial工具箱中的fetch函数,从Yahoo财经处得到雅虎从3月1日到3月10日的股票价格,fetch函数将返回一个数组,第3行我们利用array2table转换函数把得到数组转成table。
! N& w( @$ U. Y) B- Y( P7 w7 T! f
1 |1 r1 Q9 W0 A/ O M4 v
% 通过array2table创建table对象
r4 n9 j6 N- t3 o
conn = yahoo;
: l# J- T( R* K2 b- U0 {
array = fetch(conn,'YHOO','3/1/2015','3/10/2015');
T" U' o1 x/ Q# c/ k
yhoo = array2table(array,...
& A7 E( @, r0 A: }+ V" ^! d
'VariableNames', {'date','open','high','low','closing','volumn','adjusted'})
' E2 y* m( y+ h( v+ r3 D
}9 l$ l4 Q* j% L
第4行中,我们通过VariableName来指定表头的内容,结果显示如下
- h9 }& u% f5 I9 [
8 \0 L0 f1 ^. q% s1 E
% yhoo的table在命令行的显示
, B' W# q1 c# ]1 d L0 P) K
yhoo =
" @) A9 J' a! {% R: ?
date open high low closing volumn adjusted
! J; N. t; P8 X& n
__________ _____ _____ _____ _______ __________ ________
7 u2 M/ _" v+ m" b7 P) Y" G
7.3603e+05 42.57 42.92 42.18 42.68 1.0601e+07 42.68
T* {* X8 V% y4 f
7.3603e+05 43.6 43.93 42.67 42.98 1.1802e+07 42.98
! M2 E7 Y! s' t6 \/ i9 R
7.3603e+05 43.98 44.24 43.4 43.44 1.1888e+07 43.44
1 n1 V, @( G; ]( n8 F
7.3603e+05 44.18 44.31 43.5 44.16 1.1868e+07 44.16
; O. O% |! C9 o' Y) }" S
7.3603e+05 42.08 44.38 41.97 43.99 3.0099e+07 43.99
" U2 |" z0 N2 \ D [. i" ~) {/ M3 }
7.3603e+05 43.7 43.95 42.42 42.62 2.2392e+07 42.62
& u( z3 c* N' W- J4 ?
7.3603e+05 44.06 44.43 43.7 44.11 1.1027e+07 44.11
8 `2 A% D) @" t- a4 H: M
8 |$ |6 D. i$ `6 E$ l, u
访问table中的数据
# K5 y5 t! S* V1 n$ M; f
* S8 B/ U% l; J- Q+ B" W% K) y8 c
通过表Table.1所建立的table对象,在命令行中显示如下:
5 T! [; Q( v2 U+ h5 w
% T/ D$ n4 i5 o9 a
% nasdaq table在命令行中的显示
3 w5 N! G7 L& i! [0 {) ]% ?7 Z
nasdaq =
, U+ _+ l- f F; y: L- u
Symbol Name MarketCap IPOYear
0 C: W$ P/ h* J: T f
______ _______________________ __________ _______
j: _) a( G$ ?" |4 a2 ^
5 u, B1 S# q( L- L
'AAPL' 'Apple Inc' '$742.63B' 1980
1 i: t; k0 F+ o5 x
'AMZN' 'Amazon.com Inc' '$173.33B' 1997
( [3 E% K6 ]+ d; s* |- I
'MSFT' 'Microsoft Corporation' '$346.9B' 1986
! d. @' G4 Y$ h& \
; R! D3 x9 n5 L
我们可以通过使用dot+Variablename的语法直接访问table中的列,返回的结果是cell格式的数据:
4 W4 \9 f3 z- ]7 g7 U: V+ b' }
" G# A! n$ N: x( a+ `$ ]
% 使用dot语法访问table中的数据
# W. m: o$ x0 M. g+ j" B6 b
>> nasdaq.Symbol % dot格式+变量名的访问方式
& ~3 l; `7 z5 A+ i3 E' ]
ans =
/ s1 T1 J" @2 d7 R* j
'AAPL'
8 ^3 U) q* s4 K% V9 S/ v
'AMZN'
8 h) Z( Y0 ]2 ]2 v: Z0 Q
'MSFT'
8 ]1 ~/ i* F$ R% h. H
>> class(nasdaq) % 返回cell格式的数据
3 J2 Z9 e7 ?( i8 Y# S& M1 L6 W/ Y
ans =
# B \- P, I6 m+ Z) k
cell
: S3 B) J4 G3 \- J0 a$ z% m
1 M( f; v' M1 Q' I9 k9 E6 V' q- [
table类重载了subsref函数(什么是运算符的重载,参加《MATLAB面向对象编程-从入门到设计模式》12.1节),于是支持MATLAB传统的圆括号下标访问,如果要访问第一行,则:
7 \/ i |+ @" H) [( O( x$ P
1 k0 r6 C1 U* a6 \2 ]3 {
% 使用下标语法访问table中的数据
; t0 _' c: ~+ w" o5 B4 R
>> nasdaq(1,:)
& p. Z$ ?. n8 g P/ t3 z2 Z6 j
ans =
! S3 p( s0 `( u# A
Symbol Name MarketCap IPOYear
A" j+ l/ Z* f5 z- `& [* _
______ ___________ __________ _______
: w. E. ?# F0 b% Z& K" W$ C$ A
+ @! W5 d; F3 `5 y; H9 x
'AAPL' 'Apple Inc' '$742.63B' 1980
- k/ [' {" S. ?( a$ \
2 s+ t3 `- F% a! e, S0 ^+ v
使用圆括号,返回的结果仍然是table,如果要访问第2到3行,则:
* F1 S0 P/ w9 u4 ^/ d6 O+ L
4 f# X( x# ? |5 u5 A, v- {
% 使用下标语法访问table中的数据
% V. j) Q; ^; m4 t# r& j
>> nasdaq(2:3,:)
& V8 B% ^! L$ M3 c/ k P7 R- \
ans =
% `9 H2 G) J, @; P' t5 k, n! b
Symbol Name MarketCap IPOYear
6 v- A: }2 Y4 S0 R# W/ a- ~, d- _1 c
______ _______________________ __________ _______
" e+ @ S, X! C) z" x2 `
( S- C4 E! E( B: y/ G$ n
'AMZN' 'Amazon.com Inc' '$173.33B' 1997
1 A' ?5 Z4 x/ d5 f5 F2 x: D
'MSFT' 'Microsoft Corporation' '$346.9B' 1986
* D4 E- r+ L8 ^
3 G( F) [* Y- Z. U( r
返回的结果仍然是table。 table数据结构支持MATLAB传统的花括号下标访问,返回的结果是cell格式的数据
& B" l1 @( i" i2 X; j: ]8 M
" P8 ^: B. n1 u) i
% 花括号下标访问
, ~% B, j* d* G, P0 }* Q: ?& Q) r! \8 ]
>> nasdaq{:,1} % 花括号下标访问,返回第一列中的数据
; e: v' C$ P/ [: g; B3 r1 U8 q
ans =
7 I5 |( u9 h1 o% w# E5 w
'AAPL'
* C" P2 S$ w- c6 o6 k. B: r
'AMZN'
9 ?/ l+ L" ^, D- j$ W
'MSFT'
$ F1 U6 k: y5 Z
Q# [+ T# `% a& ~( J
还可以把Dot语法和下标语法结合起来获取数据,下例代码访问table第一列的第三行,返回的结果是元胞。
5 g e, ?# Y8 Z* a, ~$ ~0 C# h
3 z/ n3 [" W6 n" i( S7 _
% Dot语法和圆括号下标访问结合
* ]9 E4 r$ ~8 t3 z
>> nasdaq.Symbol(3)
9 j* q& z6 s/ n& j3 F) O+ s
ans =
1 {2 Q+ h A, o
'MSFT'
9 Q5 G! W9 J9 @5 r5 o" y
>> class(ans) % 圆括号下标访问,返回结果是元胞
' r- a5 u2 T% i( B2 A1 y
ans =
. ^2 Y/ w. _9 F- i! ]
cell
8 D) e1 A# ^( }* @( S" g) x
作者:
yin123
时间:
2020-11-30 13:21
大功率开关电源中功率MOSFET的驱动技术
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2