![]() 文章PDF浏览下载链接目录:MATLAB常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除了这些基本数据类型,MATLAB还有很多其它的数据类型不为人熟悉,这些数据类型在编程中也非常有用。MATLAB高级数据类型系列旨在向大家介绍它们:比如containers.Map , tables ,enumeration 和time series 等等,它们为什么有用,用来解决什么问题,并且怎样在科学工程计算中怎么使用。上篇我们提到了映射表结构(containers.Map )。本篇将介绍另一中新的MATLAB数据类型--table 。
table简介为什么需要table数据结构MathWorks在MATLAB R2013b中引入了一种新的数据结构叫做table 。table 类似统计 工具箱中的dataset ,其引入的目的就是用来取代dataset 的数据类型。因为表状的数据在工程计算中越来越长久,有了table 类型,MATLAB用户就可以不用购买统计工具箱,也能使用表状的数据结构了。 table 本质上来说是一种可以存放各种数据类型的容器,比如下面表
importdata 直接读取表% 用importdata直接读入CSV文件 >> nasdaq = importdata('nasdaq.csv') nasdaq = % 结果存在struct中 data: [3x1 double] textdata: {4x4 cell} >> nasdaq.data % csv中的数值部分 ans = 1980 1997 1986 >> nasdaq.textdata % csv中的字符部分 ans = '"Symbol"' '"Name"' '"Market Cap"' '"IPO Year"' 'AAPL' 'Apple Inc' '$742.63B' '' 'AMZN' 'Amazon.com Inc' '$173.33B' '' 'MSFT' 'Microsoft Corporation' '$346.9B' ''显然这不是我们所期待的要导入格式。 通过导入数据构造table对象沿用表readtable 函数,构造一个新的table对象,把csv文件中的数据导入到该对象中。readtable函数接受文件名称作为输入,返回一个table对象。
% 通过readtable函数来构造table对象 >> nasdaq = readtable('nasdaq.csv') Warning: Variable names were modified to make them valid MATLAB identifiers. nasdaq = Symbol Name MarketCap IPOYear ______ _______________________ __________ _______ 'AAPL' 'Apple Inc' '$742.63B' 1980 'AMZN' 'Amazon.com Inc' '$173.33B' 1997 'MSFT' 'Microsoft Corporation' '$346.9B' 1986注意第2行的warning,因为 readtable 函数把nasdaq.csv中的第一行自动变成了这个table的表头,在创建table对象的时候,MATLAB会对做表头的文字做处理,这里把Market Cap和IPO Year两个词中的空格去掉,缩成一个词,这样做是为了方便将来使用dot语法来访问表中的数据。因为MATLAB修改了原来的表头,所以这里给出了warning。
调用table构造函数来构造table对象我们还可以通过直接调用table类的构造函数来创建table对象 (什么是类的构造函数见参加<containers.Map 的介绍中,我们举了电话号码簿的例子,如表
name={'Abby';'Bob';'Charlie'}; % 3x1列向量 number={'5086470001';'5086470002';'5086470003'}; % 3x1列向量 colName={'Name','Number'}; phonetable=table(name,number,'VariableNames',colName)命令行显示如下 % phonetable在命令行中disp的结果 phonetable = Name Number _________ ____________ 'Abby' '5086470001' 'Bob' '5086470002' 'Charlie' '5086470003'第4行把Name和Number做为table对象的VariableNames,可以这样理解VariableNames,我们可以把table看成由一个个列数据组成的数据结构,每列都是矢量,其中存放相同类型的数据。如果一个table有两列,它就有两个列矢量,每个列矢量都是table的一个变量(Variable),给变量名字就是Variable Name。 通过转换函数构造table对象除了使用table的构造函数来创建table对象,还可以使用转换函数把其它数据类型转成table,下列通过数组数据类型类构造table。下面的程序的1-2行,我们利用financial工具箱中的fetch函数,从Yahoo财经处得到雅虎从3月1日到3月10日的股票价格,fetch函数将返回一个数组,第3行我们利用array2table转换函数把得到数组转成table。% 通过array2table创建table对象 conn = yahoo; array = fetch(conn,'YHOO','3/1/2015','3/10/2015'); yhoo = array2table(array,... 'VariableNames', {'date','open','high','low','closing','volumn','adjusted'})第4行中,我们通过VariableName来指定表头的内容,结果显示如下 % yhoo的table在命令行的显示 yhoo = date open high low closing volumn adjusted __________ _____ _____ _____ _______ __________ ________ 7.3603e+05 42.57 42.92 42.18 42.68 1.0601e+07 42.68 7.3603e+05 43.6 43.93 42.67 42.98 1.1802e+07 42.98 7.3603e+05 43.98 44.24 43.4 43.44 1.1888e+07 43.44 7.3603e+05 44.18 44.31 43.5 44.16 1.1868e+07 44.16 7.3603e+05 42.08 44.38 41.97 43.99 3.0099e+07 43.99 7.3603e+05 43.7 43.95 42.42 42.62 2.2392e+07 42.62 7.3603e+05 44.06 44.43 43.7 44.11 1.1027e+07 44.11 访问table中的数据通过表% nasdaq table在命令行中的显示 nasdaq = Symbol Name MarketCap IPOYear ______ _______________________ __________ _______ 'AAPL' 'Apple Inc' '$742.63B' 1980 'AMZN' 'Amazon.com Inc' '$173.33B' 1997 'MSFT' 'Microsoft Corporation' '$346.9B' 1986我们可以通过使用dot+Variablename的语法直接访问table中的列,返回的结果是cell格式的数据: % 使用dot语法访问table中的数据 >> nasdaq.Symbol % dot格式+变量名的访问方式 ans = 'AAPL' 'AMZN' 'MSFT' >> class(nasdaq) % 返回cell格式的数据 ans = celltable类重载了subsref函数(什么是运算符的重载,参加《MATLAB面向对象编程-从入门到设计模式》12.1节),于是支持MATLAB传统的圆括号下标访问,如果要访问第一行,则: % 使用下标语法访问table中的数据 >> nasdaq(1,:) ans = Symbol Name MarketCap IPOYear ______ ___________ __________ _______ 'AAPL' 'Apple Inc' '$742.63B' 1980使用圆括号,返回的结果仍然是table,如果要访问第2到3行,则: % 使用下标语法访问table中的数据 >> nasdaq(2:3,:) ans = Symbol Name MarketCap IPOYear ______ _______________________ __________ _______ 'AMZN' 'Amazon.com Inc' '$173.33B' 1997 'MSFT' 'Microsoft Corporation' '$346.9B' 1986返回的结果仍然是table。 table数据结构支持MATLAB传统的花括号下标访问,返回的结果是cell格式的数据 % 花括号下标访问 >> nasdaq{:,1} % 花括号下标访问,返回第一列中的数据 ans = 'AAPL' 'AMZN' 'MSFT'还可以把Dot语法和下标语法结合起来获取数据,下例代码访问table第一列的第三行,返回的结果是元胞。 % Dot语法和圆括号下标访问结合 >> nasdaq.Symbol(3) ans = 'MSFT' >> class(ans) % 圆括号下标访问,返回结果是元胞 ans = cell图 ![]() 关于作者oopmatlab,计算物理博士,计算机硕士,《MATLAB面向对象编程-从入门到设计模式》作者,现就职一家科学工程计算公司的任架构组C++软件工程师。业余兴趣包括如何把软件工程中的现代手段,应用到科学和工程计算当中去,来更好的解决复杂的问题。包括如何从整体上设计科学计算程序的结构;如何让程序便于扩展和修改;在改进和开发算法的时候,如何保证程序已有的功能没有收到影响;如何让算法开发和测试系统的建立齐头并进。声明: 本文内容所有内容仅代表个人观点,如有任何问题,请联系作者。 本版块所有文章版权归作者个人所有,未经允许,不得作为出版物出版。如需转载,请联系论坛管理员。 |