一、变量
1.1 变量类型
1.1.1 局部变量
MATLAB中每个函数都有自己的局部变量;局部变量存储在该函数独立的工作区中,与其他函数的变量及主工作区中的变量分开存储。当函数调用结束后,局部变量将随之删除。
1.1.2 全局变量
全局变量在MATLAB全部工作区中有效。声明格式如下:
global x_Val
1.1.3 永久变量
永久变量可以用persistent声明,只能在M文件函数中定义和使用;改变了只允许声明它的函数存取和操作。当声明它的函数退出时,永久变量继续保存在内存中。声明格式如下:
persistent a
1.2 关键字
关键字是MATLAB中常用到的流程控制变量,共有20个,通过iskeyword命令即可查询这20个关键字。
keywords = reshape(iskeyword,[5 4])keywords = 'break' 'else' 'global' 'return' 'case' 'elseif' 'if' 'spmd' 'catch' 'end' 'otherwise' 'switch' 'classdef' 'for' 'parfor' 'try' 'continue' 'function' 'persistent' 'while'
二、程序控制
2.1 分支结构
MATLAB中可用的分支结构有三种,分别为if-else-end结构、switch-case结构和try-catch结构。
2.1.1 if-else-end分支结构 形式1
t = 1:5if 1 t1 = 6-tend
2.1.2 if-else-end分支结构 形式2
t = 1:5if 0 t1 = 6-telse 1 t1 = t - 2end
2.1.3 if-else-end分支结构 形式3
t = 1:5if 0 t1 = 6-telseif 0 t1 = t - 2else t1 = tend
2.1.4 switch-case 结构
说明:
•switch-case结构至少有一组命令组将被执行•switch后的表达式value为一个变量或字符串,为变量时,比较形式为:表达式==检测值i;当表达式为字符串时,MATLAB将调用strcmp来进行比较•case后的检测值可以是标量值,字符串,元胞数组。若检测值是一个元胞数组,则MATLAB将会把表达式的值与元胞数组中的所有元素进行比较;若元胞数组中有某个元素与表达式的值相等,则为真
num = 3;switch num case 1 data = '差' case 2 data = '次' case 3 data = '中' case 4 data = '良' case 5 data = '优' otherwise data = '请确认输入'end
2.1.5 try-catch 结构
说明:
•try-catch结构只提供两个可供选择的命令组•当执行中发生错误时,可调用lasterr函数查询出错的原因。若函数lasterr的运行结构为空字符串,则表示命令组commands1被成功执行•若catch结构中发生错误,则matlab会终止该结构
n = 16;mat = magic(3) % 生成3阶魔法矩阵try mat_num = mat(n) % 取mat的第n个元素catch mat_end = mat(end) % 若mat没有第n个元素,则取mat的最后一个元素 reason = lasterr % 显示出错原因end% 程序输出mat_end = 2reason =索引超出矩阵维度。
2.2 循环结构
2.2.1 for循环结构
for循环重复执行一组语句的一个预先给定的次数。
for i = 1:4 for j = 1:4 if i >=j mat(i,j)=i^2; % 分号抑制输出 else mat(i,j)=j^2; % 分号抑制输出 end endendmat
结果如下:
mat = 1 4 9 16 4 4 9 16 9 9 9 16 16 16 16 16
求解1+3+···+1001的和
sum = 0;for i = 1:2:1001 sum = sum + i;endsum
结果如下:
sum = 251001
2.2.2 while循环结构
sum = 0;i = 0;while i <= 100 sum = sum + i; i = i + 2;endsum
结果如下:
sum = 2550
2.3 其他常用控制命令
2.3.1 input和keyboard命令
用户可以使用input命令通过键盘输入数值、字符串或表达式等。调用格式如下:
>> val = input('输入:')输入:2val = 2val = input('输入:','s') % 将用户输入以字符串的形式赋值给变量val
请求键盘输入命令keyboard如被放置在M文件中,将停止文件的继续执行,并将控制权交给键盘。提示符前会显示K来表征这种特殊状态。在M文件中使用该命令,对程序的调试及在程序运行中修改变量都很方便。在Matlab 2016中,可以输入命令dbcont命令退出该模式。
三、函数
3.1 M文件函数
M文件函数是可以定义输入参数或返回输出变量的M文件。M文件的名称和函数的名称必须一致。
控制命令 | 说明 |
nargin | 表示调用函数所带参数个数的变量 |
nargout | 表示调用函数所返回参数个数的变量 |
inputname(x) | 返回输入表上数字x所在位置的输入参数变量的名字,若为表达式则返回一个空字符串 |
nargchk | 功能为控制函数的输入参数的个数 |
varargin | 表示函数可带有任意多个输入参数 |
varargout | 表示函数可带有任意多个输出参数 |
以add_test.m为例,以下为文件内容:
function result = add_test(x,y)result = x + y;end
调用示例:
>> val = add_test(7,8)val = 15
说明:
•函数定义名应和文件保存名一致,当两者不一致时,matlab以文件名为准•函数文件名必须以字母开头,可以是字母、下划线和数组的任意组合
3.2 匿名函数
匿名函数没有函数名,也不是函数m文件,只有表达式和输入、输出参数。可以在命令行中输入代码,创建匿名函数。创建方法为:
f = @(input1,input2,...) expression
其中,f为创建的函数句柄;input1、input2为输入变量;expression为函数的主体表达式。若匿名函数没有输入参数,则在调用函数时,需要用空格来替换input,否则无法执行程序。
匿名函数示例:
>> sqr = @(x) x.^2; %创建匿名函数句柄>> t = sqr([2.5 3])t = 6.2500 9.0000
3.3 子函数
子函数也称为局部函数,是指在matlab中,多个函数的代码可以写到一个M函数文件中时出现的一种函数。
M函数文件出现的第一个函数称为主函数,其他函数称为子函数。保存时所用的函数文件名应当与主函数名相同,而且外部程序只能调用主函数。
说明:
•每个子函数的第一行是其函数声明行•主函数的位置不能改变,多个子函数的顺序可以改变•子函数只能被处于同一M文件中的主函数或其他子函数调用•在M函数文件中,任何命令通过名称对函数进行调用时,子函数优先级仅次于matlab内置函数•同一M文件的主函数、子函数的工作区都是彼此独立的。各个函数间的信息传递,可以通过输入输出变量、全局变量或跨空间命令来实现
子函数示例:创建sub_function.m文件
function [avg, med] = sub_function(x)n = length(x);avg = mymean(x,n);med = mymedian(x,n);endfunction a = mymean(v,n)% 求平均子函数a = sum(v)/n;endfunction m = mymedian(v,n)% 求中位数子程序w = sort(v);if rem(n,2) == 1 m = w((n+1)/2);else m = (w(n/2) + w(n/2 +1)) /2;endend
在命令行窗口输入:
>> x = [1 3 5 9 11];>> [mean,median] = sub_function(x)mean = 5.8000median = 5
3.4 私有函数
私有函数是指位于私有目录private上的M函数文件,它的主要性质如下:
•私有函数的构造与普通M函数完全相同•私有函数只能被private直接父目录内的M文件所调用•M文件中任何命令调用函数时,私有函数优先级仅次于matlab内置函数和子函数
3.5 内联函数
内联函数的属性与编写方式和普通函数文件不同。其调用形式如下:
inline(expr)inline(expr,arg1,arg2,...)inline(expr,n)
inline命令的功能为字符串表达式expr转化为输入变量自动生成的内联函数;arg1,arg2,...为指定的输入变量,n为指定输入变量个数。
命令 | 功能 |
class(inline_fun) | 提供内联函数的类型 |
char(inline_fun) | 提供内联函数的计算方式 |
argnames(inline_fun) | 提供内联函数的输入变量 |
vectorize(inline_fun) | 使内联函数适用于数组运算的规则 |
内联函数示例,在命令行窗口输入:
>> f = inline('3 *x.^2'),ans1 = argnames(f),ans2 = formula(f),ans3 = char(f),ans4 = class(f),ns5 = f([1 2 3 4 5])f = 内联函数: f(x) = 3 *x.^2ans1 = 'x'ans2 = 3 *x.^2ans3 = 3 *x.^2ans4 = inlinens5 = 3 12 27 48 75
3.6 eval、feval函数
eval、feval函数可用于将文本与函数联系起来。
3.6.1 eval函数
eval函数用于翻译并执行文本字符串并返回结果,调用形式如下:
eval(expression)[output1, ..., outputN] = eval(expression)
eval函数示例,在命令行窗口输入:
>> x = 3, str='magic(x)', magic3 = eval(str)x = 3str = magic(x)magic3 = 8 1 6 3 5 7 4 9 2
3.6.2 feval函数
feval函数可以将函数句柄文本与函数连接,提供函数计算输入并返回求解结果。其调用形式如下:
[y1,y2,y3] = feval(fhandle,x1,...,xn)[y1,y2,y3] = feval(fname,x1,...,xn)
feval函数示例,在命令行窗口输入:
>> x = 3, str = @magic , magic3 = feval(str,3)x = 3str = @magicmagic3 = 8 1 6 3 5 7 4 9 2
3.7 函数的函数
函数的函数是指以函数名为自变量的函数。这类函数的用户包括:求零点、最优化、求积分和常微分方程等。示例,在命令行窗口输入:
>> f = @(x,c) x(1).^2 + c.*x(2).^2; % 匿名函数>> c = 1.5;>> X = fminsearch(@(x) f(x,c), [0.3;1]) % 使用函数的函数求最小值X = 1.0e-04 * -0.2447 0.3159
3.8 内嵌函数
内嵌函数是指完全包含在父函数中的函数。任何函数都可以包含内嵌函数。示例文件:
% embedding_fun.mfunction embedding_fundisp('这是父函数')nestedfxfunction nestedfxdisp('这是内嵌函数')endend
在命令行中测试:
>> embedding_fun这是父函数这是内嵌函数