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 |
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文件。
"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
Table.2 Nasdaq 的 csv 原始数据
读入之后数据将会被分成数值和非数值部分:
-
% 用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对象
(什么是类的构造函数见参加<</span>>第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中的数据
加载中,请稍候......