第七节:函数
编程的过程很像是画图纸,编程语言在平时使用的时候不会像是单个的命令去执行,大多数情况下我们把许多重复要执行或者一些常用的编辑好的功能“封装”到一起,方便来使用。函数-----就是这种过程。函数也就是最基本的“画图纸”的方式。
7.1 函数的关键字
关键字就好像是这些筋骨的节点,起到起承转合的作用。共20个左右(可能后续会有增加),这些关键字在变量声明等地方不能重名使用,他们是唯一的。
在命令窗口输入iskeyword命令就会显示出这些关键字。关于并行技巧后面会说到。
![4c29f191f64110f768b3dd2c504d493e.png](https://img8.php1.cn/3cdc5/15d29/61b/066726c427617262.png)
7.2 MATLAB的控制流
像if,for,while等这类语句叫做控制流。MATALAB包括6中算法,其中switch-case这种类型比较特殊点儿,跟if非常类似。
六种:顺序结构、if-else-end分支结构、switch-case结构、try-catch结构、for循环结构和while循环结构。跟其他语言一样来这里列出只不过稍微比较一下和其他语言的书写结构哪里有些不同。
7.2.1 顺序结构
这部分略,就是语句时按照从上而下、从左至右的运行方式。
7.2.2 if-else-end分支结构
if后面打不打括号一样。写一个完整版本的例子
x = input('enter''x'':');
if(x>0)
y = 1;
elseif (x ==0)
y = 0;
else
y = -1;
end
disp(y)
注意每一个语句结束要用分号,这是MATALB的规定。
7.2.3 switch-case 语句
switch后面跟要进行判断的标量或者字符串,举一个完整例子如下。
num = 8;
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 = 'Please input right num!';
end
disp(data)
注意: 这里的switch语句后面要加上 otherwise这一条,如果不加判断体内判断都为0,会返回一个报错。
7.2.4 try-catch语句
try-catch语句属于找错语句,如果命令在try内错误,会执行catch内的语句。一个简单的例子:
clear;
num = 100;
try
if ischar(num)
disp('num is a string');
end
catch
disp('num is num');
end
lasterror;
% lasterr;
注意:后面一般跟一个错误提示信息
7.2.5 for循环结构
简单的例子:
for i = 1:4
for j = 1:4
if i > (5-j)
else
Mat(i,j) = i + j -1;
end
end
end
7.2.6 while 循环
简单的例子:
a(1) = 1;
a(2) = 1;
i = 2;
while a(i) <10000
a(i&#43;1) &#61; a(i) &#43; a(i-1);
i &#61; i &#43;1;
end
注意&#xff1a;while循环别忘了计数器。避免造成死循环。
7.3 控制程序流的其他常用命令和语句的嵌套。
嵌套就不用说了。
7.3.1 input和keyboard指令
输入指令&#xff0c;不多说了。
keyboard与input不同之处在于&#xff1a;keyboard指令运行输入多个MATLAB指令&#xff0c;而input指令只允许用户输入赋值给变量的“值”&#xff0c;即数组、字符串或者元胞、数组等。
yesinput指令。只能输入的指令它提供的输入值是一个默认量&#xff0c;并可以对输入范围进场检测&#xff0c;具体语法格式如下&#xff1a;
Value &#61; yesinput(&#39;Prompt&#39;, Default, Possib);
(1) 这个指令设计用户和MATLAB之间的交互&#xff0c;因此无法再notebook程序中执行。
(2) Prompt为文字提示&#xff0c;Default为默认的设置值&#xff0c;Possib为可选值。
(3) 当yesinput指令运行后&#xff0c;如果用户不输入任何值&#xff0c;则变量Value将接受默认值。
备注&#xff1a;用的最多的就是input
7.3.2 pause 指令
暂停指令&#xff0c;注意括号内的是秒
7.3.3 continue &#xff0c;break不说了
7.3.4 error和warning指令
总结如下&#xff1a;
![da40cffd4447a13f1ab68966521dc0fa.png](https://img8.php1.cn/3cdc5/15d29/61b/8d38037350ad9680.png)
7.4 脚本和函数的区分
与脚步文件不同的是&#xff0c;MATLAB中&#xff0c;函数文件Function文件类似于一个黑匣子&#xff0c;从外部无法看清其内部运算流程。其实我们每天写的叫脚本&#xff0c;而函数只不过是一种封装好的脚步运行过程看不见。
7.5 一般函数的结构
7.5.1 写完的函数要保存&#xff0c;这是句废话。另外&#xff0c;你保存的是函数的话会有一个fx的图表&#xff0c;如果保存的是脚本的话&#xff0c;有个MATALB的图像标志&#xff0c;文件名都.m文件&#xff0c;所以在很多教材中这部分叫M文件的编写
7.5.2 函数参数的指令集
在很多语言中&#xff0c;比如python分为5类&#xff0c;注入可变长度参数&#xff0c;表达式参数&#xff0c;默认参数等等。
这里有5类
分别为&#xff1a;
![28d4d85e1925be82fe0400dcb0340c9e.png](https://img8.php1.cn/3cdc5/15d29/61b/c9bd50501ffc11e6.png)
一般在函数体内
varargin{1} 表示输入的第二个参数是
如果function a &#61; abc (varargin)
if nargin &#61;&#61; 1 表示输入的参数为一个的话&#xff0c;等等一次类推
7.5.3 匿名函数、子函数、私有函数和私有目录
所谓匿名函数就是不用写函数又function有啥的&#xff0c;直接比较简单的函数实现。
子函数、私有这个不讲了
7.5.4 eval feval 和inline(内联函数)
7.6 跨空间变量传递和赋值
evalin(&#39;工作区&#39;, &#39;expression&#39;)&#xff1b;该指令的工能为跨空间计算字符串表达式的值
assignin跨空间函数的调用
![c554cf5fd62bc62ea9e75a5ed315e65a.png](https://img8.php1.cn/3cdc5/15d29/61b/555476fb0272ccc1.png)