# 一、变量
变量有三种变量类型:局部变量、全局变量、永久变量
# 1.1局部变量
局部变量存储在函数独立的工作区中,与其他函数的变量和祝工作区中的变量分开存储。
局部变量在函数调用结束后会被删除,不会保存在内存中。
# 1.2全局变量
全局变量在定义该变量的全部工作区中有效。当在一个工作区内改变该变量的值,该变量在其余工作区内也都将改变。
- 全局变量一般用大写字母来表示并在函数体开头位置进行定义
global X_Val
# 1.3永久变量
用persistent
声明,声明它的函数退出时,MATLAB也不会从内存中清除它。
persistent a;
# 1.4特殊变量
- ans: 如果未定义变量名,用于默认的计算结果存储
- pi: 圆周率
- inf/Inf: 无穷大
- eps: 浮点运算的相对精度
- realmax: 最大的正浮点数
- realmin: 最小的正浮点数
- NaN: 不定量
- i/j: 虚数单位
# 二、控制结构
# 2.1顺序结构
顺序结构是最基本的结构,可以独立使用构成一个简单的完整程序
r = 5;
S = pi * r * r;
fprintf('Area = %f\n', S);
>> Untitled
Area = 78.539816
# 2.2if-else-end结构
(1)若判决条件expression为真,执行命令组,否则跳过
if expression
command
end
(2)可供选择的执行命令有两个分支
if expression
command01
else
command02
end
(3)若可供选择的执行命令有n组,可以选择
if expression
command01
elseif
command02
elseif
command03
...
else
command
end
分支实例如下:
Rand_a = rand(1);
if Rand_a > 0.5
Rand_b = Rand_a
else
Rand_b = 1 - Rand_a
end
>> ifelse
Rand_b =
0.8147
# 2.3switch-case结构
- switch用于指定需判决的标量
- case语句和otherwise语句用于描述语句组
- switch必须与end搭配
结构:
switch value
case test1
command01
case test2
command02
...
case testk
commandk
otherwise
commands
end
- switch-case语句保证了至少有一组指令组会被执行
- switch指令之后的表达式value应该为一个标量或者一个字符,会自动进行
==
或者调用strcmp
函数 - switch指令也可以是一个元胞数组,如果检测时是一个元胞数组,MATLAB会将表达式与元胞数组中所有元素进行比较
num = 3;
switch num
case 1
data = 'Monday'
case 2
data = 'Tuesday'
case 3
data = 'Wednesday'
case 4
data = 'Thursday'
case 5
data = 'Friday'
case 6
data = 'Saturday'
case 7
data = 'Sunday'
otherwise
data = 'none'
end
# 2.4try-catch语句
只有当MATLAB执行command01
发生错误时才会执行command02
如果执行command02
也发生错误时,MATLAB将终止该结构
try
command01
catch
command02
end
# 2.5for循环结构
结构:
for x=array
commands
end
循环体被重复执行的次数是确定的,次数是由array
数组的列数来确定的。
for i = 1 : 4
for j = 1 : 4
if i > (5 - j)
Mat(i, j) = i + j - 1;
end
end
end
Mat
# 2.6while循环结构
while循环在一个逻辑条件的控制之下重复执行一组语句一个不定的次数,匹配end描述该语句
结构:
while expression
commands
end
- 与for循环最大的区别在于循环次数的不确定
i = 1;
sum = 0;
while i < 101
sum = sum + i;
i = i + 1;
end
sum
# 三、控制指令
return
调用函数中的return指令,可以强制MATLAB结束执行该函数并将控制权转出
input
将命令权暂时交给用户,用户可以通过键盘输入数值、字符串、表达式等等,并通过Enter将内容传递至工作区
Value = input('message')
keyboard
将命令权暂时交给用户,用户可以通过键盘输入数值、字符串、表达式等等,并通过输入return指令将内容传递至工作区
与input最大的区别在于keyboard可以输入任意多个MATLAB指令
yesinput
提供输入值是一个默认量,并可以对输入范围进行检查
Value = yesinput('Prompt', Defualt, Possib)
% Prompt是文字提示,Defualt是默认值,Possib是可选值
pause
控制执行文件的暂停与恢复
pause: 暂停执行文件,等待用户按任意键继续
pause(n):在继续执行文件之前暂停n秒
continue
continue
语句把控制传给下一个出现的if
或者while
循环的迭代,忽略任何循环体中保留的语句
break
使用break
指令跳出循环
error
错误指令
warning
警告指令
# 四、函数
函数类似于一个“黑箱子”,将数据传进去,经过处理后见结果输出,如:
function y = average(x)
[a, b] = size(x);
if ~((a==1) | (b==1) | ((a==1) & (b==1)))
error('输入向量')
end
y = sum(x) / length(x);
通常情况下,函数文件有以下几个基本部分组成:
(1)函数定义行
函数定义行有关键字function引导,指明这是一个函数文件,并定义函数名、输入参数和输出参数。
注意:函数定义行必须为文件的第一个可执行语句。
函数名与文件名相同,可以是MATLAB中任何合法的字符
函数文件可以带有多个输入和输出参数,如:function [x, y, z] = sphere(theta, phi, rho)
函数文件也可以没有输出参数,如:function printresults(x)
(2)H1行
H1行就是帮助文本的第一行,是函数定义行下的第一个注释行,是供lookfor查询时使用的。
(3)帮助文本
在函数定义行后面,连续的注释行不仅可以起到解释和提示作用,更重要的是为用户自己的函数文件建立在线查询信息。
(4)函数体
用于完成计算已给输出参数赋值等工作的语句
(5)注释
以%起始到结尾的部分为注释部分
# 4.1匿名函数
匿名函数没有函数名,也不是函数M文件,只包含一个表达式和输入输出参数
f = @(input1, input2, ...) expression
f为创建的函数句柄,函数句柄是一种间接访问函数的途径,使用户调用函数的过程变得简单,如:
Fxy = @(x, y) x.^y + 3*x*y
%调用方法
Fxy(2, 5)
# 4.2子函数
在MATLAB一个M函数文件可以拥有多个函数代码。
注意:出现的第一个函数是主函数,其他函数称为子函数
外部程序只能对主函数进行调用
子函数的书写规范有如下几条:
- 每个子函数的第一行是其函数声明
- M函数文件中主函数位置不能变,子函数位置排列顺序可以改变
- 子函数只能被同一M文件的主函数或其他子函数调用
- 同一M文件的主函数、子函数的工作区都是彼此独立的
function F = ex4_19(n)
A = 1; w = 2; phi = pi/2;
signal = create(A,w,phi);
F = signal.^n
%-----------subfunction-------------
function signal = createsig(A,w,phi)
x = 0 : pi/100 : pi*2;
signal = A * sin(w*x+phi)
# 4.3私有函数和私有目录
所谓私有函数就是位于私有目录private
下的M函数文件,其主要性质为:
- 私有函数的构造与普通函数完全相同
- 关于私有函数的调用:私有函数只能被
private
直接父目录下的M文件调用 - 在M文件中,任何指令通过“名称”对函数进行调用时,私有函数的优先级仅次于MATLAB内置函数和子函数
# 4.4重载函数
重载函数是计算机编程中非常重要的概念,经常用于处理功能类似但变量属性不同的函数。