/ 写在前面 – 我热爱技术、热爱开源。我也相信开源能使技术变得更好、共享能使知识传播得更远。但是开源并不意味着某些商业机构/个人可以为了自身的利益而一味地索取,甚至直接剽窃大家曾为之辛勤付出的知识成果,所以本文未经允许,不得转载,谢谢/


顺序结构程序

程序文件的扩展名为 .m ,所以程序文件也称为M文件。

程序文件分为:

  • 脚本文件:脚本文件可以在命令行窗口直接执行的文件,也叫命令文件。
  • 函数文件:函数文件是定义一个函数,不能直接执行,而必须以函数调用的方式来调用它。

在MATLAB命令行窗口下使用 edit test 命令就可以在当前目录下创建一个test.m的文件并同MATLAB编辑器打开它。

image.png

数据的输入

A=input(提示信息,选项);

选项可以有:

  • s :允许用户输入一个字符串。

    数据的输出

    disp(输出项);

disp 函数不会显示变量的名字和空格,结构更紧凑。

程序的暂停

pause(暂停秒数);

pause 如果省略参数,MATLAB就会暂停程序,直到用户按任意键。

Ctrl + c 键可以强行终止程序。

选择结构 - if

  1. % 单分支if结构
  2. if condition
  3. statements;
  4. end
  • 当条件结果为标量时,非零表示条件成立,零表示条件不成立。
  • 当条件结果为矩阵时,如果矩阵为非空不包含零元素,则条件成立,否则不成立。

例如, [1,2;0,4] 表示条件时,条件不成立(因为其中包含0元素); [1,2;3,4] 表示条件时,条件成立。

建议,条件尽量使用标量。

  1. % 双分支if语句
  2. if condition
  3. statements1;
  4. else
  5. statements2;
  6. end
  1. % 多分支if语句
  2. if condition_1
  3. statements_1;
  4. elseif condition_2
  5. statements_2;
  6. ...
  7. elseif condition_m
  8. statements_m;
  9. else
  10. statements_n;
  11. end

选择结构 - switch

  1. switch expression
  2. case result_1
  3. statements_1;
  4. case result_2
  5. statements_2;
  6. ...
  7. case result_m
  8. statements_m;
  9. otherwise
  10. statements_n;
  11. end

image.png

注意,当任意一个分支的语句执行完后,直接就执行 switch 语句后面的语句,整个 switch 语句执行完毕。也就是说,整个过程只会执行一个语句组。

注意:

  1. switch 表达式应该是一个其值可以列举的表达式,如整形表达式、字符串表达式,实型表达式的值是不可以列举的,就不能够出现在 switch 语句中。
  2. case 结果表为 switch 表达式的取值,当取值有多个时,用单元数据表示,也就是将多个结果用打括号括起来。

image.png

num2cell 函数可以将数值矩阵转换为单元矩阵。冒号表达式产生的是一个数值向量,所以这时我们就可以用 num2cell 函数来进行转换了。

循环结构 - for

  1. for 循环变量=矩阵表达式
  2. 循环体语句
  3. end

说明, for 语句针对向量的每一个元素执行一次循环体。

  1. for k=[1,4,3,5]
  2. disp(n);
  3. end
  4. % 向量里面有4个元素,所以共循环四次。k的值分别为1435

说明,退出循环之后,循环变量的值就是向量中最后的元素值。

  1. for k=1:2:10
  2. end
  3. disp(k);
  4. % 程序最后输出9

说明,当向量为空时,循环体一次也不执行。

  1. clear;
  2. for k=1:-2:10
  3. end
  4. disp(k);
  5. % 程序最后什么也不输出

注意,循环的次数取决于矩阵表达式的列数!

  1. % 下列两个程序的输出结果一样吗?结果分别是多少?为什么?
  2. % 程序一:
  3. n=0;
  4. for k=[1,2,3,4,5]
  5. n=n+1;
  6. end
  7. n
  8. % 程序二:
  9. n=0;
  10. for k=[1;2;3;4;5]
  11. n=n+1;
  12. end
  13. n
  14. % 不一样。结果分别为51
  15. % 第一个程序中循环变量为行向量,看作每列只有1个元素的5列矩阵,5列数据依次进入循环,循环体执行5次,结果是5
  16. % 第二个程序中循环变量为列向量,只有1列,循环1次,结果是1

循环结构 - while

  1. % while循环的结构
  2. while condition
  3. statements
  4. end
  • break 语句用来跳出循环体,结束整个循环。
  • continue 语句用来结束本次循环,接着进行下一次是否执行循环的判断。

循环结构练习:寻找100以内的素数

  1. % 循环结构练习:寻找100以内的素数
  2. n=100;
  3. p=1:n;
  4. p(1)=0;
  5. for i=2:sqrt(n)
  6. for j=2*i:i:n
  7. p(j)=0;
  8. end
  9. end
  10. n=find(p~=0);
  11. disp(p(n));

函数文件的定义与调用

定义

  1. % 函数文件的基本结构
  2. function 输出形参表=函数名(输入形参表)
  3. % 注释说明部分
  4. 函数体语句

注意,当有多个形参时,形参之间用逗号分隔,组成形参表。当输出形参多于一个时,应该用方括号括起来,构成一个输出矩阵。

函数文件名与函数名也可以不相同。当函数文件名与函数名不相同时,MATLAB将忽略函数名,调用时使用函数文件名

一般建议大家函数文件名和函数名统一。

return 语句表示结束函数的执行。

调用

函数调用格式:

  1. [输出实参表]=函数名(输入实参表)

匿名函数

基本格式:

  1. 函数句柄变量=@(匿名函数输入参数)匿名函数表达式

函数句柄变量相当于这个匿名函数的别名,利用函数句柄可以间接地调用函数。 @ 是创建函数句柄的运算符, @ 后面定义了一个匿名函数,包括函数输入参数和函数表达式,如果函数有多个输入参数时,参数之间用逗号分隔。

  1. f=@(x,y)x.^2+y.^2;
  2. f(3,4)

除了可以给函数表达式定义函数句柄,我们也可以给已经存在的函数定义函数句柄,并且利用函数句柄来调用函数,这些函数包括内部函数或者是自定义函数文件,其格式如下:

  1. 函数句柄变量=@函数名

示例:

  1. h=@sin;
  2. h(pi/2)

函数的递归调用

没太多好说的,会写阶乘(Factorial)和斐波那契数列(Fibonacci)的代码就行。

函数参数与变量的作用域

函数参数的可调性

MATLAB在函数调用上有一个特点,就是函数所传递参数数目是可调的。因为这个特点,同一个函数就可以完成多种功能。

在调用函数时,MATLAB有两个预定义变量:

  • nargin :记录调用这个函数时的输入实参的个数
  • nargout :记录调用这个函数时的输出实参的个数

只要在函数文件中利用这两个变量,就可以准确地知道这个函数文件被调用时的输入、输出参数个数,从而来决定函数该如何进行处理。所以,在MATLAB中,输入实参的个数不一定要跟形参个数匹配!

  1. % 函数文件foo.m
  2. function val=foo(a,b,c)
  3. if nargin == 1
  4. val(1) = 1;
  5. val(2) = nargout;
  6. elseif nargin == 2
  7. val(1) = 2;
  8. val(2) = nargout;
  9. elseif nargin == 3
  10. val(1) = 3;
  11. val(2) = nargout;
  12. end
  13. end

局部变量

之前所用到的变量都是局部变量。

全局变量

  1. % 全局变量定义格式
  2. global GLOBAL_VAR_NAME

⚠️ 注意,在实际的程序设计中,应在所有需要调用全局变量的函数里定义全局变量。

⚠️ 注意,如果要在workspace中使用全局变量,也要在工作空间定义全局变量,这样,就可以实现数据的共享了。

❗️ 注意,如果当前函数文件或者工作空间没有定义全局变量,那么我们就无法在该文件中使用这个全局变量,就不能实现数据的共享了,而且程序还会报错,如果没有同名的局部变量的话。