第1章 MATLAB编程基础
1.1 特殊数据类型
MATLAB支持的数据类型较多,除了常见的数值型、字符和字符串以及日期和时间等数据类型外,还有结构体(structures)、元胞数组(cell arrays)、表(table)和时间表(timetable)、类别数组(categorical arrays)、函数句柄(function handle)和时间序列(time series)等数据类型。其中,结构体、元胞数组、表和时间表是用于存储异构数据(heterogeneous data)的数据容器(data container)。
1.1.1 结构体
结构体是采用数据容器—字段(fields)对相关的数据进行分组管理的一种数据类型。结构体由结构数组(struct arrays)构成,每个数组都是一个包含若干字段的struct类结构,因此,结构体也称为结构体数组(structure arrays)。每个字段可以包含任意类型的数据,包括标量数据或者非标量数据。一个结构体中的所有结构数组具有相同的字段名称和数目。不同结构体中相同名称的字段可以包含不同类型和规模的数据。
结构体中的数据可以采用点记号的形式读取,即结构体名称.字段名(structName. fieldName)。结构体的创建可以采用直接给字段赋值的方式,也可以先用函数struct创建空结构体,然后增加字段并赋值。没有赋值的字段为空数组。
例1.1 用结构体patient存储患者的电子病历,包括姓名(name)、账单(billing)、检查(test)三个字段。
下面的MATLAB代码生成结构体patient,包含两个患者的完整记录,第三个患者的记录不完整,空的字段为空数组。结果如图1.1所示。
patient(1).name='John Doe';
patient(1).billing=127.00;
patient(1).test=[79,75,73;180,178,177.5;220,210,205];
patient(2).name='Ann Lane';
patient(2).billing=28.50;
patient(2).test=[68,70,68;118,118,119;172,170,169];
patient(3).name='New Name';
>>whos
Name Size Bytes Class Attributes
patient 1x3 1200 struct
图1.1 结构体数组patient
结构体中的数据有两种组织形式,一种是平面组织形式(plane organization),另一种是按元素或记录的组织形式(element-by-element organization),例如,例1.1中的patient就是按患者记录的组织形式。采用哪种组织形式取决于如何读取数据、大数据集是否受到存储器的限制。平面组织形式容易读取每个字段的所有值,按元素或记录的组织形式则容易获取每个元素或记录的所有信息。创建结构体时,MATLAB将有关结构体的元素(记录)和字段信息存储在数组头文件(array header)中。在数据相同的情况下,元素和字段多的结构体比简单的结构体要求更多的存储空间。结构体的存储并不需要一个完全连续的存储空间,但每个字段要求连续的存储空间。
例1.2 创建红绿蓝(red green blue,RGB)彩色图像结构体Img。
下面的MATLAB代码首先读入4个RGB彩色图像,然后创建结构体Img,包含red、green、blue 3个字段。
I1=imread('lena_color_256.tif');
I2=imread('mandril_color.tif');
I3=imread('kodim01.png');
I4=imread('kodim02.png');
Img(1).red=I1(:,:,1);
Img(1).green=I1(:,:,2);
Img(1).blue=I1(:,:,3);
Img(2).red=I2(:,:,1);
Img(2).green=I2(:,:,2);
Img(2).blue=I2(:,:,3);
Img(3).red=I3(:,:,1);
Img(3).green=I3(:,:,2);
Img(3).blue=I3(:,:,3);
Img(4).red=I4(:,:,1);
Img(4).green=I4(:,:,2);
Img(4).blue=I4(:,:,3);
>>whos
Name Size Bytes Class Attributes
I1 256x256x3 196608 uint8
I2 512x512x3 786432 uint8
I3 512x768x3 1179648 uint8
I4 512x768x3 1179648 uint8
Img 1x4 3343872 struct
结构体Img包含4个结构数组,每个结构数组包含red、green、blue 3个字段,表示彩色图像的红、绿、蓝3个颜色的图像,如图1.2所示。
图1.2 结构体数组Img
表1.1给出了结构体数组操作的相关函数名称和功能说明。
表1.1 结构体数组操作函数及功能
1.1.2 元胞数组
元胞数组是用元胞(cell)数据容器进行数据索引的一种数据类型,每个元胞可以包含任意类型的数据。元胞数组通常包含字符向量列表,或字符串与数字组合,或不同大小的数值型数组。元胞引用采用圆括号()包含下标的方式实现,元胞内容的读取则采用大括号{}索引的方式。通过元胞赋值可以增加新的元胞,采用给元胞赋值空数组的方式可以删除元胞,还可以整行或整列删除元胞。
元胞数组的创建可以采用大括号{}算子或采用cell函数实现。例如,下面的语句创建元胞数组myCell。
myCell={1,2,3;'text',rand(5,10,2),{11;22;33}};%创建2×3元胞数组
>>myCell
myCell=
2×3 cell 数组
{[ 1]} {[ 2]} {[ 3]}
{'text'} {5×10×2 double} {3×1 cell}
>>myCell{2,1}
ans=
'text'
>>myCell(2,1)
ans=
1×1 cell 数组
{'text'}
>>s=myCell{2,1};
>>s(1,1)
ans=
't'
>>myCell{1,1}
ans=
1
又如,下面的语句创建一个多维的空元胞数组。
emptyCell=cell(3,4,2);%创建3×4×2的元胞数组
>>emptyCell=cell(3,4,2)
3×4×2 cell 数组
emptyCell(:,:,1)=
{0×0 double} {0×0 double} {0×0 double} {0×0 double}
{0×0 double} {0×0 double} {0×0 double} {0×0 double}
{0×0 double} {0×0 double} {0×0 double} {0×0 double}
emptyCell(:,:,2)=
{0×0 double} {0×0 double} {0×0 double} {0×0 double}
{0×0 double} {0×0 double} {0×0 double} {0×0 double}
{0×0 double} {0×0 double} {0×0 double} {0×0 double}
元胞数组操作函数及功能如表1.2所示。
表1.2 元胞数组操作函数及功能
元胞数组不需要完全连续的存储空间,但每个元胞需要连续的存储空间。存储空间预分配可以采用cell函数或给*后一个元胞分配空数组。例如,C=cell(25,50)与C{25, 50}=[]等效,MATLAB将为一个25×50的元胞数组创建头文件。
1.1.3 表与时间表
表是适用于列向数据或表格数据的一种数据类型,在文本文件或电子表中以列的形式存储数据。表由行和列向变量组成,每个变量可以有不同的数据类型和规模,**的限制是每个变量的行数必须相同。表的索引可以用圆括号()或大括号{},前者返回子表,后者可以提取表的内容,如数值数组。另外,还可以用名称引用变量和行。
表的创建可以用函数table实现,也可以从文件直接创建表。
例1.3 用table函数创建一个包含两个变量和两行的表,并指定行名称。
T=
table([10;20],{'M';'F'},'VariableNames',{'Age','Gender'},
'RowNames',{'P1','P2'})
T=
2×2 table
Age Gender
___ ______
P1 10 'M'
P2 20 'F'
这是一个2×2的表,变量名为年龄(Age)和性别(Gender),行名为P1和P2。创建表时也可以用默认的变量名,然后通过表属性修改变量名。例如:
T=table([10;20],{'M';'F'});
T.Properties.VariableNames={'Age','Gender'}
例1.4 创建一个表,加入行名,并用行名访问行。可用下列MATLAB语句实现。
load patients %加载患者数据库patients
T=table(Gender,Age,Height,Weight,Smoker,Systolic,Diastolic);%创建表并指定变量名(性别,年龄,身高,体重,烟民,收缩压,舒张压)
T.Properties.RowNames=LastName;%行名为患者的姓
subtable=head(T,4);%显示表的前4行
>>subtable=head(T,4)
subtable=
4×7 table
Gender Age Height Weight Smoker Systolic Diastolic
______ ___ ______ ______ ______ ________ _______
Smith 'Male' 38 176 71 true 124 93
Johnson 'Male' 43 163 69 false 109 77
Williams 'Female' 38 131 64 false 125 83
Jones 'Female' 40 133 67 false 117 75
表操作