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
9 X% V) K% t9 nMATLAB常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除了这些基本数据类型,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 Vtable简介, 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 rTable.1 NASDAQ股票名称表
Symbol
Name
Market Cap
IPO Year
5 @! X  x, B7 s0 o0 z9 |
AAPLApple Inc$742.63B19803 \; q3 E9 ~9 Z& z
AMZNAmazon.com, Inc$173.33B19972 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 W4 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",19970 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 Jnasdaq =                          % 结果存在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* ians =
/ 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 ATable.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( yBob5086470002+ 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: jname={'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 iphonetable=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 oconn = yahoo;: l# J- T( R* K2 b- U0 {
array = fetch(conn,'YHOO','3/1/2015','3/10/2015');
  T" U' o1 x/ Q# c/ kyhoo = 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) kcell  : 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$ P1 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 qans =
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# h3 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+ sans =
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 yans =. ^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