找回密码
 注册
关于网站域名变更的通知
查看: 366|回复: 1
打印 上一主题 下一主题

MATLAB table数据结构(上)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-11-30 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 uqHZau 于 2020-11-30 13:25 编辑 % N% u9 c8 U' E

' w5 [9 e% e/ j2 l$ C目录:6 H& c+ e: j* j1 A7 X/ l
  • table简介
  • 为什么需要table数据结构
  • 通过导入数据构造table对象
  • 调用table构造函数来构造table对象
  • 通过转换函数构造table对象
  • 访问table中的数据
    : `) v- m  W7 k$ t. b/ A
2 Q; @" E' z/ m0 i! K( f+ P  `
MATLAB常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除了这些基本数据类型,MATLAB还有很多其它的数据类型不为人熟悉,这些数据类型在编程中也非常有用。MATLAB高级数据类型系列旨在向大家介绍它们:比如containers.Map, tables,enumeration和time series等等,它们为什么有用,用来解决什么问题,并且怎样在科学工程计算中怎么使用。上篇我们提到了映射表结构(containers.Map )。本篇将介绍另一中新的MATLAB数据类型--table。
6 l& T  p- o; v  x$ r/ F; c* _9 R7 |' {' z4 ?
table简介( R) X* k% B5 P! u+ Y. n' h) d
为什么需要table数据结构& n0 z2 Z6 u$ g% x3 \& R, t
MathWorks在MATLAB R2013b中引入了一种新的数据结构叫做table 。table类似统计 工具箱中的dataset ,其引入的目的就是用来取代dataset的数据类型。因为表状的数据在工程计算中越来越长久,有了table 类型,MATLAB用户就可以不用购买统计工具箱,也能使用表状的数据结构了。 table本质上来说是一种可以存放各种数据类型的容器,比如下面表Table.1中的数据,其中既有字符型,又有数值类型,其中第一行作为表头:Symbol,Name,Market,Cap,IPO, Year是各列的名字。( c# A& F6 Q: A( N6 u+ P% ]3 I0 P
  Q) G# ]. C! ?- j2 v7 }5 q
Table.1 NASDAQ股票名称表
Symbol
Name
Market Cap
IPO Year

- s( B) |" z, t6 P; uAAPLApple Inc$742.63B1980
9 t" }( j6 B; @( A7 ^, m% OAMZNAmazon.com, Inc$173.33B1997
) C1 [. U, J% O6 P0 [MSFTMicrosoft Corporation$346.9B1986

+ }# `0 v3 F( e0 ~7 |0 e在conatiners.Map的章节中,我们介绍了MATLAB的基本数据类型(比如数组,原胞数组和结构体)在表达某些复杂数据类型时的局限性。这里不再一一赘述,读者只需要认识到:数组的局限性在于不能用来存放数值以外的数据,而使用元胞读取和索引内容时有种种不方便,比如无法区分该数据中的表头和其余的行数据。事实上,如果数据存放在如下的CSV文件中,并且用importdata 直接读取表Table.2中的CSV文件。
% n8 l$ r& x' b0 w0 @5 q2 B9 Q5 o; `& V6 k8 \7 f7 q
Table.2 Nasdaq 的 csv 原始数据
1 X  b2 G1 C4 i( L- d"Symbol","Name","Market Cap","IPO Year"
' K5 y$ S1 C" I$ |& I"AAPL","Apple Inc","$742.63B",1980
9 H3 Z8 S' t) M# }* m7 |"AMZN","Amazon.com Inc","$173.33B",1997
% w0 E/ y& {, ^- |9 ?"MSFT","Microsoft Corporation","$346.9B",19867 S7 P' k+ `( J  j# n. Y& P. C* C; N$ Y( y

5 r. m- M7 y! P$ E8 \; b读入之后数据将会被分成数值和非数值部分:
( h8 O4 k9 Q) k% 用importdata直接读入CSV文件
+ ]6 l# @& }/ d: g" P4 H$ o) ]>> nasdaq = importdata('nasdaq.csv'): k2 Z( e& P& k+ R
nasdaq =                          % 结果存在struct中" t7 ~4 s  K' ]' c
        data: [3x1 double]
! m- h- R  s. F4 b# Y0 F. P    textdata: {4x4 cell}
! B3 V" v3 z, W7 g: a>> nasdaq.data                    % csv中的数值部分
3 j  j* k3 s) i' U( t$ p1 w6 [3 Y0 Pans =
4 B& K: M7 `; Y; A4 j        19802 ^8 o7 t( I" b; O) B+ U7 w; c
        1997
0 t( d2 a# _5 F2 Y, J        1986  
2 ]1 \7 ]+ |1 k+ L% N>> nasdaq.textdata                % csv中的字符部分. }+ ~8 q' C% Z' o
ans = 2 [' X1 J1 m/ F8 E) p0 R" W
    '"Symbol"'    '"Name"'                   '"Market Cap"'    '"IPO Year"'
- _/ T7 t! G2 F/ }  @    'AAPL'        'Apple Inc'                '$742.63B'        ''         
# Z/ Q3 o2 f- r    'AMZN'        'Amazon.com Inc'           '$173.33B'        ''         
% u, k- {+ f' O! b( k  a    'MSFT'        'Microsoft Corporation'    '$346.9B'         ''  
; h! l: w6 v. N/ l% m6 W) e
+ [+ O) V3 R/ D( ?& Q3 w显然这不是我们所期待的要导入格式。
% \/ i. ?: z7 F/ _; Z. F
0 h7 A& J8 }5 Q/ `2 f; u6 E0 Z通过导入数据构造table对象
0 f) |9 H! Q6 Z0 {% h5 Z+ o; ]沿用表Table.2中nasdaq.csv文件,我们可以使用readtable 函数,构造一个新的table对象,把csv文件中的数据导入到该对象中。readtable函数接受文件名称作为输入,返回一个table对象。
7 N( V" S! P+ X% s1 i" {
3 b, `5 D- w7 n  L% _% 通过readtable函数来构造table对象
& _8 {  P" k/ y8 y$ N>> nasdaq = readtable('nasdaq.csv'), i& L  Y! X$ D/ e  k/ X
Warning: Variable names were modified to make them valid MATLAB identifiers.
8 W2 {8 v/ I# t4 p5 b/ U7 vnasdaq =                                                               
2 z1 d3 @/ Y9 W    Symbol             Name              MarketCap     IPOYear4 |1 s5 w; D" M# l3 w4 ?
    ______    _______________________    __________    _______9 }8 x8 L7 u( I) v9 P
    'AAPL'    'Apple Inc'                '$742.63B'    1980   ; l- A; Y: h  }( m
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   
3 U  R! L2 I: }    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986   
& l3 H( G5 ?; g& ~  w6 t7 R: @% G0 _" G! ?$ }5 Z
注意第2行的warning,因为readtable 函数把nasdaq.csv中的第一行自动变成了这个table的表头,在创建table对象的时候,MATLAB会对做表头的文字做处理,这里把Market Cap和IPO Year两个词中的空格去掉,缩成一个词,这样做是为了方便将来使用dot语法来访问表中的数据。因为MATLAB修改了原来的表头,所以这里给出了warning。
( e% V" b9 p% A4 _& P
# d# U0 g8 J  ^. s! ]调用table构造函数来构造table对象6 `  H! q( a1 j4 u" I& v
我们还可以通过直接调用table类的构造函数来创建table对象 (什么是类的构造函数见参加<>第2.5节,构造函数和类的名称相同)。在containers.Map 的介绍中,我们举了电话号码簿的例子,如表Table.3所示,它是我们这节要构造的table对象的原始数据6 F# G. u) Y0 U) f/ k! M

1 F8 f, c8 X  @+ e4 q$ vTable.3 电话号码簿1 `$ M  b5 L9 K0 P' e

( I) }7 m( m4 n& r, a/ |( [
姓名
电话号码
+ h$ C$ k! f. l- J
Abby5086470001% g% l/ ^' n( y7 o
Bob5086470002
+ {( F. q1 _3 F' PCharlie50864700037 l7 _8 i0 O! G4 k
下面程序中第1,2行用元胞数组来表示表中每一列的数据,第3行规定了表头的名称,第4行调用table的构造函数创建table对象,先输入数据,再输入表头的名称。表头通过table对象的VariableNames属性来设置。6 D. d6 S3 G6 v
" _; L% A: g/ _; @/ o7 u9 `/ m% P3 W
name={'Abby';'Bob';'Charlie'};                        % 3x1列向量. `7 c% w5 K' c6 E
number={'5086470001';'5086470002';'5086470003'};      % 3x1列向量
! }: ?' P' Z) g5 g: XcolName={'Name','Number'};3 L1 _* \0 i( s+ @. I
phonetable=table(name,number,'VariableNames',colName)   
9 g0 q  Z1 D! A3 L
. Q- ~# S4 x/ f9 h3 S/ g: ]命令行显示如下
2 v3 n3 Z: T1 H  t6 `0 k# @5 K5 N% S
% phonetable在命令行中disp的结果  " q" K' g: t$ E' g& `& v
phonetable =
1 U0 i7 f' O; m# |9 S, I+ ]      Name          Number   2 r5 s* @; \' ~: s' C# w* L
    _________    ____________
' l$ Z# z# |6 }3 o
! z% T# L6 i7 I9 {/ p1 d$ I    'Abby'       '5086470001'
" q6 @. L1 e, e- y    'Bob'        '5086470002'
' o7 ^8 J0 z) j( U    'Charlie'    '5086470003'
, o5 h5 \, U8 c) ^7 \2 [
3 y8 R4 S+ L) b9 H0 I& U第4行把Name和Number做为table对象的VariableNames,可以这样理解VariableNames,我们可以把table看成由一个个列数据组成的数据结构,每列都是矢量,其中存放相同类型的数据。如果一个table有两列,它就有两个列矢量,每个列矢量都是table的一个变量(Variable),给变量名字就是Variable Name。
8 A9 ?; F+ t/ f4 W! R$ I3 e0 J/ k; d7 M
通过转换函数构造table对象4 @1 b5 T& B2 D2 r0 a( y* ^7 T" A
除了使用table的构造函数来创建table对象,还可以使用转换函数把其它数据类型转成table,下列通过数组数据类型类构造table。下面的程序的1-2行,我们利用financial工具箱中的fetch函数,从Yahoo财经处得到雅虎从3月1日到3月10日的股票价格,fetch函数将返回一个数组,第3行我们利用array2table转换函数把得到数组转成table。" [$ V! h5 D; M& t

! G: w! L0 M, S/ x' F# T4 p% 通过array2table创建table对象  
4 K, x; }8 Z" }. M& Pconn = yahoo;8 {) F. t8 v% H( N
array = fetch(conn,'YHOO','3/1/2015','3/10/2015');
2 J8 q/ q2 a: z, L/ l9 _6 l* m" A/ N( eyhoo = array2table(array,...0 R: ?' L% R0 g- ]2 u" i
  'VariableNames', {'date','open','high','low','closing','volumn','adjusted'})+ C' \2 h: M" w/ w% L3 |- S

& F: F! g0 Y9 \9 u( f第4行中,我们通过VariableName来指定表头的内容,结果显示如下# w3 ~( p0 y3 ?

4 R# n8 [5 H, F: ~" N$ a" t0 K# Z% yhoo的table在命令行的显示) H3 m7 b: g: T2 Q* @$ U* |
yhoo =
, _. |7 I' ?, ?, C" h3 E+ J  X     date       open     high      low     closing      volumn      adjusted
$ Y8 T) J; \0 {: r) ?) a# h' J: ?' o  __________    _____    _____    _____    _______    __________    ________
% {; Q, |) M6 P8 R( q) F( I2 z   7.3603e+05    42.57    42.92    42.18    42.68      1.0601e+07    42.68   
: P* z1 e2 x0 f; W   7.3603e+05     43.6    43.93    42.67    42.98      1.1802e+07    42.98   
8 Y0 b$ j) F& Y* b1 F3 R   7.3603e+05    43.98    44.24     43.4    43.44      1.1888e+07    43.44   * d( e9 V$ F' [2 Z' U4 H, V
   7.3603e+05    44.18    44.31     43.5    44.16      1.1868e+07    44.16   
0 [9 f# u$ ^2 {   7.3603e+05    42.08    44.38    41.97    43.99      3.0099e+07    43.99   
0 ]3 K; i% P' s1 ]: _( }% k+ \; Z   7.3603e+05     43.7    43.95    42.42    42.62      2.2392e+07    42.62   1 ~% p7 u8 U2 o/ c
   7.3603e+05    44.06    44.43     43.7    44.11      1.1027e+07    44.11     
8 o5 D; x: f' |( u0 b2 ~* K' T7 w* P6 ]7 O4 p$ \
访问table中的数据, p4 @* s! f4 B
/ B1 F5 N0 ~0 H* `( |
通过表Table.1所建立的table对象,在命令行中显示如下:
0 Y! X$ O7 ^, m3 p
0 k/ W9 @( l( d' O: ~) y& k* [% nasdaq table在命令行中的显示6 H* z$ X% X$ ~; b3 r2 j, m/ \8 Q
nasdaq = 8 [9 s- i7 H% |' k; v! p
    Symbol             Name              MarketCap     IPOYear) L7 g" X; p) [$ P6 K. k9 k( l
    ______    _______________________    __________    _______! t+ n7 N+ p. u8 r4 f

, J3 w( b; y8 w    'AAPL'    'Apple Inc'                '$742.63B'    1980   
9 G, m& \% b6 X  m) A( R, C    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   ! Z1 R; A+ D  v  T
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986   
1 u  N* D+ U# u+ X& Q! C+ Y+ n/ W" @7 m# i% U, [; f
我们可以通过使用dot+Variablename的语法直接访问table中的列,返回的结果是cell格式的数据:% _+ ]" Z; i; e( K

: R% u% R/ y1 d# S4 y% 使用dot语法访问table中的数据5 d; ^! o8 l0 y- d, \- R
>> nasdaq.Symbol           % dot格式+变量名的访问方式
) i8 X3 l. S, J: `ans =
% ]. v* |: M% p& I4 c  q* b    'AAPL'
. H; q! A9 Q" o! F    'AMZN'1 H7 F$ l& G# P3 w/ c; W' m
    'MSFT'1 t" Q# b/ D# n5 l1 a8 k1 h
>> class(nasdaq)           % 返回cell格式的数据
: ?, ~9 a/ |6 g1 n0 Jans =
) \" J* z( t  u7 Ecell  / f0 Z- i% `9 V& Z
* K1 U! s: D% I& z: r- j
table类重载了subsref函数(什么是运算符的重载,参加《MATLAB面向对象编程-从入门到设计模式》12.1节),于是支持MATLAB传统的圆括号下标访问,如果要访问第一行,则:
8 z, [6 _" G, F5 K& o7 m3 p) K- f' S. y
% 使用下标语法访问table中的数据
8 Z  N2 j: [/ f" S" R% u>> nasdaq(1,:); Q& J# Y$ e% @
ans =
5 r7 Z: A7 g$ l- R( g    Symbol       Name        MarketCap     IPOYear
( G* J1 P2 F( `% ?) F$ b2 E& ~; p6 u+ V# H    ______    ___________    __________    _______
1 _  }, b1 ~$ v. ]! h
* _4 a! ?" y" [8 L( x    'AAPL'    'Apple Inc'    '$742.63B'    1980     ' Q2 f- m5 [5 s: Z2 q; G/ \3 n

! m" u% A, v9 s5 q0 U, L使用圆括号,返回的结果仍然是table,如果要访问第2到3行,则:
2 p' b: q/ V8 Y/ `
/ z5 J- g7 }, l+ M) m; z4 K% 使用下标语法访问table中的数据/ D9 h8 p% \2 g1 j, W( \! e* i
>> nasdaq(2:3,:)
6 O3 f8 c, g, v, z0 R& A3 Ians = 5 j# J$ A' Z+ ~. L8 k2 z* S& o
    Symbol             Name              MarketCap     IPOYear/ z8 [/ `2 z: k" |2 K. U2 g
    ______    _______________________    __________    _______
8 H3 X9 ]0 d! l: F5 u5 S" `, B  f' ^4 l, @, f  L
    'AMZN'    'Amazon.com Inc'           '$173.33B'    1997   6 |2 S# Z( @+ p
    'MSFT'    'Microsoft Corporation'    '$346.9B'     1986     
5 g* b/ @& U/ b, Z& S' P* Y! d7 V# }6 Y" Z
返回的结果仍然是table。 table数据结构支持MATLAB传统的花括号下标访问,返回的结果是cell格式的数据
. _% R% C* K; d8 l $ r' s2 d* y3 w) T) L
% 花括号下标访问4 B3 i$ O, [4 {/ B( L7 W
>> nasdaq{:,1}   % 花括号下标访问,返回第一列中的数据" S9 f, O' N# r% Q2 W
ans =
( }/ ^' M2 ?6 O# |% f    'AAPL'" F' @/ V- s, z2 F
    'AMZN'
8 E7 k% K/ L' u) m1 b4 A    'MSFT'
9 h# Q- ?$ t" \6 }) g0 {( h$ u1 ?' F% P: P
还可以把Dot语法和下标语法结合起来获取数据,下例代码访问table第一列的第三行,返回的结果是元胞。
: L& F$ v5 a, h8 b& e1 `
( M2 T3 \( u5 a, a  a. y+ `' G" `( e% Dot语法和圆括号下标访问结合
- F& p+ k6 [9 T# N, Q. Q' h>> nasdaq.Symbol(3)* Y) e: s! `) u0 `# ?
ans =   n* @  X/ L/ Q5 \7 a  F  c8 x; V4 G. r
    'MSFT'0 H6 u# O  z8 ?) B, ?
>> class(ans)     % 圆括号下标访问,返回结果是元胞 - L9 {* I) ^- e% w6 H- u
ans =
; C8 x5 i. I+ C- M3 o6 W; _cell  
, x5 [7 _0 m4 J( ~" t3 y/ {
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-11-30 13:21 | 只看该作者
    大功率开关电源中功率MOSFET的驱动技术
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-6 23:14 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表