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 <M文件名>)。

③命令按钮(快捷键)。

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

①菜单操作(File→Open)。

②命令操作(edit <M文件名>)。(当前目录有则打开,当前目录无则创建)

③命令按钮(快捷键)。

④双击目录中的M文件。

4、运行M文件

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

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

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

5、脚本文件举例

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

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

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

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

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

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

f=input('Please input f:');  %输入华氏温度
c=5*(f-32)/9;
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。(一个输入参数和一个输出参数)

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

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

function [a,b] = myswap(x,y)   
a = y;
b = x;

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

function printyh(n)
yh = 1;  disp(yh); 
if n==1, return; end
yh = [1,1];  disp(yh);
for k = 3 : n
	yh_old = yh;  k2 = ceil(k/2);
	for i = 2 : k2
		yh(i) = yh_old(i-1) + yh_old(i);
	end
	yh(k2+1:k) = yh(k-k2:-1:1); disp(yh);
end

2、函数调用

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

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

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

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

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

①nargin的使用举例:

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

②nargout的使用举例:

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

3、递归函数

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

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

function y = myfactor(n)
if (n<=1)
	y=1;
else
	y=n*myfactor(n-1);
end

4、局部变量与全局变量

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

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

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

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

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

(4)程序示例:

①ex4global.m(脚本文件):

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

②mysquaresum.m(函数文件):

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

③myproduct.m(函数文件):

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

5、子函数

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

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

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

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

(5)举例:

% ex4subfun.m
function [avg, med] = ex4subfun(x)  % 主函数 
n = length(x);
avg = mean(x, n);
med = median(x, n);

function a = mean(x, n)  % 子函数,计算平均值
a = sum(x)/n;

function m = median(x, n) % 子函数,计算中值
x = sort(x);
if rem(n, 2) == 1
	m = x((n+1)/2);
else
	m = (x(n/2)+x(n/2+1))/2;
end

6、函数句柄

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

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

7、内联函数和匿名函数

(1)内联函数:

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

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

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

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

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

(2)匿名函数:

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

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

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

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

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 11:58:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 11:58:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 11:58:01       82 阅读
  4. Python语言-面向对象

    2024-04-22 11:58:01       91 阅读

热门阅读

  1. SQL Server详细使用教程及常见问题解决

    2024-04-22 11:58:01       40 阅读
  2. Python学习之旅高级篇一:Web开发之旅

    2024-04-22 11:58:01       32 阅读
  3. 探究汇编中的栈帧和局部变量

    2024-04-22 11:58:01       34 阅读
  4. exp 4

    2024-04-22 11:58:01       199 阅读
  5. 教授 Avi Wigderson荣获2023年图灵奖

    2024-04-22 11:58:01       38 阅读
  6. Go 之获取变量类型

    2024-04-22 11:58:01       37 阅读
  7. 【QT教程】QT6图形渲染与OpenGL编程

    2024-04-22 11:58:01       31 阅读