MATLAB基础编程

2021/7/3 MATLAB

# 一、变量

变量有三种变量类型:局部变量、全局变量、永久变量

# 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重载函数

重载函数是计算机编程中非常重要的概念,经常用于处理功能类似但变量属性不同的函数。