第1章 MATLAB基础


MATLAB是一款专业的商业计算机软件开发工具,设计之初主要应用于工程科学中的数学运算,后来它又渐渐发展成了通用科技计算、图视交互系统和程序语言,由于其日益完善逐渐发展成为一种极其灵活的计算体系,用于解决各种重要的技术问题。
本章首先简要介绍MATLAB软件所要实现的功能及特点、MATLAB软件的基本组成结构,其中包括目录结构、工作环境和系统帮助。1.3节是让广大MATLAB软件的初学者了解MATLAB的基本运算功能并例举了示例以及MATLAB编程语句。最后,介绍了数据类型及M文件的操作。
学习目标:
(1)掌握通用命令
(2)熟练掌握编程语句
(3)熟练掌握MATLAB数据类型
(4)熟练掌握M文件
1.1 MATLAB简介
20世纪80年代,美国新墨西哥大学计算机科学系主任Cleve Moler教授使用FORTRAN编写了一组用于调用LINPACK和EISPACK程序库的接口,用于矩阵、线性代数和数值分析,这就是MATLAB。它是取MATrix LABoratory(矩阵实验室)两个单词的前3个字符组合而成。它是一种科学计算软件,专门以矩阵的形式处理数据。
随后,斯坦福大学的Jack Little 使用C重写MATLAB内核,使得软件兼具数值分析和数据可视化两大功能,并成立了MathWorks公司,将MATLAB软件商业化并推向市场。MATLAB支持UNIX、Linux、Windows多种操作平台系统。
如今,MATLAB已经成为具备计算机程序设计语言(Computer Programming Language)和交互软件环境(an Interactive Software Environment)的高效率的计算机语言。它将高性能的数值计算和可视化集成在一起,并提供了大量的内置函数,从而被广泛地应用于科学计算、控制系统、信息处理等领域的分析、仿真和设计工作,而且利用MATLAB产品的开放式结构可以非常容易地对MATLAB的功能进行扩充,从而在不断深化对问题认识的同时,不断完善MATLAB产品以提高产品自身的竞争能力。
目前,MATLAB产品族广泛应用于:数值分析;数值和符号计算;工程与科学绘图;图形用户界面设计、控制系统的设计与仿真;数字图像处理;数字信号处理;通信系统设计与仿真;财务与金融工程等领域。
MATLAB的一个重要特色就是它有一套程序扩展系统和一组称之为工具箱(Toolboxes)的特殊应用子程序。工具箱是MATLAB函数的子程序库,每一个工具箱都是为某一类学科专业和应用而定制的,主要包括信号处理、控制系统、神经网络、模糊逻辑、小波分析和系统仿真等方面的应用。
MATLAB程序执行MATLAB语言,并提供了一个极其广泛的预定义函数库,这样就使得技术工作变得简单高效。MATLAB是一个庞大的程序,拥有难以置信的各种丰富的函数,即使是基本版本的MATLAB语言,其拥有的函数也比其他的工程编程语言要丰富得多。基本的MATLAB语言已经拥有超过1 000的函数。
MATLAB主包和各种可选的toolbox工具包主要有数百个核心内部函数。迄今三十几个工具包分为两类功能性工具包和学科性工具包。
(1)功能性工具包主要用来扩充MATLAB的符号计算功能、图视建模仿真功能、文字处理功能以及硬件实时交互功能,这种功能性工具包用于多种学科。
(2)学科性工具包是专业性比较强的工具包,如控制工具包(Control Toolbox)、信号处理工具包(SignalProcessing Toolbox)、通信工具包(Communication Toolbox)和小波工具包(Wavelet Toolbox)等都属此类工具包。
也许MATLAB最重要、最受人欢迎的特点是:除内部函数外,所有MATLAB主包文件和各工具包文件都是可读可改的源文件,用户可通过对源文件的修改或加入自己的编写文件去构成新的专用工具包。
本书无意将MATLAB的所有函数和工具包介绍给大家,而是让大家在学习小波分析的基本内容的同时,通过MATLAB软件提供的小波工具包来实现小波的各种应用,从而辅助读者编写和调试相应的程序,帮助读者了解小波,用好小波。并且在学习小波的同时,将MATLAB小波工具包中提供的函数融会贯通。
1.2 MATLAB组成结构
本节着重介绍MATLAB的组成体系,主要包括目录结构、工作环境和帮助系统,从感观上了解MATLAB软件的界面和环境。
1.2.1 目录结构
当用户成功安装MATLAB时,在用户所选择的安装目录下将包含如表1-1所示的文件夹目录。
表1-1 MATLAB的目录结构


续表
 

1.2.2 工作环境
本节通过介绍MATLAB工作环境界面,使读者初步掌握MATLAB软件的基本操作方法。
MATLAB的工作界面主要由选项卡、命令窗口、历史命令窗口、当前工作目录窗口和工作空间管理窗口组成,如图1-1(a)所示。单击选项卡右侧的
 按钮,此时选项卡菜单关闭,如图1-1(b)所示。
1.选项卡
MATLAB的界面与 Windows 程序的界面类似,用户只要稍加实践就可掌握其功能和使用方法。选项卡的内容会随着在命令窗口中执行不同命令而作出相应改变。这里只简单介绍图1-1中所示的3个主要的选项卡。
图1-1 MATLAB工作环境
 

图1-1 MATLAB工作环境(续)
(1)HOME选项卡,常用的选项主要有以下几种。
•FILE 面板,主要命令如下。
New Script:新建脚本文件。
•VARIABLE 面板,主要命令如下。
Save Workspace:将工作空间的变量存储在某一文件中。
Import Data:用于向工作空间导入数据。
•ENVIRONMENT 面板,主要命令如下。
Set Path:打开环境设置对话框,如图1-2所示。
图1-2 Set Path对话框
Preferences:打开环境设置对话框,如图1-3所示。
•CODE 面板:用于设置调试程序。
•RESOURCES 面板,主要命令如下。
图1-3 Preferences对话框
Help面板:用于选择打开不同的帮助系统,如图1-4所示。
图1-4 Help面板
(2)PLOTS选项卡:用于画图的选项卡。单击主窗口第二个按钮,可以直接打开各种MATLAB画图工具,并且还有相应的画图命令,如图

1-5所示。
(3)APPS选项卡:工具箱选项。单击窗口上的第三个按钮,可以直接打开各种MATLAB的工具箱。
2.命令窗口
MATLAB的命令窗口中的“>>”为运算提示符,表示MATLAB处于准备状态。当在提示符后输入一段程序或一段运算式后按Enter键,MATLAB会给出计算结果,并再次进入准备状态(所得结果将被保存在工作空间管理窗口中)。
图1-5 PLOTS菜单
单击命令窗口右上角的按钮,可以使命令窗口脱离主窗口而成为一个独立的窗口,如图1-6所示。
图1-6 命令窗口
在该窗口中选中某一表达式,然后右击,弹出如图1-7所示的上下文菜单,通过不同的选项可以对选中的表达式进行相应的操作。
 

图1-7 命令窗口的上下文菜单
3.历史命令窗口
该窗口主要用于记录所有执行过的命令,在默认设置下,该窗口会保留自安装后所有使用过的命令的历史记录,并标明使用时间。同时,用户可以通过双击某一历史命令来重新执行该命令。与命令窗口类似,该窗口也可以成为一个独立的窗口。
在该窗口中选中某历史记录,然后右击,弹出如图1-8所示的上下文菜单。通过上下文菜单,用户可以删除或粘贴历史记录;也可为选中的表达式或命令创建一个M文件;还可为某一句或某一段表达式或命令创建快捷按钮,具体方法见下面的示例。
选择图1-8中的Create Shortcut命令,弹出如图1-9所示的Shortcut Editor对话框(“快捷键设置”对话框)。
图1-8 历史命令窗口的上下文菜单
图1-9 Shortcut Editor对话框
按照图1-9所示内容进行快捷键的设置,然后单击Save按钮,注意观察工具栏SHORTCUTS栏的变化,如图1-10所示。
图1-10 创建新的快捷键
单击新加入的快捷按钮,命令窗口中会显示相应命令执行的结果。
用户还可以直接按住鼠标左键不放,将所选中的历史命令直接拖到SHORTCUTS栏中,这样也可为所选命令创建快捷键。
4.当前工作目录窗口
在目录窗口中可显示或改变当前目录,还可以显示当前目录下的文件以及搜索功能。与命令窗口类似,该窗口也可以成为一个独立的窗口,如图1-11所示。
5.工作空间管理窗口
在工作空间管理窗口中将显示目前内存中所有的MATLAB变量的变量名、数据结构、字节数以及类型等信息,不同的变量类型分别对应不同的变量名图标,如图1-12所示。
图1-11 当前工作目录窗口
图1-12 工作空间管理窗口
1.2.3 系统帮助
MATLAB为用户提供了非常完善的帮助系统,例如,MATLAB的在线帮助、帮助窗口、帮助提示、HTML格式的帮助、pdf格式的帮助文件以及MATLAB的示例和演示等。
通过使用MATLAB的帮助菜单或在命令窗口中输入帮助命令,可以很容易地获得MATLAB的帮助信息,并能通过帮助进一步学习MATLAB。下面分别介绍MATLAB中3种类型的帮助系统。
 

1.命令窗口查询帮助系统
常见的帮助命令如表1-2所示。
表1-2 常用MATLAB帮助命令
help命令:在命令窗口用于显示MATLAB函数的帮助。调用格式如下:
help             //在命令窗口列出所有主要的基本帮助主题
help /             //列出所有运算符和特殊字符
help functionname        //在命令窗口列出 functionnameM文件的描述及语法
help toolboxname        //在命令窗口列出 toolboxname文件夹中的内容
help toolboxname/functionname
help classname.methodname    //显示某一类的函数帮助
help classname
help syntax
t=help('topic')
例如:
>> help
HELP topics:
MATLABxl\MATLABxl     -MATLABBuilderEX
MATLAB\demos       -Examples anddemonstrations.
MATLAB\graph2d       -Two dimensional graphs.
MATLAB\graph3d       -Three dimensional graphs.
MATLAB\graphics      -HandleGraphics.
MATLAB\plottools      -Graphicalplot editing tools

blocks\library        - (No tableof contents file)
simulink\simulink       -Simulink
simulink\blocks        -Simulink block library.
simulink\components      -Simulink components.
simulink\fixedandfloat      -SimulinkFixedPoint utilities.
fixedandfloat\obsolete      - (No table of contents file)
simulink\dee         -DifferentialEquationEditor
simulink\MPlayIO       - (No table of contents file)

wavelet\wavedemo       - (No table of contents file)
wavelet\compression      - (No table of contents file)
xpc\xpc          - xPCTarget
xpcblocks\thirdpartydrivers    - (No table of contents file)
build\xpcblocks        - xPCTarget --Blocks
xpc\xpcdemos        - xPCTarget --demos and sample script files.
2.帮助系统
MATLAB的联机帮助系统非常全面。用户可以通过输入>>help进入MATLAB的联机帮助系统,如图1-13所示。
下面介绍联机帮助系统的使用方法和技巧。
联机帮助系统界面的菜单项与大多数Windows 程序界面的菜单含义和用法都差不多,熟悉Windows的用户可以很容易地掌握,在此不作详细介绍。
帮助向导页面包含 4个页面,分别是帮助主题(Contents)、帮助索引(Index)、查询帮助(Search)以及演示帮助(Demos)。如果知道需要查询的内容的关键字,一般可选择Index或Search 模式来查询;只知道需要查询的内容所属的主题或是只是想进一步了解和学习某一主题,一般可选择Contents或Demos 模式来查询。
图1-13 联机帮助系统
3.联机演示系统
通过联机演示系统,用户可以直观、快速地学习MATLAB中某个工具箱的使用方法,它是有关的参考书籍所不能替代的。下面就向读者介绍如何使用联机演示系统。
可以通过在命令窗口输入demos;的方式打开联机演示系统。
例如,在MATLAB命令窗口中执行“>>demos”命令,弹出如图1-14所示的界面。
图1-14 联机演示系统
 

联机演示系统对于学习工具箱以及MATLAB各个方面的应用的用户非常有意义。通过演示示例,用户可以快速直观地掌握某一工具的使用方法,而不必从枯燥的理论开始学起。
1.3 掌握MATLAB编程
为了更好地使用MATLAB,用户需要熟练掌握和理解MATLAB的常用命令,即基本函数,下面对这些命令进行介绍。
1.3.1 通用命令
通用命令是MATLAB中经常使用的一组命令,这些命令可以用来管理目录、命令、函数、变量、工作空间、文件和窗口。
1.常用命令
常用命令的功能如表1-3所示。
表1-3 常用命令
2.输入内容的编辑
在MATLAB命令窗口中,为了便于对输入的内容进行编辑,MATLAB提供了一些控制光标位置和进行简单编辑的一些常用编辑键和组合键,掌握这些可以在输入命令的过程中起到事半功倍的效果。表1-4列出了一些常用键盘按键及其作用。
表1-4 命令行中的键盘按键
3.标点
在MATLAB语言中,一些标点符号也被赋予了特殊的意义,或代表一定的运算,具体内容如表1-5所示。
表1-5 MATLAB语言的标点
 

1.3.2 演示示例
首先以一个简单的示例向读者展示如何使用MATLAB进行简单的计算。
双击桌面上的MATLAB图标,进入MATLAB的工作环境界面;
在命令窗口中输入>>x=4*pi;,按 Enter 键,可以在工作空间窗口看到变量 x,大小为14.566 4;
在命令窗口中输入>>y=cos(x);,按Enter键,可以在工作空间窗口看到变量y,大小为1;
在命令窗口中输入>>z=cos(x/3),按 Enter 键,可以在工作空间窗口看到变量 z,大小为−0.5,命令窗口中显示代码如下:
z=
-0.5000
命令窗口中输入>>clear;clc;将清空命令窗口和工作空间窗口的所有变量。
注意:当命令后面有分号时,按 Enter 键后,命令窗口中不显示运算结果;如果无分号,则在命令窗口中显示运算结果。当希望先输入多条语句,然后再同时执行它们,则在输入下一条命令时,在按住Ctrl 键的同时按下Enter 键进行换行输入。
1.3.3 编程语句
在前面举的MATLAB程序都十分简单,包括一系列的MATLAB语句,这些语句按照固定的顺序一个接一个的执行,像这样的程序我们称之为顺序结构程序。MATLAB的主要功能虽然是数值运算,但它也是一个完整的程序语言,有各种语句格式,主要包括3种,即顺序、选择、循环结构。
1.选择结构
选择结构可以使MATLAB选择性执行指定区域内的代码(称之为语句块blocks),而跳过其他区域的代码。
(1)if 结构。
选择结构在MATLAB中有3 种具体的形式:if 结构、switch 结构和try/catch 结构。
if 结构的基本形式如下:
if control_expr_1
Statement 1
Statement 2
elseif control_expr_2
Statement 1
Statement 2
else
Statement 1
Statement 2
end
其中控制表达式(Control Expression)控制if 结构的运算。如果control_expr_1的值非0,那么程序将会执行语句1,然后跳到end 后面的第一个可执行语句继续执行;否则,程序将会检测control_expr_2的值。如果control_expr_2的值非0,那么程序将会执行语句2,然后跳到 end 后面的第一个可执行语句继续执行。如果所有的控制表达式(Control Expression)均为0,那么程序将会执行与else 相关的语句块。
在一个if 结构中,可以有任意个elseif 语句,但else 语句最多有一个。只要上面每一个控制表达式均为0,那么下一个控制表达式将会被检测。一旦其中的一个表达式的值非0,对应的语句块就要被执行,然后跳到end 后面的第一个可执行语句继续执行。如果所有的控制表达式(Control Expression)均为0,那么程序将会执行else 语句。如果没有else 语句,程序会执行end 后面的语句,而不执行if 结构中的部分。
(2)switch 结构。
switch 结构是另一种形式的选择结构。程序员可以根据一个单精度整型数、字符或逻辑表达式的值来选择执行特定的代码语句。
switch (switch_expr)
case case_expr_1,
Statement 1
Statement 2
case case_expr_2
Statement 1
Statement 2
otherwise,
Statement 1
Statement 2
end
如果switch_expr的值与case_expr_1相符,那么第一个代码块将会被执行,然后程序将会跳到switch结构后的第一个语句;如果switch_expr的值与case_expr_2相符,那么第二个代码块将会被执行,然后程序将会跳到switch 结构后的第一个语句。
在这个结构中,用相同的方法来对待其他的情况。otherwise语句块是可选的,如果它存在的话,当switch_expr的值与其他所有的选项都不相符时,这个语句块将会被执行;如果它不存在,且switch_expr的值与其他所有的选项都不相符,那么这个结构中的任何一个语句块都不会被执行。这种情况下的结果可以看作没有选择结构,直接执行MATLAB语言。
如果说switch_expr有很多值可以导致相同代码的执行,那么这些值可以括在同一括号内,如下所示。如果这个switch表达式和表中任何一个表达式相匹配,那么这个语句块将会被执行。
switch (switch_expr)
case {case_expr_1,case_expr_2,case_expr_3},
Statement 1
Statement 2
otherwise,
Statement 1
Statement 2
switch_expr和每一个case_expr既可以是数值,也可以是字符值。
注意,在大多情况下只有一个语句块会被执行。当一个语句块被执行后,编译器就会跳到end 语句后的第一个语句开始执行。如果switch 表达式和多个case表达式相对应,那么只有它们中的第一个将会被执行。
2.循环结构
循环(Loop)是一种MATLAB结构,它允许我们多次执行一系列的语句。循环结构有两种基本形式:while循环和for循环。
(1)while 循环。
while 循环和for 循环两者之间的最大不同在于代码的重复是如何控制的。在while 循环中,代码的重复次数是不能确定的,只要满足用户定义的条件,重复就进行下去。
相对地,在 for 循环中,代码的重复次数是确定的,在循环开始之前,就知道代码重复的次数了。
只要满足一定的条件,while 循环是一个重复次数不能确定的语句块。它的基本形如下:
while expression
end
如果expression的值非零(True),程序将执行代码块,然后返回到while 语句执行。如果expression的值仍然非零,那么程序将会再次执行代码。直到expression的值变为0,这个重复过程结束。当程序执行到 while 语句且 expression的值为0 之后,程序将会执行end后面的第一个语句。
(2)for循环。
for 循环结构是另一种循环结构,它以指定的数目重复地执行特定的语句块。for 循环的形式如下:
for index=exprStatement 1
Statement n
end
其中,index是循环变量(就是我们所熟知的循环指数),exp是循环控制表达式。变量index读取的是数组expr的行数,然后程序执行循环体,所以expr有多少列,循环体就循环多少次。expr经常用捷径表达式的方式,即first:incr:last。
在for和end之间的语句我们称之为循环体。在for循环运转的过程中,它将被重复地执行。
1.4 数据类型
MATLAB中定义了很多种数据类型,其中包括整数、浮点数、字符串、逻辑运算符、单元数组、结构体和函数句柄等。
1.4.1 整数数据类型
MATLAB支持8位、16位、32位和64位的有符号和无符号整数数据类型。表1-6对这些数据类型进行了总结。
表1-6 整数数据类型
表 1-6中的整数数据类型除了定义范围不同外,它们具有相同的性质。它们的定义范围可以通过函数intmax和intmin获得,其中intmax获得范围的上限,intmin获得范围的下限。下例分别获取int8和uint32的上限和下限:
>> intmax('int8')
ans=
127
>> intmin('uint32')
ans=
0
我们可以通过多种方式创建一个整数数据变量。当我们需要一个全0或全1数组时,可以使用函数zeros和ones。下例分别创建int8类型的全0数组和uint16类型的全1数组:
>> m=zeros(1,6,'int8')
m=
0 0 0 0 0 0
>> class(m) % confirm class of result
ans=
int8
>> n=ones(4,'uint16')
n=
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
>> class(n)
ans=
uint16
下面的示例代码演示了基于相同类整数数据类型之间的数学运算:
>> k=int8(1:7)
k=
1 2 3 4 5 6 7
>> m=int8(randperm(7))
m=
7 2 3 6 4 1 5
>> k+m % addition
ans=
8 4 6 10 9 7 12
>> k-m % subtraction
ans=
-6 0 0 -2 1 5 2
>> k.*m % element by element multiplication
ans=
7 4 9 24 20 6 35
>> k./m
ans=
0 1 1 1 1 6 1
>> k
k=
1 2 3 4 5 6 7
>> k/k(2)
ans=
1 1 2 2 3 3 4
注:MATLAB在进行整数除法时,首先基于双精度类型进行运算,然后将运算结果进行四舍五入取整,最后把取整结果转化为原来的整数数据类型。
MATLAB至今还未定义不同整数数据类型之间的数学运算,不过,一个双精度类型的标量和一个整数数据类型的数组之间可以进行数学运算,此时,MATLAB先把双精度类型的标量转化为相应的整数数据类型,然后执行需要的数学运算,如下例所示。
>> m
m=
7 2 3 6 4 1 5
>> class(m)
ans=
int8
>> n=cast(k,'uint16')
n=
1 2 3 4 5 6 7
>> m+n % try mixed type addition
Error using+
Integers can only be combined with integers of the same class,or scalar doubles.
>> n+3
ans=
4 5 6 7 8 9 10
>> class(ans)
ans=
uint16
>> n-(1:7)
Error using−
Integers can only be combined with integers of the same class,or scalar doubles.
MATLAB仅支持一个双精度类型的标量和一个整数数据类型数组之间的混合数学运算,但不支持一个双精度类型的数组和一个整数数据类型数组之间的混合数学运算。
由于每种整数数据类型都有相应的取值范围,因此数学运算有可能产生结果溢出(即得出超过相应整数数据类型取值范围的结果)。
MATLAB利用饱和处理处理此类问题,即当运算结果超出了由函数 intmin和intmax指定的上下限时,就将该结果设置为intmin或intmax的返回值,到底是哪一个,主要看溢出的方向。具体见下例:
>> k=cast('hellothere','uint8')
k=
104 101 108 108 111 116 104 101 114 101
>> double(k)+150
ans=
254 251 258 258 261 266 254 251 264 251
>> k+150
ans=
254 251 255 255 255 255 254 251 255 251
>> k-110
ans=
0 0 0 0 1 6 0 0 4 0
总之,MATLAB支持各种整数数据类型。除了64位整数数据类型外,其他整数数据类型都具有比双精度类型较高的存储效率。
基于同一整数数据类型的数学运算将产生相同数据类型的结果。混合数据类型的运算仅限于在一个双精度类型的标量和一个整数数据类型数组之间进行。
1.4.2 浮点数数据类型
本节的浮点数数据类型同样符合 IEEE为双精度数据类型运算制定的标准。为了节省存储空间,MATLAB也支持单精度数据类型的数组。
基于单精度数据类型的数学运算的定义和操作与1.4.1节整数数据类型基本相同。在下面的例子中,我们分别用函数realmin、realmax和eps得到单精度数据类型的取值范围和精度。
>>realmin('single')
ans=
1.1755e-38
>>realmax('single')
ans=
3.4028e+38
>>eps('single')
ans=
1.1921e-07
>>realmin('double')
ans=
2.2251e-308
>>realmax('double')
ans=
1.7977e+308
>>eps
ans=
2.2204e-16
单精度数据的创建与前述整数数据的创建方法相同,如下例所示。
>> a=zeros(1,5,'single')
a=
0 0 0 0 0
>> b=eye(3,'single')
b=
1 0 0
0 1 0
0 0 1
>> c=single(1:7)
c=
1 2 3 4 5 6 7
>> d=cast(6:-1:0,'single')
d=
6 5 4 3 2 1 0
单精度数据之间或单精度与双精度数据之间的数学运算的结果将为单精度数,如下例所示。
>> c.^d
ans=
1 32 81 64 25 6 1
>> c*pi
ans=
5.1416 8.2832 11.4248 14.566 2.708 110.85 23.991
>> d.*rand(size(d))
ans=
6.879 0.049307 0.55556 0.6083 0.39744 0.60379 0
>> class(ans)
ans=
single
MATLAB支持双精度和单精度数组之间的数学运算,返回单精度值。
单精度数据类型中包含双精度数据类型中常见的特殊浮点值Inf和NaN,如下例所示。
>> c
c=
1 2 3 4 5 6 7
>> c(1:2:end)=0
c=
0 2 0 4 0 6 0
>> c./c
Warning: Divide by zero.
Ans=
NaN 1 NaN 1 NaN 1 NaN
>> 3./c
Warning: Divide by zero.
Ans=
Inf 0.5 Inf 0.25 Inf 0.16667 Inf
1.4.3 字符串
尽管MATLAB的主要功能是对数值的处理能力,但有时我们也不可避免地遇到处理文本的情形,例如,在画图时需要插入坐标轴标签和标题等。
鉴于此,MATLAB也定义了针对文本处理的数据类型——字符串。
MATLAB中,字符串是特殊的ASCII数值型数组,只不过它们显示出来的是字符形式。下例创建了一个字符串t,并用size和whos函数查看其大小:
>> t='How about this character string?'
t=
How about this character string?
>> size(t)
ans=
1 32
>> whos
Name  Size Bytes Class
ans   1×2 16   double array
t   1×32  64    char array
Grand total is 34 elements using 80 bytes
在MATLAB中,一个字符串就是用单引号括起来的一系列字符的组合,其中的每个字符都是该字符串的一个元素,通常都用两个字节来存储。
要查看一个字符串的底层ASCII值,用户只要使用一个简单的数学运算函数(例如,double、abs等)就可以了。下例利用double和abs函数查看t的ASCII值:
>> u=double(t)
u=
Columns 1 through 12
72 111 119 32 97 98 111 117 116 32  116 104
Columns 13 through 24
105 115 32 99 104 97 114 97 99 116  101 114
Columns 25 through 32
32 115 116 114 105 110 103 63
>> abs(t)
ans=
Columns 1 through 12
72 111  119 32 97 98 111 117 116 32 116 104
Columns 13 through 24
105 115  32 99 104 97 114 97 99 116 101 114
Columns 25 through 32
32 115  116 114 105 110 103 63
要想将一串ASCII值转化为字符串显示,可以使用char函数,下例将u重新转化为字符串进行显示:
>> char(u)
ans=
How about this character string?
注意:MATLAB可以把一个负值转换成一个空字符,但同时给出一条警告信息;对于大于255的数,MATLAB将直接从大于char(255)的字符中选取(这一点与以前的版本不同)。读者可以利用下面的代码验证这两条结论:
>> a=double('a')
a=
97
>> char(a)
ans=
a
>> char(a+256)
ans=
š
>> char(a-256)
Warning: Out of range or non-integer values truncated during conversion to character.
ans=
因为字符串从其本质讲是用ASCII值表示的数组,因此它们可以用MATLAB提供的所有数组处理工具进行处理。例如,下面的代码利用直接数组索引获取字符串中的部分字符:
>> u=t(16:24)
u=
character
上例中,由于 t的第16 到第24个元素包含的是character 这个词,因此,u的值为“character”。下例则按照相反的顺序获取t的第16到第24个元素:
>> u=t(24:-1:16)
u=
retcarahc
我们还可以使用转置操作符将字符串转化为列的形式。例如,下例获取t的第16到第24个元素并写成列的形式:
>> u=t(16:24)'
u=
c
h
a
r
a
c
t
e
r
若一个字符串本身含有单引号这个字符,需要将该单引号写成两个单引号形式,如下例所示:
>> v='I can''t find the manual!'
v=
I can't find the manual!
另外,我们可以使用与数组组合相同的方式将多个字符串组合成一个字符串,如下例所示:
>> u='If a woodchuck could chuck wood,';
>> v=' how much wood could a woodchuck chuck?';
>> w=[u v]
w=
If a woodchuck could chuck wood,how much wood could a woodchuck chuck?
函数disp显示一个字符串的内容而不显示其变量名,因此,它通常用于在脚本文件中显示必要的说明性文字。例如,下例用disp函数显示了u的内容:
>> disp(u)
If a woodchuck could chuck wood,
字符串数组可以是多行多列的数组,但必须保证每一行都有相同的列数。因此,当用户创建一个多行字符串数组时,需要显式地输入部分空格,以便使所有的行长度相同。例如,下面的代码创建一个 3 行的字符串数组 v,其中的第二行和第三行都输入了部分空格以便使各行长度相等:
>> v=['Character strings having more than'
'one row must have the same number '
'of columns just like arrays!    ']
v=
Character strings having more than
one row must have the same number
of columns just like arrays!
为了省去输入空格的麻烦,我们可以采用函数char和strvcat从多个长度不同的字符串生成一个多行字符串数组。例如,下面的代码分别利用函数char和strvcat由6个长度不同的单词生成一个6行的字符串数组legends:
>> legends=char('Wilt','Russel','Kareem','Bird','Magic','Jordan')
legends=
Wilt
Russel
Kareem
Bird
Magic
Jordan
>> legends=strvcat('Wilt','Russel','Kareem','Bird','Magic','Jordan')
legends=
Wilt
Russel
Kareem
Bird
Magic
Jordan
>> size(legends)
ans=
6 6
由上述代码可知,函数char和strvcat功能基本相同,唯一的区别在于strvcat函数忽略空字符串输入,而char函数遇到空字符串就插入一个空行,如下例所示:
>> char('one',' ','two','three')
ans=
one
two
three
>> strvcat('one',' ','two','three')
ans=
one
two
three
如果两个或多个字符串数组具有相同的行数,则可以使用 strcat 函数将它们在水平方向上连接起来。该函数在连接时首先将各行填补的空格符去掉,然后对剩余的有效字符进行连接,连接完成之后,再根据生成的字符串数组各行的需要,补充空格符。下边的例子使用strcat函数将字符串数组a和b水平连接起来:
>> a=char('apples','bananas')
a=
apples
bananas
>> b=char('oranges','grapefruit')
b=
 

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

___Y1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值