第1章 MATLAB基础
1.1 MATLAB简介
MATLAB是美国 MathWorks公司出品的商业数学软件,是用于算法开发、数据可视化、数据分析以及数值计算的高级计算语言和交互式环境,主要包括 MATLAB和 Simulink两大部分。MATLAB对矩阵的处理能力很强,在工程计算方面应用广泛,而且与其他的编程语言(C、C++)的兼容性良好。MATLAB可以给用户创造一个极其方便的使用环境。MATLAB的语法规则不需要用户预先定义变量名和数组名,这就大大简化了使用的复杂度。只要用户具备简单的语言基础就可以很快地掌握使用方法。另外, MATLAB语言具有短而精的特点,它自带的函数库里已经将复杂的数学模型的具体算法编成了现成可用的函数。用户只需要对算法的特点、使用环境、函数调用规则和参数意义有所熟悉就可以直接通过调用函数来快速地解决问题。
除此之外,MATLAB强大的图形处理能力也使得这款软件被公认为世界上*好用的数学应用软件之一。它甚至可以生成快照并进行动画制作,这对于图像处理来说无疑是很重要的。MATLAB自带多达几十个工具箱,这些工具箱实际上是一系列的 MATLAB函数(即 M文件),在函数处理的时候可以直接调用这些 M文件。在每次的版本升级中,这些函数库也会不断被补充完善和更新,使得其工具箱的功能越来越丰富。
1. MATLAB的发展历程
20世纪70年代,美国新墨西哥大学计算机科学系主任 Cleve Moler为了减轻学生编程的负担,用 FORTRAN编写了*早的 MATLAB。1984年,Little、Moler和 Steve Bangert合作成立了 MathWorks公司,正式把 MATLAB推向市场。到20世纪90年代,MATLAB已成为国际上认可度较高的科学计算软件。
2. MATLAB的主要应用
MATLAB的应用范围非常广,包括信号和图像处理、通信、控制系统设计、测试和测量、财务建模和分析以及计算生物学等众多应用领域,可以用来进行以下各种工作。
(1)线性代数。
(2)矩阵分析。
(3)数值及优化。
(4)数理统计和随机信号分析。
(5)电路与系统。
(6)系统动力学。
(7)信号和图像处理。
(8)控制理论分析和系统设计。
(9)过程控制、建模和仿真。
(10)通信系统和财政金融。
MATLAB信号处理仿真实践
3. MATLAB的主要特点
MATLAB具备以下主要的特点。
(1)高效的数值计算及符号计算功能,能使用户从繁杂的数学运算分析中解脱出来。
(2)具有完备的图形处理功能,实现计算结果和编程的可视化。
(3)友好的用户界面及接近数学表达式的自然化语言,使学者易于学习和掌握。
(4)功能丰富的应用工具箱(如信号处理工具箱、通信工具箱等),为用户提供了大量方便实用的处理工具。
1.2 特殊数据类型
MATLAB支持的数据类型较多,除了常见的数值型、字符和字符串、日期和时间等数据类型外,还有结构体(Structures)、元胞数组(Cell Arrays)、表(Table)和时间表(Timetable)、类别数组(Categorical Arrays)、函数句柄(Function Handle)和时间序列(Time Series)等数据类型。其中,结构体、元胞数组、表和时间表是用于存储异构数据(Heterogeneous Data)的数据容器(Data Container)。
1.2.1 结构体
结构体是采用数据容器——字段(Fields)对相关的数据进行分组管理的一种数据类型。结构体由结构数组(Struct Array)构成,每个数组都是一个包含若干字段的struct类结构,因此,结构体也称为结构体数组(Structure Arrays)。每个字段可以包含任意类型的数据,包括标量数据或者非标量数据。一个结构体中的所有结构数组具有相同的字段名称和数目。不同结构体中相同名称的字段可以包含不同类型和规模的数据。
结构体中的数据可以采用点记号的形式读取,即结构体名.字段名(structName.field Name)。结构体的创建可以采用直接给字段赋值的方式,也可以先用函数struct创建空结构体,然后再增加字段并赋值,没有赋值的字段为空数组。
(1)直接赋值法产生结构体变量。
【例1.1】温室数据(包括温室名、容量、温度、湿度等)的创建与显示。
green_house.name='一号温室'; %创建温室名字段,并对该变量赋值
green_house.volume='2000立方米';%创建温室容量字段,并对该变量赋值
%创建温室温度字段
green_house.parameter.temperature=[31.230.431.628.729.731.130.929.6];
%创建温室湿度字段
green_house.parameter.humidity=[62.159.557.761.5;62.061.959.257.5];
运行结果:
①显示变量 green_house的值,在命令行输入
>> green_house
green_house=
包含以下字段的 struct:
name:'一号温室'
volume:'2000立方米'
parameter:[1×1 struct]
②显示变量 green_house.parameter.temperature的值,在命令行输入
>> green_house.parameter.temperature ans=31.200030.400031.600028.700029.700031.100030.900029.6000
③显示变量 green_house.parameter.humidity的值,在命令行输入
>> green_house.parameter.humidity
ans=
62.100059.500057.700061.5000
62.000061.900059.200057.5000
说明:输出为结构体变量 green_house、green_house.parameter.temperature以及 green_house.parameter.humidity的值。这些变量值的显示可以在命令窗口里输入相应的变量名称并按“回车”键后看到。
(2)采用struct函数来创建结构体变量,该函数直接将字段名和字段值作为struct函数的参数。
【例1.2】利用struct函数来创建结构体变量A,并利用该结构体变量存储同学的姓名、学号、性别和国籍。具体输入方法及创建结果如下所示。
A=struct('name','Dale','number','110211131','sex','male','nationality'
,'CHINA')运行结果:
>> A
A=
包含以下字段的 struct:
name:'Dale'
number:'110211131'
sex:'male'
nationality:'CHINA'
结构体中的数据有两种组织形式:一种是平面组织形式(Plane Organization),另一种是按元素或记录的组织形式(Element-by-element Organization)。采用哪种组织形式取决于如何读取数据,以及大数据集是否受到存储器的限制。平面组织形式容易读取每个字段的所有值,按元素的组织形式则容易获取每个元素或记录的所有信息。创建结构体时,MATLAB将有关结构体的元素(记录)和字段信息存储在数组头文件(Array Header)中。在数据相同的情况下,元素和字段多的结构体比简单的结构体要求更多存储空间。结构体的存储并不需要一个完全连续的存储空间,但每个字段要求连续的存储空间。
1.2.2 元胞数组
元胞数组是用元胞(cell)数据容器进行数据索引的一种数据类型,每个元胞可以包含任意类型的数据。元胞数组通常包含文本串列表,文本与数字组合,或不同大小的数字型数组。元胞引用采用圆括号()包含下标的方式实现,元胞内容的读取则采用大括号{}索引的方式。通过给元胞赋值可以增加新的元胞,采用给元胞赋值空数组的方式可以删除元胞,还可以整行或整列删除元胞。
元胞数组的创建可以采用大括号{}算子或采用 cell函数实现。例如,可以使用例1.3和例1.4中的语句创建元胞数组 C。
【例1.3】本示例说明如何创建一个包含文本和数字数据的2×3元胞数组,并从元胞数组中读取数据。
%创建一个2×3的元胞数组
C={'one','two','three';1,2,3}
运行结果:
>> C
C=
2×3 cell 数组
{'one'}{'two'}{'three'}
{[1]}{[2]}{[3]}
【例1.4】利用 cell函数来创建元胞数组。
在命令窗口输入语句“ a=cell(3,3)”,创建一个3×3的元胞数组,如下所示。
>> a=cell(3,3)
a=
3×3 cell 数组
{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}
说明:语句“ a=cell(3,3)”创建了一个3×3的空元胞数组。
【例1.5】读取元胞数组中的数据。
(1)首先使用{}语句创建元胞数组,如下所示。
>> b={'abcd',[1,2,3,4];1234,'a'}
b=
2×2 cell 数组
{'abcd'}{1×4 double}
{[1234]}{'a'}
说明:语句“ b={'abcd',[1,2,3,4];1234,'a'}”
创建了一个如上所示的2×2元胞数组。
(2)读取上述元胞数组中的数据。在命令窗口输入“b{1,2}”将读取元胞数组 b={'abcd',[1,2,3,4];1234,'a'}第1行第2列数据,如下所示。
>> b{1,2}
ans=
1 2 3 4
(3)读取上述元胞数组里面的详细数据。例如,在命令窗口输入语句“b{1,2}(1,2)”,结果如下所示。>> b{1,2}(1,2)ans=2
说明:语句“b{1,2}(1,2)”将读取 b={'abcd',[1,2,3,4];1234,'a'}中第二个元素中的第二个值。
元胞数组不需要完全连续的存储空间,但每个元胞需要连续的存储空间。存储空间预分配可以采用cell函数或给*后一个元胞分配空数组。例如,C=cell(25,50)与 C{25,50}=[]等效,MATLAB将为一个25×50的元胞数组创建头文件。
1.2.3 表与时间表
表是适用于列
展开