添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • MATLAB Implicit Expansion
  • MATLAB Live Editor Intro
  • Use MATLAB to implement a simple blockchain
  • MATLAB App Designer
  • MATLAB App Designer Tutorial 1
  • MATLAB App Designer Tutorial 2
  • MATLAB App Designer Tutorial 3
  • MATLAB App Designer Tutorial 4
  • MATLAB App Designer Tutorial 5
  • MATLAB App Designer Tutorial 6
  • MATLAB App Designer Tutorial 1 (English)
  • MATLAB App Designer Tutorial 2 (English)
  • MATLAB App Designer Tutorial 3(English)
  • MATLAB App Designer Tutorial 4(english)
  • MATLAB App Designer Tutorial 5 (English)
  • MATLAB App Designer Tutorial 6(English)
  • IOT & NodeMCU(English)
  • NodeMCU Tutorial 1(English):NodeMCU + DS18S20 + Thingspeak + MATLAB
  • (English) NodeMCU + LED Strip + MQTT + Express
  • Talkback: Queue commands to NodeMCU via Thingspeak
  • Alexa, Lambda, NodeMCU and holiday light
  • Tell NodeMCU to run any function over the cloud
  • IOT & NodeMCU
  • NodeMCU + LED Strip + MQTT + Express
  • NodeMCU + Arduino IDE
  • NodeMCU + MAC development environment (1)
  • (English)NodeMCU + MAC development environment (2)
  • NodeMCU Tutorial 1:NodeMCU + DS18S20 + Thingspeak + MATLAB
  • NodeMCU Soil Humidity Sensor
  • Making of a Smart Irrigation System (1) : NodeMCU and Thingspeak Pull/Get
  • Making of a Smart Irrigation System (2) : NodeMCU, Relay and Hunter SRC
  • Making of a Smart Irrigation System (3) : Weather Report and Hunter SRC
  • Making of a Smart Irrigation System(4) : HTTP to MQTT Bridge
  • NodeMCU, Thingspeak and Internet Sprinkler
  • Particle Photon by Example
  • Particle Photon By Example: Getting Started
  • Particle Photon By Example : Humidity Sensor and Thingspeak
  • Particle Photon By Example : Web IDE Workflow
  • Particle Photon By Example: Javascript API
  • Particle Photon By Example : Alexa Lambda and Photon
  • Particle Photon By Example : API-Gateway, Lambda and Photon
  • Particle Photon 的设置初级篇
  • Particle Photon 的浏览器编译界面
  • Thingspeak Tutorial
  • Thingspeak tutorial 1
  • Thingspeak tutorial 2
  • Thingspeak tutorial 3
  • Thingspeak tutorial 4
  • Thingspeak tutorial 5
  • Qi & Spirit
  • Qi Example : Materials
  • Error Handling
  • Qi Example : XML
  • Qi Example : Adding Numbers
  • Qi Symbols模板类 : 罗马数字和阿拉伯数字互换
  • Qi Example : Key-KeyValue
  • Spirit 的grammar
  • Spirit的rule
  • Qi Example : Employee
  • AWS MISC
  • AWS Lambda , API Gateway Python and Numpy Deployment
  • Create a serverless fullStack in steps
  • Deploying Graphviz on AWS Lambda
  • About me
  • 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 本质上来说是一种可以存放各种数据类型的容器,比如下面表Table.1中的数据,其中既有字符型,又有数值类型,其中第一行作为表头:Symbol,Name,Market,Cap,IPO, Year是各列的名字。

    Table.1 NASDAQ股票名称表 Symbol Market Cap IPO Year

    在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 =
    >> 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对象 (什么是类的构造函数见参加<<matlab面向对象编程-从入门到设计模式>>第2.5节,构造函数和类的名称相同)。在containers.Map 的介绍中,我们举了电话号码簿的例子,如表Table.3所示,它是我们这节要构造的table对象的原始数据

    Table.3 电话号码簿

    下面程序中第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 =
    

    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 =
    

    图Figure.1中以表Table.1中的数据为例,总结了几种访问table中不同区域的数据的方法。

    Figure.1 访问table中的数据