目录
1、M文件介绍
当需要完成的运算比较复杂,命令行窗口就 不再适用了。为了代替在命令行窗口中输MATLAB指令的语句,MATLAB平台上提供了一个文本文件编辑器,用 来创建一个M文件来写入这些指令。M文件的扩展名为.m。一个M文件包含许多连续的MATLAB指令,这些指令完成的操作可以是引用其他的M文件,也可以是引用自身文件,还可以进行循环和递归等。其创建方法如下(或者使用快捷键Ctrl+N):
运行时需将文件保存(注意保存的路径),在读取文件时,MATLAB将首先在当前工作文件夹下寻找此文件,如果它不在当前文件夹下,则在该 路径下的所有目录中搜索。运行方法如下:
其主要特点如下:
●
文件只是一串按照用户意愿排列而成的
MATLAB
指令集合。
● 脚本文件运行后,其运算过程中所产生的所有变量都自动保留在MATLAB工作区(
Base
工作区)中,除非用户关闭
MATLAB运行界面,或是使用clear
指令对工作区中的变量加以清理,否则这些变量将一直保存在基本的工作区中。基本空间随着
MATLAB
的启动而产生,只有关闭MATLAB界面时,该基本空间才会被删除(
脚本文件无须函数声明行)。
●
当调用一个脚本时,
MATLAB
会简单地执行文件中找到的命令。脚本可以运行工作区中存在的数据,或者创建新数据来运 行。
●
虽然脚本不能返回输出变量,但是所有创建的变量都将保留在工作区中,供后面的计算使用。另外,脚本能提供图形输出,就像使用图形输出函数plot()
一样。
2.函数
如果
M
文件的第一个可执行语句以
function
开始,该文件就是函数文件,每一个函数文件都定义一个函数。
函数文件区别于脚本文件之处在于脚本文件的变量为命令工作空间变量,在文件执行完成后保留在命令工作空间中;而函数文件内定义的变量为局部变量,只在函数文件内部起作用,当函数文件执行完后,这些局部变量将被清除。
function y=average(x)
%计算平均值函数
[a,b] = size(x); %判断输入量的大小
if~((a==1) | (b==1)) | ((a==1) & (b==1)) %判断输入是否为向量
error('必须输入向量')
end
y=sum(x)/length(x); %计算向量x所有元素的平均值
(
1
)函数定义行:函数定义行由关键字
function
引导,指明这是一个函数文件,并定义函数名、输入参数和输出参数。函数定义行
必须为文件的第一个可执行语句,
函数名与文件名相同,可以是MATLAB
中任何合法的字符。 函数文件可以带有多个输入参数和输出参数,如:
function [x,y,z]=f(a,b,c)
也可以没有输出参数,如:
function f(a,b,c)
(2)
H1
行:
H1
行就是帮助文本的第一行,是函数定义行下的第一个注释行,是供
lookfor
查询时使用的。一般来说,为了充分利用MATLAB
的搜索功能,在编制
M
文件时,应在
H1
行中尽可能多地包含该函数 的特征信息。由于在搜索路径上包含average
的函数很多,因此用
lookfor average
语句可能会查询到多个有关的命令。
(3)帮助文本:在函数定义行后面,连续的注释行不仅可以起到解释与提示作用,更重要的是为用户 自己的函数文件建立在线查询信息,以供help命令在线查询时使用。
(4)函数体:函数体包含了全部的用于完成计算及给输出参数赋值等工作的语句,这些语句可以是调 用函数、流程控制、交互式输入/
输出、计算、赋值、注释和空行。
(5)注释:以
%
起始到行尾结束的部分为注释部分,
MATLAB
的注释可以放置在程序的任何位置,可以单独占一行,也可以在一个语句之后。
说明:
(
1
)函数定义名应和文件保存名一致。当两者不一致时,
MATLAB
将忽视文件首行的函数定义名,而以文件保存名为准。
(2)
MATLAB
中的函数文件名必须以字母开头,可以是字母、下画线及数字的任意组合,但不可超过31
个字符。
(3)建议读者在编写
H1
行注释时,尽量采用英文表述方式,这是为了之后在使用过程中关键词检索方便。
3.匿名函数和子函数
3.1匿名函数
匿名函数没有函数名,也不是函数
M
文件,只包含一个表达式和输入
/
输出参数。用户可以通过在命令 行窗口中输入代码来创建匿名函数。匿名函数的创建方法为:
f=@(input1,inpit2,...)expression
3.2子函数
在
MATLAB
中,多个函数的代码可以同时写到一个
M
函数文件中。其中,出现的第一个函数称为主函 数,该文件中的其他函数称为子函数。保存时所用的函数文件名应当 与主函数定义名相同,外部程序只能对主函数进行调用。
子函数的书写规范有如下几条:
(
1
)每个子函数的第一行是其函数声明行。
(2)在
M
函数文件中,主函数的位置不能改变,但是多个子函数的排列顺序可以任意改变。
(3)子函数只能被处于同一
M
文件中的主函数或其他子函数调用。
(4)在
M
函数文件中,在任何指令通过
“
名称
”
对函数进行调用时,子函数的优先级仅次于
MATLAB
内 置函数。
(5)同一
M
文件的主函数、子函数的工作区都是彼此独立的。各个函数间的信息传递可以通过输入
/
输 出变量、全局变量或跨空间指令来实现。
(6)
help
、
lookfor
等帮助指令都不能显示一个
M
文件中的子函数的任何相关信息。
3.3重载函数
“
重载
”
是计算机编程中非常重要的概念,经常用于处理功能类似但变量属性不同的函数。例如实现两 个相同的计算功能,输入的变量数量相同,不同的是其中一个输入变量类型为双精度浮点数类型,另一个 输入变量类型为整型。这时,用户就可以编写两个同名函数,分别处理这两种不同的情况。当用户实际调用函数时,MATLAB
就会根据实际传递的变量类型选择执行哪一个函数。
MATLAB
的内置函数中就有许多重载函数,放置在不同的文件路径下,文件夹通常命名为
“@+
代表MATLAB数据类型的字符
”
。例如
@int16
路径下的重载函数的输入变量应为
16
位整型变量,而
@double
路径
下的重载函数的输入变量应为双精度浮点数类型。
4.eval和feval函数
4.1eval
eval(s) :
该指令的功能为使用MATLAB
的注释器求表达式的值或执行包含文本字符串
s
的语句.
4.2feval
feval
函数的具体句法形式如下:
[y1,y2,...] = feval('F',arg1,arg2,...)
该指令的功能为用变量
arg1,arg2,…
来执行
F
函数指定的计算。
说明:
(
1
)在此F
为函数名。
(2)在
eval
函数与
feval
函数通用的情况下(使用这两个函数均可以解决问题),
feval
函数的运行效率 比eval
函数高。
(3)
feval
函数主要用来构造
“
泛函
”
型
M
函数文件。
(4) feval和eval
函数运行区别之一是
feval函数的
F
只接收函数名不可以是表达式。
j= sqrt (-1);
Z =exp(j*(-pi:pi/100:pi));
eval('plot(Z)');
set (gcf, 'units', 'normalized', 'position', [0.3,0.3,0.3,0.3])
title('Results by eval');axis('square')
figure
set (gcf,'units' , 'normalized' , 'position',[0.3,0.3,0.3,0.3])
feval('plot',Z);
title('Results by feval');axis('square')
5.向量化和预分配
5.1向量化
要想让
MATLAB
最高速地工作,重要的是在
M
文件中把算法向量化。其他程序语言可以用
for
或
DO
循环,MATLAB
则可用向量或矩阵运算。
x = 0.01;
for k = 1:1001
y(k) = log10(×);
x = x + 0.01;
end
使用向量化则为:
x = 0.01:0.01:10;
y=log10(x);
5.2预分配
若一条代码不能向量化,则可以通过预分配任何输出结果已保存在其中的向量或数组以加快
for
循环。
例如,下面的代码用
zeros
函数把
for
循环产生的向量预分配,这使得
for
循环的执行速度显著加快。
r=zeros(32,1);
for n =1:32
r(n)= rank (magic (n));
end
6.函数的函数
一种以标量为变量的非线性函数称为
“
函数的函数
”
,即以函数名为自变量的函数。这类函数包括求零 点、最优化、求积分和常微分方程等。