S1-2:MATLAB概述和基础
- 1 MATLAB概述
- 1.1 MATLAB的特点和优势
- 1.2 MATLAB工具箱
- 1.3 MATLAB主界面熟悉入门
- 1.3.1 MATLAB工作空间窗口
- 1.3.2 MATLAB的当前文件夹窗口
- 1.4 实用小技巧
- 2 MATLAB程序设计基础
- 2.1 MATLAB的变量
- 2.2 数组
- 2.3 字符串
- 2.3.1 字符串的创建
- 2.3.2 字符串相关的常用函数
- 2.4 结构数组
- 2.4.1 结构数组的创建
- 2.4.2 结构数组的引用
- 2.5 细胞数组
- 2.5.1 细胞数组的创建
- 2.5.2 细胞数组的引用
- 2.5.3 细胞数组的相关命令
- 2.5.4 细胞数组和数值数组的转换
- 3 MATLAB运算符、流程控制和M文件
- 3.1 MATLAB运算符
- 3.2 MATLAB程序控制结构
- 3.2.1 分支结构
- 3.2.2 循环结构
- 3.2.3 其他语句
- 3.3 M文件脚本和函数
- 3.3.1 MATLAB编程原则
- 3.3.2 M文件的类型
- 3.3.3 MATLAB中的函数
- 3.3.3 MATLAB的函数调用和参数传递
- 3.3.4 M文件的调试
MATLAB学习不经常使用的话,总是学习过就会忘记,因此在这写下以备后续使用;
MATLAB总结:MATLAB是以矩阵作为基本数据单元的程序设计语言,具有交互式的开发环境,提供了数值计算,符号计算和图形处理等等能力,应用在应用代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等领域的工具。一句话:除了不能生孩子,都可以做。
1 MATLAB概述
总共共分为六章节知识:MATLAB程序设计基础、MATLAB数值计算、MATLAB符号计算、MATLAB图形处理、图形用户界面以及工具箱的使用–总共六个教学教学知识单元。
1.1 MATLAB的特点和优势
MATLAB拥有各类函数库,能够将大量复杂的函数封装后提供给用户,使用户能够将更多精力投入到数学建模和问题解决本身上。
MATLAB的主要特点和优势:
- 编程环境界面简单友好:MATLAB主界面:下面命令行窗口、脚本(函数)编辑窗口、历史命令窗口、调试工具、路径搜索、工作空间等。图形化GUI工具。
- 编程语言简单易学:MATLAB语言属于高级语言–包含控制语句、函数、输入输出和面向对象编程特点。可以在命令行窗口中直接输入语句执行命令,也可以在M文件中编写语句后一起执行。
- 科学计算和数据处理能力强大:MATLAB具有强大的矩阵数值计算功能,可以很方便地处理举证,利用符号和函数可以对矩阵进行线性代数运算。
- 图形处理功能强大:在数字图像处理这门课可以见识到,有很强大的绘图功能,具有很多绘图函数,注意:使用MATLAB绘图时,只需要调用不同的绘图函数即可
- 丰富的工具箱和实用的程序接口:MATLAB对许多专门的领域特点开发了功能强大的工具箱:包含数据采集、数据库接口、概率统计、优化算法、神经网络、小波分析、信号处理、图像处理、控制系统数设计等等。
MATLAB程序可以自动转换为独立与MATLAB运行的C和C++代码,语序用户编写和MATLAB进行交互的C/C++程序。
** MATLAB使用流程构成:MATLAB开发环境+MATLAB语言+MATLAB算法函数库+MATLAB显示图形界面+MATLAB应用程序接口
1.2 MATLAB工具箱
在解决自己领域或者数学建模问题时,首要选择不是自己去写去实现什么功能,一定要先去找对应的工具箱下的函数算法库,去进行阅读源码并修改成适合自己的算法模块。
**工具箱主要来源分为两块:1. MATLAB随身附带的工具箱 2. Mathworks官网上面:http://www.mathworks.com/products
1.3 MATLAB主界面熟悉入门
- 主要窗口:脚本/函数 编辑窗口、命令行窗口、历史命令行窗口、文件件管理窗口、工作空间窗口。
- MATLAB还提供了强大的文件管理和在线即时帮助功能(像labview一样)。
- 在命令行下输入多条语句:1. 每输入一条语句,后面加一个分号;2. 使用 "…"续行,续行符前有空格。
- disp屏幕输出函数 # 屏幕输出字符串和变量的值
- 【常用的窗口操作命令如下:】
clear: 清楚工作空间变量
clear all: 清楚工作空间的所有变量和函数
clear 变量名:清除指定的变量
clc: 清除命令窗口下的内容但不清除工作空间变量
clf: 清除当前图形窗口的内容;
delete <文件名>:删除指定文件
help <命令>: 这个比较慢,最好使用doc 命令
which <文件名>:查找指定文件的路径
who: 显示当前工作空间中所有变量的一个简单列表
whos: 列出变量的大小、数据格式等详细信息
what:列出当前目录下的M文件和mat文件
load filename: 载入文件中的所有变量到工作空间中
save filename:保存工作空间中的变量想x,y到文件中
save filename x y:保存工作空间中的变量 x,y到文件中
pack :整理工作空间内存
size:显示当前工作空间中变量的维度
length:显示当前工作空间中变量的长度
disp: 显示当前工作空间中的变量
上箭头:调用上一行命令
下箭头:调用下一行名利
左箭头:左移一格
右箭头:右移一格
Home: 光标移到行首
End: 光标移到行尾
Esc: 清除一行
Del: 清除光标后的字符
Backspace: 清除光标前的字符
Ctrl + K : 清除光标至行尾
Ctrl + C:中断程序运行,类似像Linux下的
1.3.1 MATLAB工作空间窗口
MATLAB工作空间窗口也称为内存空间浏览器,保存了命令窗口所使用的过的全部变量,也可以通过工作空间窗口对内存变量进行操作。
工作空间中的工具条说明:
- 增加新变量 2. 打开选定的变量 3. 导入文件 4. 将变量保存为文件 5. 删除变量 6. 将便令绘制成图形。
- 用who和whos查询变量信息。
- clear 清楚变量,clc清楚命令窗口的所有内容: clear 指定变量 clear [all]清除所有变量 clc 清除命令窗口的所有内容
- size和length等命令。
1.3.2 MATLAB的当前文件夹窗口
MATLAB默认的当前文件夹路径为:C:\My Documents\MATLAB(C为MATLAB的安装盘符)
修改当前文件夹路径:1. 单击浏览按钮 2. 命令行:mkdir D:\MyMatlabFile cd D:\MyMatlabFile
MATLAB的搜素路径优先级顺序:管理和添加搜素路径从各个目录上寻找所需要的变量、文件、函数和数据。
- 对文件进行相关的管理功能:
what: 显示当前目录与MATLAB相关的文件或路径
dir: 显示当前目录下的所有文件
which: 显示某个文件/目录/变量的路径
cd path:设置path指定的目录为当前文件夹
mk dir: 创建新目录,目录的路径和和目录名由dir指定
type filename:在命令窗口下中显示文件filename的内容
cd …:返回上一级目录
cd: 显示当前文件夹
【例子】
>>which area %查询指定变量area
area is a variable
>>which exam1_7 %查询指定M文件的路径
>>what %列出当前文件夹下的M文件和mat文件
- doc 命令名:直接调出来帮助文档
- help 命令名/函数名:
- lookfor info:是对每个文件首部注释行的第一行所描述的帮助信息进行扫描
【例子】
% 在命令行窗口下输入: doc、help 、help sin和 lookfor sin命令
>>doc sin
>> help
>> help sin
>> lookfor sin
1.4 实用小技巧
- 启动目录(默认当前文件夹)修改
法一:右击图标点击属性,在弹出的属性对话框中,将起始位置修改为自定义路径
法二:实用userpath函数:userpath(“文件夹路径”)
- MATLAB环境中字体的设置: 我个人认为默认字体还是挺舒服的
P26页
2 MATLAB程序设计基础
【学习要点】
MATLAB中常量与变量、数组的创建与引用、算术运算符及关系运算符及逻辑运算符、程序结构(顺序,分支和循环结构)、MATLAB中的M文件(命令文件和函数文件)创建与调用、M文件的调试。
2.1 MATLAB的变量
变量时给内存中的值(数值、字符串、数组)指定的标识。变量用来读取数值,并且进行运算,最后再载入内存。变量是变化的,变量赋值即声明数据类型,分配存储空间。但表达式中不允许出现未定义的变量。
- 变量名命名:字符开头,后面可以跟字母、数字和下划线组合。isvarname验证变量名是否合法
- 变量的显示格式:format:默认的显示格式;format short:短格式;format short e:短格式科学形式 …
2.1.1 变量的作用域
- 局部变量
局部变量(local)在函数中定义的变量,只能被定义它的函数访问。当函数被调用时,函数内部定义的变量保存在函数自己的工作区中,一旦函数调用完毕退出运行,内存变量将不存在。
在命令文件中定义的变量,当在命令窗口中调用该命令文件时,命令存在于基本工作区中;当从函数调用该命令文件时,其变量存在于函数的工作区中。
在命令窗口中直接给出的合法的变量,其存在于基本工作区中。
局部变量只要给出合法变量名即自动建立。
- 全局变量
全局变量(Global)指几个函数共享的变量。每个使用它的函数都要用global函数声明它为全局变量。每个共享它的函数都可以改变它的值。因此,要特别关注全局变量的值。
如果函数的子函数也要使用全局变量,也必须在子函数内部使用global函数申明变量为全局变量。
- 全局变量在函数中先于其他变量定义,最好在函数的最前面定义。
- 全局变量的名字最好全部用大写字母,这样时为了增强代码的可读性,减少重复定义变量的机会。
- 永久变量:基本上用不到
- 变量的清楚:1. clear 函数 2. mlock 函数: 锁住当前正在运行的M文件和MEX文件,以后的clear函数就不能从内存中清除了。
- 变量的存取:save:存变量 load:加载取变量。详情见P32;
2.2 数组
数组我总认为是不同学科对于矩阵的称呼不同;不知道在MATLAB里面数组与矩阵的区别是什么?
数组是一种比较简单的数据组织形式,数组可以视为矩阵的一种特殊表现形式。数组运算强调元素对元素的运算;矩阵运算采用线性代数的运算方式。
在MATLAB中,数组的运算要在运算符前加上一个“.”表示一对一,不是矩阵运算
2.2.1 一维数组
- 创建
法一:直接输入生成法:将一位数组的数据放入到中括号[]中,数据中间用空格或者逗号隔开即可。
>>myArray = [1 2 3 4 5 6]
法二:冒号生成法:调用格式 初始量:步长:终止量
>>myArray = 1:1:6
法三:linspace方法:调用格式:linspace(初始量,终止量,数组元素个数)
>>myArray = linspace(1,6,6)
法四:logspace方法:调用格式:logspace(初始量,终止量,数组元素个数) **不常用**
- 引用
调用格式:arrayName(n) % 一维数组的引用
arrayName(n1:n2); % 引用一维数组的第n1至第n2个元素
arrayName([n1 n2]); % 引用一位数组中的n1和n2个元素
arrayName[n] % 引用第n个元素
2.2.2 二维数组
- 创建
法一:直接生成输入法:用中括号[],用分号表示一行的结束,或者用回车符;数据元素也可以是表达式。
法二:文件生成法:通过M文件,txt文件、excel文件和dat文件生成二维数组。MATLAB提供了一系列从文件导入数据的函数,例:load、xslread、csvread等。
- 引用
调用格式:
arrayName(m:n) % 引用二维数组的第m行第n列的元素
arrayName(m,:) % 引用二维数组的第m行的所有列元素
arrayName(;,n) % 引用二维数组的第m行的所有列元素
arrayName(:,n) %引用二维数组的第n列的所有行元素
2.3 字符串
在MATLAB中,字符创作为字符数组用单引号 ’ 引用到程序中,还可以用过字符串组成复杂的字符串。字符串数值和数字数值之间可以进行转换,同样可以执行字符串的相关操作。
2.3.1 字符串的创建
三种创建格式:
str = ‘string’
str = (‘string’)
str = [‘string1’,‘string2’,‘string3’]
2.3.2 字符串相关的常用函数
- char 将正整数数组转换成字符串数组。
调用格式:
char(A)
- int2str将数组转化为字符串数组
调用格式:
int2str(A)
【例子】已知二维数组SP = [1.1 2.2 3.3 4.4 5.5 6.6],求int2str(SP)
>>SP = [1.1 2.2 3.3 4.4 5.5 6.6]
SP =
1.1000 2.20000 3.3000 4.4000 5.5000 6.60000
>>str = int2str(SP)
str =
1 2 3 4 5 6
-
num2str将数组转化为字符串数组
调用格式:
num2str(A): % 将数组转换为字符串数组
num2str(A,k): % 将数组转化为字符串数组(最多k位有效位)
num2str(A,strFormat) % 将数组转化为strFormat格式的字符串数组
-
eval将字符串转化为数值
调用格式:
eval(s)
【例子】将字符串表达式S='a. * sqrt(t)'转化成数值。其中,a = [0 2],b = [1,4].
>> a = [0 2]; b=[1 4]
>> S = 'a .* aqrt(b)'
S=
a.*sqrt(b)
>>eval(S)
ans =
0 4
-
str2num将字符串转化为数值
调用格式:
str2num(S) % 举列子还是看doc帮就好
-
strcmp将两个字符串进行比较,相等时返回真值
2.4 结构数组
结构数组可以存放不同数据类型的数据。结构数组的内容更加丰富,包含字符串、数值、矩阵不同的数据类型。结构数组由结构组成,且每个结构中都包含多个结构域(fields),数据大小不能够直接存储在结构中,只能够存放在结构域中,结构域中可以存放任何数据类型,任意大小的数组。MATLAB使用分级存储机制来存储不同类型的数据,结构数组通过属性名来引用。
2.4.1 结构数组的创建
- 直接创建法
【例子】直接创建法创建结构数组student。其中,结构数组student有name和age两个属性和两组数据:
(Zhao,20);(Qian,22)
student(1).name = 'Zhao';
student(1).age = 20;
student(2).name = 'Qian'
qtudent(2).age = 22
student
- struct 函数创建法
struct 函数通过struct 函数可以创建结构数组
调用格式:
struct(‘field1’,{},‘field2’,{},…) % 创建一个空的结构数组,不含数据
struct(‘field1’,’{values}’,‘field2’,’{values}’,…) % 创建一个具有属性名和数据的结构数组
MATLAB对未指定的属性以空矩阵赋值,且数组中每个结构具有同样多的属性,且具有相同的属性名
【例子】
student = struct('name':{'Zhao','Qian'},'age',{20,20})
student
2.4.2 结构数组的引用
结构数组的引用通过下标和“ . ”操作符来完成。
【例子】对student结构数组的引用:student(1),student(2)和student(1).age和student(2).name
student(1)
ans =
name: 'Zhao'
age : 20
student(2)
ans =
name: 'Qian'
age = '22'
student(1).age
ans =
20
student(2).name
ans =
Qian
- 结构数组的相关命令
getfield: 获得结构数组中的数据
setfield:设置结构数组中的数据
fieldnames: 获取结构数组中的属性域名
size:获取结构数组的维度
rmfield: 删除结构数组中的结构域
【调用格式】:fieldnames(student)
- 结构数组的嵌套
在结构数组中,域值是一个已定义的结构数组,成为结构数组的嵌套。这种结构嵌套适用于说明具有层次结构的复杂数据。下面例题说明嵌套的结构数组的创建于引用。
2.5 细胞数组
细胞数组是MATLAB特有的一种数据类型。细胞数组是以单元为元素的数组,每个元素称为单元,每个单元可以包含其他类型的数据,如矩证、字符串、复数等。
在MATLAB中,只有细胞数组才可以将不同类型、不同维度的数组组合成一个大数组。
在矩阵和数组中,每个元素都应该有相同的属性,即"同质";即使是结构数组,也具有相同的属性名,每个相同属性的类型也是相同的。细胞数组没有这些要求。,可以把不同的数据类型放在一个细胞数组中。
2.5.1 细胞数组的创建
- 直接创建法
创建方法:采用数组元素的下标直接复值,所赋的值用大括号括起来;或者把细胞数组的下标用大括号括起来,所赋的值采用数组、数值或者字符串的形式。
创建细胞数组时大括号和中括号的不同使用方法
【例子】直接创建法创建细胞数组cellArray
cellArray(1,1) = {[1 2 3; 4 5 6; 7 8 9]};
cellArray(1,2) = {'Hello World'}
cellArray(2,1) = {1+2i};
cellArray(2,2) = {0:pi/10:pi}
- cell 函数创建法
通过cell 函数可以创建结构数组
【调用格式】cell(m,n) % 创建一个空的二维细胞数组,不含数据
注意:创建好的细胞数组后,可以再用赋值语句给细胞数组中的每个元素赋值
cellArray = cell(3,5) % 创建一个空的二维细胞数组
cellArray
2.5.2 细胞数组的引用
类似普通数组的引用
对于细胞数组cellArray,求cellArray(1),cellArray(2,2),cellArray{2},cellArray{2,2}
2.5.3 细胞数组的相关命令
- celldisp: 显示细胞数组的内容
- cellplot: 以图形的方式显示细胞数组的内容
【例子】上面两个命令的例子
% 先创建一个2X2的细胞数组
>>cellArray = cell(2,2)
cellArray
>>cellArray(1,1) = {[1,2,3; 4 5 6;7 8 9]};
>>cellArray(1,2) = {'Hello World'}
>>cellArray(2,1) = {1+2i}
>>cellArray(2,2) = {0:pi/10:pi}
% 显示cellArray中的细胞元素
>> celldisp(cellArray)
>>cellArray{1,1}
% cellplot命令,绘制窗口绘制下图所示
>>cellplot(cellArray)
2.5.4 细胞数组和数值数组的转换
num2cell: 将数值数组转换成细胞数组
cell2mat:将细胞数组转换成数值数组
3 MATLAB运算符、流程控制和M文件
3.1 MATLAB运算符
MATLAB中运算符分为三大类:算术运算符、关系运算符和逻辑运算符。
优先级顺序:算术运算符>关系运算符>逻辑运算符
- 算术运算符
+、-:表示算术加减法
- 、/ 表示矩阵的乘除法
\:表示左除
^:表示乘方
.*:表示点乘
.\:表示点左除
./:表示点右除
.^:表示点乘方
- 关系运算符
<:表示小于
<=:表示小于等于
:表示大于
=:表示大于等于
==:表示等于
~=:表示不等于
- 逻辑运算符
&:逻辑与
|:逻辑或
~:逻辑非
xor:逻辑异或
【MATLAB提供的非常丰富的逻辑函数】
all: 查看数组的行或者列,每行或每列的所有元素为1,结果为1。
any:查看数组的行或者列,每行或者每列只有一个元素为1,结果为1。
exist():查看变量或者函数是否存在
find: 找出非零元素的位置标识
isempty:判断矩阵是否为空矩阵
isequal:判断对象是否相等
isnumeric:判断对象是否为数值型
bitand: 按位与
bitor:按位或
bitcmp:按位反码
bitxor:按位异或
&&:捷径与
||:捷径或
3.1.1 MATLAB的基本初等函数
MATLAB中的基本初等函数是指三角函数、对数函数、指数函数和复数函数。
P55
3.2 MATLAB程序控制结构
基本上所有的语言流程控制语句:顺序结构、分支结构和循环结构。
顺序结构没有什么好说的,就是顺序着写就可以了;
3.2.1 分支结构
分支结构主要包括:if语句和switch语句
- if-then-else语句
一般形式:
if <判断语句>
语句1
else
语句2
end
【简化形式】
if <判断语句>
语句1
end
【嵌套形式】:
if <判断语句1>
语句1
elseif <判断语句2>
语句2
elseif <判断语句3>
…
end
2. switch-case语句
一般形式:
switch <判断值>
case 判断值1
语句1
case 判断值2
语句2
case 判断值3
语句3
…
otherwise
语句 n
end
3.2.2 循环结构
循环结构包含:for-end语句和while-end语句。
- for-end 语句
一般形式:
for x =初值:步长:终值
循环体
end
- while-end语句
一般形式:
while <循环判断语句>
循环体
end
【例子】
% for-end 语句
clear
sum = 0
for i = 1:1:100
sum = sum + i
end
sum
% while-end语句
clear
sum = 0 ; i = 0
while i <100
i = i+1
sum= sum+i
end
sum
3.2.3 其他语句
- break和continue语句
该两个语句用于控制循环语句的终止:
- break语句用于立即跳出含该break语句的循环语句,执行循环体的下一个语句。
- continue语句用于提前结束当前循环,进入执行下一次的循环。
% break语句
for ii = 1:5
if ii == 3
break
end
fprintf('ii =%d \n ',ii)
end
disp('End of loop')
% continue 语句
for ii =1:5
if ii ==3
continue
end
fprintf('ii = %d \n',ii)
end
disp('End of loop!')
- return 语句
在MATLAB中,任何遇到return语句,程序立即终止。
- try-catch语句
MATLAB提供了try-catch语句用于实现异常处理机制。
- 需要检测的程序必须放在try语句块中执行;
- 异常由catch语句捕获并处理。
clear
N = input('please input N=')
A = magic(3)
try
A_N = A(N,N)
catch
A_end = A(end,end)
end
laster
3.3 M文件脚本和函数
M文件编程:脚本和函数
开发任何程序都需要: 代码编写、代码调试和代码优化三个阶段。
代码编辑:在编辑调试器中编写、修改和保存
代码调试:Debug菜单下的设置断点、逐步执行等
代码优化:初学者基本不涉及;MATLAB提供M-Lint和Profiler工具来分析。
3.3.1 MATLAB编程原则
- 百分号"%"后面的内容是程序的注释信息,要经常使用注释提高可读性
- clear 命令写在主程序开头;但是避免在子程序中使用clear
- 调用函数前的参数赋值要在程序的开始部分,方便维护
- 充分利用MATLAB本身提供的函数来进行运算。
- 在语句后输入分号,使得中间结果不显示出来,提高速度
- 输入少量数据时,可以使用input命令,但是大量的数据输入,最好通过子程序完成,在主程序中调用该子程序完成。
- 尽量采用主程序调用子程序的方法,将主程序和子程序集合在一起完成主程序功能。
- 充分利用调试功能对程序进行调试。
- 设置MATLAB的工作路径和当前工作路径,方便操作和运行程序。
3.3.2 M文件的类型
M文件按期内容和功能划分命脚本文件和函数文件。
-
脚本文件
脚本文件一般用来实现一个相对独立,不需要参数传递的功能,类似于批处理文件。
脚本文件被调用:在MATLAB命令行窗口中直接输入脚本文件的文件名即可。
【待补充】最重要,实现任务的主程序,函数文件只是被用来调用实现某一个功能。
-
函数文件
函数文件用来定义一个函数(加工工厂),需要制定输入参数和输出参数。函数文件中的代码处理输入参数传递来的数据,然后将处理结果作为输出参数返回。
函数文件就是用来把实现某个功能的MATLAB代码封装成函数接口,可以直接调用
【函数调用】:需要调用函数的时候,直接输入函数文件的文件名并代入指定的实际参数即可。
MATLAB支持函数的嵌套调用和递归调用
【函数文件格式】
- 函数定义行:只出现在函数文件的第一行,通过function关键字表明此文件是一个函数文件,并指定函数名、输入和输出参数。
- H1行:帮助文字的第一行,也是函数文件的第二行。给出函数文件最关键最准确的帮助信息。当用lookfor命令查找函数时,lookfor只在H1行中搜索并且只显示该行。
- 帮助正文 更加详细说明函数文件,解释函数文件的功能,参数的含义。
- 函数体:函数文件实现功能的代码部分,通常包含调用子函数、流程控制、交互式输入输出、计算、赋值
、注释等语句。
【重要事项】
- 输入参数多余一个时,使用逗号隔开;
- 输出参数多于一个时,使用中括号;
- 函数名与所存的M文件应同名;
函数和脚本的最大区别就是:函数用function关键字来定义,而脚本不需要。
3.3.3 MATLAB中的函数
MATLAB函数以两种方式使用:一种是以内置方式存在于MATLAB核心中的函数,如sqt和sin函数等;另一种通过函数文件实现的函数,如gamma函数和用户自定义函数等。
MATLAB的函数类型分为:匿名函数、函数文件主函数、子函数、嵌套函数、私有函数和重载函数等。
- 匿名函数
匿名函数是面向命令行代码的函数,通常只有一句很简单的声明语句组成。
匿名函数的优点:不需要专门维护一个函数文件,可以接受多个输入和输出函数。只需要非常简单的语句,就可以在命令窗口或M文件中调用函数。
【调用格式:】 fhandle = @(arglist)expr
【例子】创建匿名函数myfuncHandle,输入参数为x,函数为 x^2+2*x+1
>>myfuncHandle = @(x)(x^2+2*x+1)
myfuncHandle
>>myfuncHandle(10)
- arglist是参数列表,指定函数的输入参数列表,对于多个输入参数的情况下,通常需要逗号来分割;
- expr 通常是一个简单的MATLAB变量表达式,实现函数的功能。
- 符号"@"是MATLAB中创建函数句柄的操作符,表示对由输入参数表arglist和expr确定的函数创建句柄,并把这个句柄返回给变量fhandle,这样就可以通过fhandle来调用定义好的这个函数。
- 函数文件主函数
一个函数文件只能 包含一个主函数,函数名就是文件名-保持一致。
主函数是针对其内部的嵌套函数和子函数而言的。一个函数文件除了一个主函数外,还可以编写多个嵌套函数或子函数,以便在主函数中进行调用。
- 子函数
一个函数文件只能包含一个主函数,但一个函数文件中可以包含多个函数,这些编写在主函数之后的函数都能成为子函数。
所有子函数都有自己的独立的结构,只需要在位置上处在主函数之后即可。各个子函数的前后顺序都可以任意放置,与被调用的前后顺序无关。所有子函数只能被其所在的函数文件中的主函数或其他子函数调用。
函数文件内部发生函数调用时,首先检查该函数文件中是否存在相应名称的子函数;然后检查该函数文件所在目录的字目录下是否存在同名的私有函数;然后按照MATLAB搜索路径检查是否存在同名的函数文件或内部函数。
**子函数的帮助文件可以通过help命令显示,如myfunc.m函数文件中有名为myfunc的主函数和名为mysubfunc的子函数,则可以通过help myfunc>mysubfunc命令来获取子函数的帮助信息。
- 嵌套函数
函数文件中,一个函数定义的内部可以定义一个或多个函数,这种定义在其他函数内部的函数称为嵌套函数。嵌套函数可以多层发生,即一个函数内部可以嵌套多个函数,这些嵌套函数内部也可以继续嵌套其他函数。
【一般格式】
function x = funcA(a,b)
...
function y = funcA1(c)
...
function z = funcA11(d,e)
...
end
function w = funcA12()
...
end
...
end
...
function s = funcA2()
...
fucntion t = funcA21(h)
...
end
...
end
....
end
- 外层函数可以调用向内一层直接嵌套的函数(funcA可以调用funcA1),但是不能调用更深层次的嵌套函数(funcA不能调用A11)
- 嵌套函数可以调用与自己具有相同父函数的其他同层嵌套函数(funcA11可以和funcA12互相调用)
- 嵌套函数可以调用其父函数或与父函数具有相同父函数的其他嵌套函数(funcA11可以调用funcA1和funcA2),但不能调用与其父函数具有相同父函数的其他嵌套函数内深层嵌套的函数(funcA11和funcA21)
- 私有函数
私有函数是具有限制性访问的函数,它们对应的函数文件需要保存在private文件夹下,这些私有函数在编写上和普通的函数没什么区别。只是私有函数只能被private目录下的直接父目录下的脚本文件或函数文件的主函数调用。
- 重载函数
"重载概念"是计算机编程中非常重要的概念,经常用在处理功能类似但参数类型或者参数个数不同的函数编写中。
重载函数通常是放置在不同的文件夹下。
3.3.3 MATLAB的函数调用和参数传递
MATLAB中可以在命令窗口通过命令行直接调用函数,也可以在M文件(命令文件或函数文件)中调用。
MATLAB中参数传递一般是按值传递。
- 函数调用
通过输入M文件名和相应的实际参数,就可以服从命令行或者M文件(脚本文件或函数文件)调用另外一个M文件。
用which命令可以查询MATLAB会调用哪一个函数
which sin
- 参数传递
函数空间和工作空间是独立的,在调用时生成,调用结束后回收。
返回参数多于一个使用中括号代表。
【例子】
function out = examSample(a,b) %文件名和函数名相同
fprintf('I'm Sample,before compute: a=%f,b=%f \n',a,b)
a = b+2*a
b = a*b
out = a+b
fprintf('I'm Sample,after compute: a = %f, b = %f \n',a,b)
3.3.4 M文件的调试
- MATLAB主要出错类型
- 语法错误:发生在M文件的解释执行过程中;认真读报错信息
- 逻辑错误:自己编写的程序本身就不能解决问题
- 程序调试
- 直接调试法:就是在M文件中,将某些语句后面的分号去掉,迫使M文件输出一些中间计算结果,以便发现可能的错误。
【常用做法】
在适当位置,添加显示某些关键变量值的语句,disp语句
利用echo命令,使运行在屏幕上逐行显示文件内容,echo on能显示M命令文件;echo funcname on 能显示名为funcname的函数文件。
在原命令文件或者函数文件的适当位置上,添加指令keyboard,keyboard语句可以设置程序的断点。
通过将原函数文件的函数申明注释掉,可使得函数文件变成一个所有变量都保存在工作空间中的命令文件。
- 工具调试法
MATLAB编辑器集成了代码编辑editor、Debug的集成可视化开发环境。主要利用Debug菜单下的子项来进行调试的。
【Debug菜单介绍】
Step:单步调试程序
Step In:单步调试进入子函数
Step Out:单步调试从子函数中跳出
Run: 运行的当前M文件,快捷键是F5
Go Until Cursor:运行到当前M文件到光标所在行的行为。
Set/Clear Breakpoint:在光标所在行开头设置或清除断点。
Set/Modify Conditional BreakPoint:在光标所在行开头设置或修改条件断点
Enable/Disable Breakpoint:设置当前的断点有效或者无效
Continue:程序执行到下一个断点
Stop if Errors/Warnings:出错或报警处停止运行
Exit Debug Mode:退出调试模式
- 【调试技巧】
-
当输入和输出参数不确定时,提供两对参数设置:varargin和nargin、varargout和nargout
varargin两种用法:
function y = myfunc(varargin) 使用varargin{1}来接收第一个输入参数,varargin{2}来接收第二个输入参数,依次类推。
function y = myfunc(int1,int2,varargin) 使用int1接收第一个参数,int2接收第二个参数,varargin{1}接收第三个输入参数,varargin{2}来接收第四个输入参数。
varagrout也有两种用法:
function varargout = myfunc() 使用varargout{1}来接收第一个输出参数,使用varargout{2}来接收第二个输出参数。
function [out1,out2,varargout] = myfunc()使用out1来接收第一个输出参数,out2来接收第二个输出参数,varargout来接收第三个输出参数,varargout{2}来接收第四个输出参数。依次类推。
-
字符串的相关技巧
% 1 创建字符串,下标引用
str = 'hello world'
str(5:10):'Snowy'
% 2 取子串
substr = str(5:10)
% 3 倒排字符串
reverseStr = str(end:-1:1)
% 计算字符串中字符的个数
number = size(str,2)
% 字符串中大小写转换
strUPPER = upper(str)
strLOWER = lower(str)
% 查找字符串中出现字串的位置
findstr(str,'Tin')
find(str,'Hello')