MATLAB table数据结构 首篇

2019-3-2 01:32| 发布者: ilovematlab| 查看: 75825| 评论: 10|原作者: oopmatlab

摘要: MATLAB table是R2013b中引入的一个新的数据结构,虽然不像常用的基本数据类型为人熟悉,但是在编程中非常有用。它用来存放表状类型的数据结构,并且支持常见的表和表之间的运算。 ... ... ... ... ... ... ...

文章PDF浏览下载链接

目录:

MATLAB常用基本数据类型有:整型,浮点型,字符型,函数句柄,元胞数组和结构体数组。除了这些基本数据类型,MATLAB还有很多其它的数据类型不为人熟悉,这些数据类型在编程中也非常有用。MATLAB高级数据类型系列旨在向大家介绍它们:比如containers.Map tablesenumerationtime series等等,它们为什么有用,用来解决什么问题,并且怎样在科学工程计算中怎么使用。上篇我们提到了映射表结构(containers.Map )。本篇将介绍另一中新的MATLAB数据类型--table

table简介

为什么需要table数据结构

MathWorks在MATLAB R2013b中引入了一种新的数据结构叫做tabletable类似统计 工具箱中的dataset ,其引入的目的就是用来取代dataset的数据类型。因为表状的数据在工程计算中越来越长久,有了table 类型,MATLAB用户就可以不用购买统计工具箱,也能使用表状的数据结构了。 table本质上来说是一种可以存放各种数据类型的容器,比如下面表Table.1中的数据,其中既有字符型,又有数值类型,其中第一行作为表头:Symbol,Name,Market,Cap,IPO, Year是各列的名字。
Table.1 NASDAQ股票名称表
Symbol Name Market Cap IPO Year
AAPL Apple Inc $742.63B 1980
AMZN Amazon.com, Inc $173.33B 1997
MSFT Microsoft Corporation $346.9B 1986
在conatiners.Map的章节中,我们介绍了MATLAB的基本数据类型(比如数组,原胞数组和结构体)在表达某些复杂数据类型时的局限性。这里不再一一赘述,读者只需要认识到:数组的局限性在于不能用来存放数值以外的数据,而使用元胞读取和索引内容时有种种不方便,比如无法区分该数据中的表头和其余的行数据。事实上,如果数据存放在如下的CSV文件中,并且用importdata 直接读取表Table.2中的CSV文件。
Table.2 Nasdaq 的 csv 原始数据
"Symbol","Name","Market Cap","IPO Year"
"AAPL","Apple Inc","$742.63B",1980
"AMZN","Amazon.com Inc","$173.33B",1997
"MSFT","Microsoft Corporation","$346.9B",1986
读入之后数据将会被分成数值和非数值部分:
% 用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对象

沿用表Table.2中nasdaq.csv文件,我们可以使用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对象 (什么是类的构造函数见参加<>第2.5节,构造函数和类的名称相同)。在containers.Map 的介绍中,我们举了电话号码簿的例子,如表Table.3所示,它是我们这节要构造的table对象的原始数据
Table.3 电话号码簿
姓名 电话号码
Abby 5086470001
Bob 5086470002
Charlie 5086470003
下面程序中第1,2行用元胞数组来表示表中每一列的数据,第3行规定了表头的名称,第4行调用table的构造函数创建table对象,先输入数据,再输入表头的名称。表头通过table对象的VariableNames属性来设置。
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中的数据

通过表Table.1所建立的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 =
cell  
table类重载了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  
Figure.1中以表Table.1中的数据为例,总结了几种访问table中不同区域的数据的方法。
Figure.1 访问table中的数据


关于作者

oopmatlab,计算物理博士,计算机硕士,《MATLAB面向对象编程-从入门到设计模式》作者,现就职一家科学工程计算公司的任架构组C++软件工程师。业余兴趣包括如何把软件工程中的现代手段,应用到科学和工程计算当中去,来更好的解决复杂的问题。包括如何从整体上设计科学计算程序的结构;如何让程序便于扩展和修改;在改进和开发算法的时候,如何保证程序已有的功能没有收到影响;如何让算法开发和测试系统的建立齐头并进。

声明:
本文内容所有内容仅代表个人观点,如有任何问题,请联系作者。
本版块所有文章版权归作者个人所有,未经允许,不得作为出版物出版。如需转载,请联系论坛管理员

63

鲜花
1

握手

雷人

路过

鸡蛋

刚表态过的朋友 (64 人)

相关阅读

发表评论

最新评论

引用 PSS®E 2019-7-24 18:27
新手学习,感谢分享
引用 lysfox 2019-7-23 13:56
不错,学习一下
引用 Anacond_EkxKm 2019-5-10 19:07
学习了,谢谢
引用 michelangelo 2019-5-6 20:11
table和字符串之间的转换?
引用 Drpcy 2019-5-3 17:06
引用 jk778 2019-4-28 17:54
看照約妹 line:v778 尋歡作樂 也不必上青樓 這裏高檔好康!
引用 Abigail_Qin 2019-4-21 22:31
感谢楼主~
引用 wx_jFyzKruc 2019-1-1 16:57
访问抬头呢
引用 老刘天马行空 2018-10-14 15:47
学习了
引用 回首为伊人 2018-7-30 21:53
厉害
引用 freemanxu 2018-7-21 21:36
世界变化太快,yahoo这个函数以及没有了~  @2018a
引用 freemanxu 2018-7-21 21:29
conn=yahoo; 运行出错哦!
引用 cbxy001 2018-7-14 15:54
过来学习
引用 whyz308 2018-6-12 20:02
厉害
引用 淡然微笑066 2018-3-20 15:14
学习了
引用 ucaszzy 2018-3-13 10:22
学习一下
引用 xhbao 2018-2-3 06:02
楼主有个问题,table数据可以在任意行或任意列插入吗?
引用 a472036783 2018-1-23 10:41
人和人的差距真的大
引用 我可是小帅比 2018-1-2 15:03
围观一下
引用 toho 2017-7-18 16:03
怎么我点收藏不好使啊。。

查看全部评论(10)

MATLAB table数据结构 首篇

MATLAB table是R2013b中引入的一个新的数据结构,虽然不像常用的基本数据类型为人熟悉,但是在编程中非常有用。它用来存放表状类型的数据结构,并且支持常见的表和表之间的运算。 ... ... ... ... ... ... ...

MATLAB映射表数据结构

除了常用的基本数据类型,MATLAB还有很多其它实用的数据类型不为人熟悉,例如映射表containers.Map,常用的MATLAB高级数据类型。它最大的特点使用方便的索引方式进行快速的查找。本篇介绍为什么需要这种数据结构,以 ...

MATLAB table数据结构 再篇

MATLAB table是R2013b中引入的一个新的数据结构,虽然不像常用的基本数据类型为人熟悉,但是在编程中非常有用。它用来存放表状类型的数据结构,并且支持常见的表和表之间的运算。 ... ... ... ... ... ... ...

对函数的输入进行检查和解析

在工程计算中,如果函数的输入有错误,我们总是希望能尽早捕捉到这些错误,并及时终止程序。在MATLAB 中,可以使用validateattributes,validatestring和inputParser 类来对输入进行检查。它们提供全面的检查功能和清 ...

MATLAB单元测试

本篇是把现代软件工程思想应用到MATLAB工程开发中的精髓,希望高级MATLAB用户仔细研读。作者用实际的例子解释在开发和逐渐改进算法的时候,如何保证程序已有的功能没有收到影响,步步为营,让算法开发和测试系统的建 ...

MATLAB映射表数据结构

除了常用的基本数据类型,MATLAB还有很多其它实用的数据类型不为人熟悉,例如映射表containers.Map,常用的MATLAB高级数据类型。它最大的特点使用方便的索引方式进行快速的查找。本篇介绍为什么需要这种数据结构,以 ...

对函数的输入进行检查和解析

在工程计算中,如果函数的输入有错误,我们总是希望能尽早捕捉到这些错误,并及时终止程序。在MATLAB 中,可以使用validateattributes,validatestring和inputParser 类来对输入进行检查。它们提供全面的检查功能和清 ...

MATLAB性能测试框架

MATLAB Performance Test 框架是Mathworks 在MATLAB R2016a 中推出的⼀个新的框架,该框架⽤来获得代码性能在统计意义上的数据,还可以⽤来⽐较算法的性能,并且给出详细完整的报告。 ... ... ... ... ... ... ... ...
关闭

站长推荐上一条 /3 下一条

返回顶部