• MATLAB使用速成 第五章(MATLAB编程基础)


    一、M文件

    1、M文件的用途

            利用MATLAB的程序控制功能,可将相关MATLAB命令编成程序存储在一个文件中(M文件),然后在命令窗口中运行该文件,MATLAB就会自动依次执行文件中的命令,直到全部命令执行完毕。

    2、M文件介绍

    (1)用MATLAB语言编写的程序称为M文件,由若干MATLAB命令组合在一起构成,可以完成某些操作,也可以实现某种算法。M文件以“.m”为扩展名,M文件的命名规则与变量相同。

    (2)根据调用方式不同,M文件可分为:

    ①Script:脚本文件/命令文件(直接输入文件名即可运行)。

    ②Function:函数文件(供其它M文件调用,通常带输入参数和输出参数)。

    (3)M文件中的百分号是注释符,其后跟着的是程序注释。(需要说明的是,format中的百分号是格式控制符而不是注释符)

    3、M文件的创建的与编辑

    (1)在当前目录新建一个M文件:

    ①菜单操作(File→New→M-File)。

    ②命令操作(edit )。

    ③命令按钮(快捷键)。

    (2)打开已有的M文件(操作范围不一定是当前目录):

    ①菜单操作(File→Open)。

    ②命令操作(edit )。(当前目录有则打开,当前目录无则创建)

    ③命令按钮(快捷键)。

    ④双击目录中的M文件。

    4、运行M文件

    (1)对于脚本文件,在命令窗口中直接输入M文件的文件名,即可依次运行M文件中的命令;对于函数文件,将会在下面作介绍。

    (2)M文件运行所产生的变量都驻留在MATLAB当前工作空间。

    (3)M文件必须在当前工作目录下才能运行。

    5、脚本文件举例

    (1)用mesh绘制半径为3的球:

    ①新建一个M文件“myprg1.m”,内容如下:

    1. u=[0:pi/60:2*pi];
    2. v=[0:pi/60:pi];
    3. [U,V]=meshgrid(u,v);
    4. R=3;
    5. X=R*sin(V).*cos(U);
    6. Y=R*sin(V).*sin(U); Z=R*cos(V);
    7. mesh(X,Y,Z);
    8. axis equal;

    ②在命令窗口输入myprg1,即可执行该M文件中的命令。

    (2)编写M文件,将华氏温度转化为摄氏温度:

    ①新建一个M文件“f2c.m”,内容如下:

    1. f=input('Please input f:'); %输入华氏温度
    2. c=5*(f-32)/9;
    3. fprintf('c=%g\n',c);

    ②在命令窗口中输入f2c,即可执行该M文件。

    二、简单的输入输出

    1、输入

            对于语句“A=input(<提示信息>)”,提示信息是用单引号括起来的字符串(如果提示信息中包含单引号,则用两个连续的单引号表示信息中的一个单引号),input命令要求用户输入一个值赋给A(可以是数或字符串)。

    2、输出

    (1)对于语句“disp(X)”,执行后将输出变量X的值,X可以是数值、矩阵或字符串。需要注意的是,disp一次只能输出一个变量,复杂的输出必须用合并的方式实现。

    (2)对于语句“fprintf(fid,format,variables)”,执行后将variables(输出变量列表,参数数量可以不定)按格式字符串format(要与输出变量一一对应)指定的数据输出格式将变量的值输出到屏幕或指定的文件fid(这里的格式控制和C语言中的printf非常相似,故仅做简要介绍);fid为文件句柄,若缺省则输出到屏幕上。

    ①格式字符串format:

    [1]fprintf命令的格式说明符:

    c

    字符型

    g

    浮点数(自动)

    d

    十进制整数

    o

    八进制

    e

    浮点数(科学计数法)

    s

    字符串

    f

    浮点数(小数形式)

    x/X

    十六进制

    [2]format中可以使用的转义字符:

    \b

    退后一格

    \t

    水平制表符

    \f

    换页

    \\

    输出一个反斜杠

    \n

    换行

    ’’

    输出一个单引号

    \r

    回车

    %%

    输出一个百分号

    ②输出变量为一维矢量时,将对矩阵的所有值重复执行fprintf命令。

    ③当输出变量为二维矩阵时,将对矩阵按列的顺序重复执行fprintf命令。

    3、图形输入

            执行[X,Y] = ginput(n)命令后,用户可在图形窗口中选取n个点,并将选中的点的位置转换为确切的x,y坐标值,每个点的x坐标存放在列向量X中,y坐标存放在列向量Y中。

    三、对M文件的操作

    1、概述

    (1)文件操作是一种重要的输入输出方式,MATLAB提供了一系列输入输出函数,专门用于文件操作。MATLAB中的输入输出函数是以C语言标准库函数中的输入输出函数为基础开发的,所以这些函数与C语言的输入输出函数相类似。

    (2)MATLAB文件操作主要有三个步骤:首先打开文件,然后对文件进行读写操作,最后要关闭文件。

    2、文件的打开与关闭

    (1)打开文件可使用命令fid=fopen(文件名,打开方式),其中文件名用字符串形式表示(可以带路径名)。

    ①常见的打开方式(针对读写权限和起始位置)有:

    'r'

    只读,文件必须存在(若不指定打开方式,则默认为只读)

    'w'

    写文件,若文件已存在则原内容将被覆盖,若文件不存在则新建一个

    'a'

    在文件末尾添加,文件若不存在则新建一个

    'r+'

    可读可写,文件必须存在

    'w+'

    可读可写,若文件已存在则原内容将被覆盖,若文件不存在则新建一个

    'a+'

    可读可写可添加,文件若不存在则新建一个

    ②文件有二进制文件(b)和文本文件(t)两种格式,在Windows下,打开文件的默认是二进制格式,如果要以文本方式打开,则必须在打开方式中加上字符't'。

    ③fid为文件句柄,其它函数可以用它对该文件进行操作(如fprintf)。如果句柄值大于0,则表示文件打开成功;若打开失败,fid的返回值为-1。

    ④有两个标准代码文件,不需打开就可以直接使用,分别为:fid=1——标准输出文件;fid=2——标准错误文件。

    (2)关闭文件可使用命令status=fclose(fid),其中fid为所要关闭的文件的句柄,status为关闭文件的返回代码,若关闭成功则为0,否则为-1。

    3、文本文件的读取与写入

    (1)文本文件的读取:

    ①tline=fgetl(fid) ——将文件句柄为fid的文件中的内容全部读入字符串tline中,舍弃文件中的换行符。

    ②tline=fgets(fid) ——将文件句柄为fid的文件中的内容全部读入字符串tline中,不舍弃文件中的换行符。

    ③[A,count]=fscanf(fid,format,size) ——将文件句柄为fid的文件中的数据按格式字符串format全部读入A中;count是返回读取数据的个数,为可选项;size为可选项,缺省则为读取整个文件(即默认取值为Inf),若给出,则取值可以是N或[m,n],为N时读取N个数据到一个列向量中,为[m,n]时读取m×n个数据到m×n矩阵中并按列存放。

    (2)文本文件的写入:

            使用命令count=fprintf(fid,format,输出变量列表)即可,这里不再赘述。

    四、自定义函数

    1、函数文件

    (1)函数文件的一般格式:

    function  <输出形参列表> = <函数名>(<形参列表>)

    % 注释说明部分(可选)

    <函数体语句>

    ①第一行为引导行,表示该M文件是函数文件。

    ②函数名的命名规则与变量名相同(必须以字母开头),另外函数文件名必须与函数名一致。

    ③当输出形参多于一个时,需要用方括号括起来。

    (2)举例:

    ①将华氏温度转化为摄氏温度的函数文件f2cf.m。(一个输入参数和一个输出参数)

    1. function c = f2cf(f)
    2. c=5*(f-32)/9;
    3. fprintf('c = %g\n',c);

    ②交换两个变量的值的函数文件myswap.m。(两个输入参数和两个输出参数)

    1. function [a,b] = myswap(x,y)
    2. a = y;
    3. b = x;

    ③打印杨辉三角形的函数文件printyh.m。(仅有一个输入参数)

    1. function printyh(n)
    2. yh = 1; disp(yh);
    3. if n==1, return; end
    4. yh = [1,1]; disp(yh);
    5. for k = 3 : n
    6. yh_old = yh; k2 = ceil(k/2);
    7. for i = 2 : k2
    8. yh(i) = yh_old(i-1) + yh_old(i);
    9. end
    10. yh(k2+1:k) = yh(k-k2:-1:1); disp(yh);
    11. end

    2、函数调用

    (1)函数调用的一般格式:<输出实参列表> = <函数名>(<输入实参列表>)

    (2)函数调用时,实参的顺序应与函数定义时形参的顺序一致(数量可以不一致);当输出实参多于一个时,需要用方括号括起来。

    (3)实参与形参之间的结合是通过值传递实现的。

    (4)函数可以嵌套调用,即一个函数可以被其它函数调用。

    (5)函数所传递的参数具有可调性(也就是数量不一定固定),MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。

    ①nargin的使用举例:

    1. % ex4nargin.m
    2. function y = ex4nargin(a,b)
    3. if (nargin==1) %只有一个输入参数
    4. y = a;
    5. elseif (nargin==2) %有两个输入参数
    6. y = a*b;
    7. end

    ②nargout的使用举例:

    1. % ex4nargout.m
    2. function [p,q] = ex4nargout(a,b)
    3. if (nargout==1) %只有一个输出参数
    4. p = a * b;
    5. elseif (nargout==2) %有两个输出参数
    6. p = a + b;
    7. q = a - b;
    8. end

    3、递归函数

    (1)函数可以被它自身调用,此时称为递归调用。

    (2)举例:计算n的阶乘的函数文件myfactor.m。

    1. function y = myfactor(n)
    2. if (n<=1)
    3. y=1;
    4. else
    5. y=n*myfactor(n-1);
    6. end

    4、局部变量与全局变量

    (1)函数文件中的变量都是局部的,即一个函数文件中定义的变量不能被另一个函数文件或其它M文件使用,当函数调用完毕后,该函数文件中定义的所有局部变量都将被释放,即全部被清除。

    (2)如果在若干个M文件中都把某个变量定义为全局变量,则这些函数将公共使用这一变量,所有函数都可以对它进行存取和修改操作。

    (3)全局变量的定义语句:global <变量名列表>

    ①变量名列表中的各个变量用空格隔开,不能用逗号。

    ②在使用全局变量的所有M文件中,都要对其所使用的全局变量进行定义。

    (4)程序示例:

    ①ex4global.m(脚本文件):

    1. global a b
    2. a = 1; b = 3;
    3. y = mysquaresum(a,b);
    4. fprintf(' a=%g, b=%g \n',a,b);
    5. z = myproduct(a,b);
    6. fprintf(' a=%g, b=%g\n',a,b);

    ②mysquaresum.m(函数文件):

    1. function square_sum = mysquaresum(x,y)
    2. square_sum = x^2 + y^2;
    3. a = x+y; %无法改变全局变量a的值

    ③myproduct.m(函数文件):

    1. function product = myproduct(x,y)
    2. global a
    3. product = x*y;
    4. a = x+y; %可以改变全局变量a的值

    5、子函数

    (1)一个函数文件中可以含有一个或多个函数,其中第一个称为主函数(主函数必须位于文件最前面,且与文件同名),其它函数称为子函数,其它M文件调用函数文件时,实际上调用的是主函数。

    (2)子函数同样由function语句引导,不同于主函数的是,子函数只能被主函数和位于同一个函数文件中的其它子函数调用。

    (3)调用一个函数时,MATLAB会首先检查该函数是否为一个子函数,子函数调用主函数这种情况是不允许发生的。

    (4)除了用global定义的全局变量外,所有函数中的变量都是局部变量,函数之间通过输入、输出参数进行数据传递。

    (5)举例:

    1. % ex4subfun.m
    2. function [avg, med] = ex4subfun(x) % 主函数
    3. n = length(x);
    4. avg = mean(x, n);
    5. med = median(x, n);
    6. function a = mean(x, n) % 子函数,计算平均值
    7. a = sum(x)/n;
    8. function m = median(x, n) % 子函数,计算中值
    9. x = sort(x);
    10. if rem(n, 2) == 1
    11. m = x((n+1)/2);
    12. else
    13. m = (x(n/2)+x(n/2+1))/2;
    14. end

    6、函数句柄

    (1)函数句柄可以理解成一个函数的代号或别名,调用函数句柄就等价于调用该函数。

    (2)函数句柄的定义格式:<句柄名> = @ <函数名>

    7、内联函数和匿名函数

    (1)内联函数:

    ①MATLAB中的内联函数借鉴了C语言中的内联函数(宏函数),使用内联函数可以减少调用的时间和空间开销。

    ②内联函数的定义格式:<函数名> = inline('<函数表达式>', '<变量1>', '<变量2>',...)

    ③内联函数的调用方式为“y=f(<数值列表>)”,调用内联函数时,代入的数值列表顺序应与定义时的变量名顺序一致。内联函数的返回值是函数表达式根据输入变量的计算结果。

    ④由于内联函数是储存于内存中而不是在M文件中,故省去了文件访问的时间,加快了程序的运行速度。

    ⑤若调用函数时涉及数组运算,则定义函数时也要用数组运算。

    (2)匿名函数:

    ①匿名函数和内联函数类似,也可以让用户编写简单的函数而不需要创建M文件,因此,匿名函数具有inline函数的所有优点,并且效率比inline函数高。

    ②匿名函数的定义格式:<函数名> = @ (<输入参数列表>)<运算表达式>

    ③匿名函数的调用方式为“y=f(<数值列表>)”,调用匿名函数时,代入的数值列表顺序应与定义时的变量名顺序一致。匿名函数的返回值是函数表达式根据输入变量的计算结果。

    ④用其它变量定义匿名函数时,如果其它变量有改变,同时希望匿名函数的定义也随之改变,那么就需要重新定义匿名函数。

    ⑤若调用函数时涉及数组运算,则定义函数时也需要使用数组运算。

  • 相关阅读:
    引入classfinal maven 插件实现对jar包的加密
    半桥LLC谐振变换器及同步整流MATLAB仿真(一)
    Socket通信之网络协议基本原理
    Jetpack Compose学习(8)——State及remeber
    第18章_主从复制
    远程连接服务器上搭建jupyter notebook
    大数据调度工具azkaban的安装,配置
    解决Qt 构建项目时报错找不到serialport模块
    MooC下载pdf转为ppt后去除水印方法
    未来世界:16项改变人类社会的新技术
  • 原文地址:https://blog.csdn.net/Zevalin/article/details/138034109