
4.1 M文件
在实际应用中,直接在命令行窗口中输入简单的命令无法满足用户的所有需求,因此MATLAB提供了另一种工作方式,即利用M文件编程。本节主要介绍这种工作方式。
M文件因其扩展名为.m而得名,它是一个标准的文本文件,可以在任何文本编辑器中进行编辑、存储、修改和读取。M文件的语法类似于一般的高级语言,是一种程序化的编程语言,但它又比一般的高级语言简单,且程序容易调试、交互性强。MATLAB在初次运行M文件时会将其代码装入内存,再次运行该文件时会直接从内存中取出代码运行,因此会大大加快程序的运行速度。
M文件有两种形式:一种是命令文件,有的书中也叫脚本文件(Script);另一种是函数文件(Function)。下面分别来了解一下两种形式。
4.1.1 命令文件
在实际应用中,如果要输入较多的命令,且需要经常重复输入,可以利用脚本文件来实现。需要运行这些命令时,只需在命令行窗口中输入脚本文件的文件名即可,系统会自动逐行地运行脚本文件中的命令。
脚本文件没有输入和输出,由一系列指令组成,可在命令窗口直接运行,产生的所有变量存储在Workspace中。
脚本文件中的语句可以直接访问MATLAB工作区(Workspace)中的所有变量,且在运行过程中所产生的变量均是全局变量。这些变量一旦生成,就一直保存在内存中,用clear命令可以将它们清除。
脚本文件可以在任何文本编辑器中进行编辑,MATLAB也提供了相应的脚本文件编辑器。可以在命令行窗口中输入“edit”,直接进入M文件编辑器;也可依次选择“主页”功能区中的“新建”→“脚本”命令,或直接单击“主页”功能区上的“新建脚本”,进入M文件编辑器。

例4-1:编写矩阵的加法文件。
解:MATLAB程序如下。
1)在命令行窗口中输入“edit”,直接进入M文件编辑器,并将其保存为“jiafa.m”。
2)在M文件编辑器中输入程序,创建简单矩阵及加法运算。

结果如图4-1所示。
3)在MATLAB命令行窗口中输入文件名,得到下面的结果。

在工作区显示变量值,如图4-2所示。

图4-1 输入程序

图4-2 工作区变量
说明 M文件中的符号“%”用来对程序进行注释,而在实际运行时并不执行,这相当于Basic语言中的“\”或C语言中的“/∗”和“∗/”。编辑完文件后,一定要将其保存在当前工作路径下。
4.1.2 函数文件
函数文件的第一行一般都以function开始,它是函数文件的标识。函数文件是为了实现某种特定功能而编写的,如MATLAB工具箱中的各种命令实际上都是函数文件,由此可见函数文件在实际应用中的作用。
函数文件的基本结构如下所述。
1)函数文件由function语句引导,其基本结构为:
function输出形参表=函数名(输入形参表)
%注释说明部分
函数体语句
2)函数调用的一般格式:
[输出实参表]=函数名(输入实参表)
注意 等号左边是方括号,右边输入参数用括号。
3)函数文件的格式说明。
①关于函数文件名:函数文件名与函数名可以相同也可以不相同,一般设为相同。当两者不同时,MATLAB忽略函数名而确认函数文件名,因此调用时使用函数文件名。
②关于注释说明部分。注释说明包括三部分内容:
♦紧随函数文件引导行之后以%开头的第一注释行。
♦第一注释行及之后连续的注释行。
♦与在线帮助文本相隔一空行的注释行。
函数文件与命令文件的主要区别在于:函数文件一般都要带有参数和返回值(有一些函数文件不带参数和返回值),而且函数文件要定义函数名;命令文件一般不需要带参数和返回值(有的命令文件也带参数和返回值),且其中的变量在执行后仍会保存在内存中,直到被clear命令清除,而函数文件的变量仅在函数的运行期间有效,一旦函数运行完毕,其所定义的一切变量都会被系统自动清除。

例4-2:分段函数。
编写一个分段函数的程序,并用它来求f(0)的值。
解:在MATLAB命令窗口中输入如下命令。
1)创建函数文件f.m。

2)求f(0)。

在编写函数文件时要养成写注释的习惯,这样可以使程序更加清晰,别人更容易看明白,同时也可以对后面的维护起到向导作用。利用help命令可以查到关于函数的一些注释信息。例如:

注意 在应用help命令时需要注意,它只能显示M文件注释语句中的第一个连续块,而与第一个连续块被空行或其他语句所隔离的注释语句将不会显示出来。lookfor命令同样可以显示一些注释信息,不过它显示的只是文件的第一行注释。因此在编写M文件时,应养成在第一行注释中尽可能多地包含函数特征信息的习惯。
在编辑函数文件时,MATLAB也允许对函数进行嵌套调用和递归调用。被调用的函数必须为已经存在的函数,这包括MATLAB的内部函数以及用户自己编写的函数。下面分别来看一下两种调用格式。
(1)函数的嵌套调用
函数的嵌套调用是指一个函数文件可以调用任意其他函数,被调用的函数还可以继续调用其他函数,这样一来可以大大降低函数的复杂性。

例4-3:编写三角函数。
解:1)在“主页”选项卡下单击“新建”按钮,在弹出的下拉菜单中选择“函数”命令,或按<Ctrl+N>快捷键,打开函数文件编辑器,并将其保存为“sanjiaohan-shu.m”。
在M文件编辑器中输入程序,创建输入数值的正弦、余弦、正切等三角函数值。

2)在MATLAB命令窗中调用函数,输入正确的变量格式与变量个数,得到下面的结果。

(2)函数的递归调用
函数的递归调用是指在调用一个函数的过程中直接或间接地调用函数本身。这种用法在解决很多实际问题时是非常有效的,但用不好的话,容易导致死循环。因此,一定要掌握跳出递归的语句,这需要读者平时多多练习并注意积累经验。
例4-4:阶乘函数。
利用函数的递归调用编写求阶乘的函数。
解:MATLAB程序如下。
1)创建函数文件factorial.m。


2)利用这个函数求10!,如下。

注意 M文件的文件名或M函数的函数名应尽量避免与MATLAB的内置函数和工具箱中的函数重名,否则可能会在程序执行中出现错误;M函数的文件名必须与函数名一致。
4.1.3 文件函数
在MATLAB中使用fopen函数打开文件或获得有关打开文件的信息,fopen命令的主要使用格式见表4-1。
表4-1 fopen命令的使用格式

在表4-2中显示表示文件类型的字符。
表4-2 文件类型

要以文本模式打开文件,则将字母t附加到permission参数,例如'rt'或'wt+'。
在MATLAB中使用fclose函数关闭文件,fclose命令的主要使用格式见表4-3。
表4-3 fclose命令的使用格式

在MATLAB中使用frewind函数重新返回文件第一行,frewind命令的主要使用格式见表4-4。
表4-4 frewind命令的使用格式

在MATLAB中使用fgetl函数读取文件中的行,并删除换行符,fgetl命令的主要使用格式见表4-5。
表4-5 fgetl命令的使用格式


例4-5:M文件的打开与关闭。
解:在MATLAB命令窗口中输入如下命令。



例4-6:CSV文件的读取。
解:在MATLAB命令窗口中输入如下命令。

在MATLAB中使用fprintf函数将数据写入文本文件,fprintf命令的主要使用格式见表4-6。
表4-6 fprintf命令的使用格式


例4-7:写入文本值。
解:在MATLAB命令窗口中输入如下命令。

提示 %4.2f指定输出中每行的第一个值为浮点数,字段宽度为四位数,包括小数点后的两位数;%8.3f指定输出中每行的第二个值为浮点数,字段宽度为八位数,包括小数点后的三位数;\n为新起一行的控制字符。
表4-7显示了要将数值和字符数据格式化为文本的转换字符。
表4-7 转换字符

读取操作如果遇到回车符后加换行符('\r\n'),则会从输入中删除回车符,写入操作在输出中的任何换行符之前插入一个回车符。

例4-8:将数据写入文本文件。
解:创建txt文件xl.txt。
输入下面的数据,如图4-3所示。

在MATLAB命令行输入如下程序。

运行后的文本文件,添加数据,结果如图4-4所示。

图4-3 TXT文件

图4-4 添加表格数据
在MATLAB中使用fread命令读取二进制文件中的数据,fread命令的主要使用格式见表4-8。
表4-8 fread命令的使用格式

在MATLAB中使用fwrite命令将数据写入二进制文件,fwrite命令的主要使用格式见表4-9。
表4-9 fwrite命令的使用格式


例4-9:创建单位矩阵文件。
解:在MATLAB命令窗口中输入如下命令。



例4-10:写入二进制文件。
解:在MATLAB命令窗口中输入如下命令。

为了使用方便,MATLAB提供了几种常用的文件设置函数。表4-10给出了这些函数名称及说明定义。
表4-10 文件设置函数及调用函数
