/ 写在前面 – 我热爱技术、热爱开源。我也相信开源能使技术变得更好、共享能使知识传播得更远。但是开源并不意味着某些商业机构/个人可以为了自身的利益而一味地索取,甚至直接剽窃大家曾为之辛勤付出的知识成果,所以本文未经允许,不得转载,谢谢。/
顺序结构程序
程序文件的扩展名为 .m
,所以程序文件也称为M文件。
程序文件分为:
- 脚本文件:脚本文件可以在命令行窗口直接执行的文件,也叫命令文件。
- 函数文件:函数文件是定义一个函数,不能直接执行,而必须以函数调用的方式来调用它。
在MATLAB命令行窗口下使用 edit test
命令就可以在当前目录下创建一个test.m的文件并同MATLAB编辑器打开它。
数据的输入
A=input(提示信息,选项);
选项可以有:
disp
函数不会显示变量的名字和空格,结构更紧凑。
程序的暂停
pause(暂停秒数);
pause
如果省略参数,MATLAB就会暂停程序,直到用户按任意键。
选择结构 - if
% 单分支if结构
if condition
statements;
end
- 当条件结果为标量时,非零表示条件成立,零表示条件不成立。
- 当条件结果为矩阵时,如果矩阵为非空且不包含零元素,则条件成立,否则不成立。
例如, [1,2;0,4]
表示条件时,条件不成立(因为其中包含0元素); [1,2;3,4]
表示条件时,条件成立。
建议,条件尽量使用标量。
% 双分支if语句
if condition
statements1;
else
statements2;
end
% 多分支if语句
if condition_1
statements_1;
elseif condition_2
statements_2;
...
elseif condition_m
statements_m;
else
statements_n;
end
选择结构 - switch
switch expression
case result_1
statements_1;
case result_2
statements_2;
...
case result_m
statements_m;
otherwise
statements_n;
end
注意,当任意一个分支的语句执行完后,直接就执行 switch
语句后面的语句,整个 switch
语句执行完毕。也就是说,整个过程只会执行一个语句组。
注意:
switch
表达式应该是一个其值可以列举的表达式,如整形表达式、字符串表达式,实型表达式的值是不可以列举的,就不能够出现在switch
语句中。case
结果表为switch
表达式的取值,当取值有多个时,用单元数据表示,也就是将多个结果用打括号括起来。
num2cell
函数可以将数值矩阵转换为单元矩阵。冒号表达式产生的是一个数值向量,所以这时我们就可以用 num2cell
函数来进行转换了。
循环结构 - for
for 循环变量=矩阵表达式
循环体语句
end
说明, for
语句针对向量的每一个元素执行一次循环体。
for k=[1,4,3,5]
disp(n);
end
% 向量里面有4个元素,所以共循环四次。k的值分别为1、4、3、5。
说明,退出循环之后,循环变量的值就是向量中最后的元素值。
for k=1:2:10
end
disp(k);
% 程序最后输出9
说明,当向量为空时,循环体一次也不执行。
clear;
for k=1:-2:10
end
disp(k);
% 程序最后什么也不输出
注意,循环的次数取决于矩阵表达式的列数!
% 下列两个程序的输出结果一样吗?结果分别是多少?为什么?
% 程序一:
n=0;
for k=[1,2,3,4,5]
n=n+1;
end
n
% 程序二:
n=0;
for k=[1;2;3;4;5]
n=n+1;
end
n
% 不一样。结果分别为5和1。
% 第一个程序中循环变量为行向量,看作每列只有1个元素的5列矩阵,5列数据依次进入循环,循环体执行5次,结果是5。
% 第二个程序中循环变量为列向量,只有1列,循环1次,结果是1。
循环结构 - while
% while循环的结构
while condition
statements
end
break
语句用来跳出循环体,结束整个循环。continue
语句用来结束本次循环,接着进行下一次是否执行循环的判断。
循环结构练习:寻找100以内的素数
% 循环结构练习:寻找100以内的素数
n=100;
p=1:n;
p(1)=0;
for i=2:sqrt(n)
for j=2*i:i:n
p(j)=0;
end
end
n=find(p~=0);
disp(p(n));
函数文件的定义与调用
定义
% 函数文件的基本结构
function 输出形参表=函数名(输入形参表)
% 注释说明部分
函数体语句
注意,当有多个形参时,形参之间用逗号分隔,组成形参表。当输出形参多于一个时,应该用方括号括起来,构成一个输出矩阵。
函数文件名与函数名也可以不相同。当函数文件名与函数名不相同时,MATLAB将忽略函数名,调用时使用函数文件名。
一般建议大家函数文件名和函数名统一。
return
语句表示结束函数的执行。
调用
函数调用格式:
[输出实参表]=函数名(输入实参表)
匿名函数
基本格式:
函数句柄变量=@(匿名函数输入参数)匿名函数表达式
函数句柄变量相当于这个匿名函数的别名,利用函数句柄可以间接地调用函数。 @
是创建函数句柄的运算符, @
后面定义了一个匿名函数,包括函数输入参数和函数表达式,如果函数有多个输入参数时,参数之间用逗号分隔。
f=@(x,y)x.^2+y.^2;
f(3,4)
除了可以给函数表达式定义函数句柄,我们也可以给已经存在的函数定义函数句柄,并且利用函数句柄来调用函数,这些函数包括内部函数或者是自定义函数文件,其格式如下:
函数句柄变量=@函数名
示例:
h=@sin;
h(pi/2)
函数的递归调用
没太多好说的,会写阶乘(Factorial)和斐波那契数列(Fibonacci)的代码就行。
函数参数与变量的作用域
函数参数的可调性
MATLAB在函数调用上有一个特点,就是函数所传递参数数目是可调的。因为这个特点,同一个函数就可以完成多种功能。
在调用函数时,MATLAB有两个预定义变量:
nargin
:记录调用这个函数时的输入实参的个数。nargout
:记录调用这个函数时的输出实参的个数。
只要在函数文件中利用这两个变量,就可以准确地知道这个函数文件被调用时的输入、输出参数个数,从而来决定函数该如何进行处理。所以,在MATLAB中,输入实参的个数不一定要跟形参个数匹配!
% 函数文件foo.m
function val=foo(a,b,c)
if nargin == 1
val(1) = 1;
val(2) = nargout;
elseif nargin == 2
val(1) = 2;
val(2) = nargout;
elseif nargin == 3
val(1) = 3;
val(2) = nargout;
end
end
局部变量
之前所用到的变量都是局部变量。
全局变量
% 全局变量定义格式
global GLOBAL_VAR_NAME
⚠️ 注意,在实际的程序设计中,应在所有需要调用全局变量的函数里定义全局变量。
⚠️ 注意,如果要在workspace中使用全局变量,也要在工作空间定义全局变量,这样,就可以实现数据的共享了。
❗️ 注意,如果当前函数文件或者工作空间没有定义全局变量,那么我们就无法在该文件中使用这个全局变量,就不能实现数据的共享了,而且程序还会报错,如果没有同名的局部变量的话。