1、M文件
用Matlab 语言编写的程序,称为M文件,后缀名为 .M。实质上M文件也就是一个文本文件,可以使用任何编辑程序来建立和编辑,默认使用Matlab提供的文本编辑器打开进行编辑。
在进一步探讨M文件之前,我们先回顾一下我们上一篇blogMatlab基础知识中讲解使用了那些类型的文件:
- 内存变量文件 后缀名.mat
save filename [var_list] [-append][-ascii];
load filename [var_list] [-ascii];
- 用 .M 文件 生成矩阵
mydata=[1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9; 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9; 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9];
- 用.dat文件生成矩阵
2 4 6 8 6 ;3 5 6 7 3 ;2 5 1 2 5
load test.dat
也就是说我们已经用过 .M文件了,而且上一次我们存的是数据 mydata。这就要引出我们下面要说的了: M文件的分类
M文件分为两类:
- 命令文 件(Script File)
- 函数文件(Function File)
主要区别如下:
(1)命令文件没有输入参数,也不返回输出参数, 而函数文件可以带输入参数,也可返回输出参数。
(2)命令文件对MATLAB工作空间中的变量进行 操作,文件中所有命令的执行结果也完全返回到工作空间中,而函数文件中定义的变量为局部变量, 当函数文件执行完毕时,这些变量被清除。
(3)命令文件可以直接运行,在MATLAB命令窗口输入命令文件的名字,就会顺序执行命令文件中的命令,而函数文件不能直接运行,而要以函数调用的方式来调用它。
// 命令文件
clear;
R=[1,2,3;4,5,6];
M=[11,12,13;14,15,16];
RM=R+i*M
// 函数文件
function RM=fsetcomp(R,M)
RM=R+i*M;
PS:如果你理解了他们之间的区别,那么你现在应该清楚的知道我们在上一篇文章中使用的.M文件属于 命令文件。
下面就来详细讲讲函数文件
函数文件是另一种形式的M文件,每一个函 数文件都定义一个函数。 事实上,MATLAB提供的标准函数大部分 都是由函数文件定义的。基本结构如下:
function 输出形参表=函数名(输入形参表)
注释说明部分
函数体语句
说明:
以function开头的一行为引导行,表示该M 文件是一个函数文件。函数名的命名规则与变量名相同。输入形参为函数的输入参数,输出形参为函 数的输出参数。当输出形参多于一个时,则应该用方括号括起来。 函数文件名通常由函数名再加上扩展名.m组成,不过函数文件名与函数名也可以不相同。当两者不同时,MATLAB将忽略函数名而确认函数文件名,因此,调用时使用函数文件名。
注释非常极其重要,不写注释的代码我基本是不愿意看的。标准注释说明包括如下3部分内容:
- 紧随函数文件引导行之后以%开头的第一注释行。 这一行一般包括大写的函数文件名和函数功能简要 描述,供lookfor关键词查询和help在线帮助用。
- 第一注释行及之后连续的注释行。通常包括函数 输入输出参数的含义及调用格式说明等信息,构成 全部在线帮助文本
- 与在线帮助文本相隔一空行的注释行。包括函数 文件编写和修改的信息,如作者、修改日期、版本 等内容,用于软件档案管理。
// 函数调用格式
[nargout]=func(nargin)
MATLAB在函数调用上有一个与一般高级语言不同之处,就是函数所传递参数数目的可调性。 在调用函数时,MATLAB用两个永久变量nargin 和nargout分别记录调用该函数时的输入实参和输出 实参的个数。只要在函数文件中包含这两个变量, 就可以准确地知道该函数文件被调用时的输入/输出 参数个数,从而决定函数如何进行处理。
再提一个小点,如果在函数中想使用全局变量,用global var_name
2、程序控制结构
程序控制结构对学过C++,学过Java的同学来说肯定是 a piece of cake ,这里简单的说一下Matlab的程序控制结构。
- 顺序结构
// 数据输入
A=input(tips_info,option);
// 数据输出
disp(str|matrix)
//暂停
pause(secs)
- 选择结构
if condition
block1
elseif condition
block2
else
block3
end
switch 表达式
case 结果表1
语句块1
case 结果表2
语句块2
……
case 结果表n
otherwise
语句块n+1
end
switch子句后面的表达式应为一个标量 或一个字符串,case子句后面的结果不仅可以为一个标量或一个字符串,而且还可以为 一个将多个结果用大括号括起来的单元数据 (Cell)。如果case子句后面的结果为一个 单元数据,则表达式的值等于该单元数据中 的某个元素时,执行相应的语句组。
try
语句块1
catch
语句块2
end
try语句先试探性执行语句块1,如果语句块1在执行 过程中出现错误,则将错误信息赋给保留的lasterr 变量,并转去执行语句块2。
- 循环结构
for 循环变量=表达式1:表达式2:表达式3
循环体语句
end
// 例如,求1-100的和
// 特别说明malab和python切片操作是有区别的,如果你同时使用python
//和matlab,甚至还有R语言,一定要注意它们之间的细微差别
sum=0;
for m=1:100
sum=sum+m;
end
sum
划重点
//执行过程是依次将矩阵的各列元素赋给循环变 量,然后执行循环体语句,直至各列元素处理完毕
for 循环变量=矩阵表达式
循环体语句
end
while(条件)
循环体语句
End
最后提一下两个循环的老朋友,break和continue:break语句用于终止循环的执行。当在循环 体内执行到该语句时,程序将跳出循环,继 续执行循环语句的下一语句。continue语句控制跳过循环体中的某些语 句。当在循环体内执行到该语句时,程序将 跳过循环体中所有剩下的语句,继续下一次循环。
程序性能分析与优化
这是程序设计中个非常重要的一步,这就好比漂亮的车子有很多,但是钱不够一切都是然并卵;而对于程序他需要考虑的是对资源的占用、时间的消耗。一个好的程序能够在占用最少资源的情况好快速高效的完成规定业务。
在matlib中,Profiler性能评估器、tic函数和toc函数能分析程序各环节的耗时情况,分析报告能帮助用户寻 找影响程序运行速度的“瓶颈”所在,以便于进行程序优化。例如,通过函数文件性能评估器(Profiler)用户可以很 方便地了解程序执行过程中各函数及函数中的每条 语句所耗费的时间,从而有针对性地改进程序,提 高程序的运行效率。
matlab 程序优化常见思路
向量化
这是一个非常重要的编程思想,因为GPU和CPU都含有并行化指令或者称之为SIMD(single instruction multiple data)指令。向量化能够充分利用并行化从而更加快速的计算,这点在GPU和CPU上面都是成立的,GPU更加擅长SIMD计算但是CPU实际上也不差,只是没有GPU擅长而已。预分配内存空间
通过在循环之前预分配向量或数组的内存空间可以提高for循环的处理速度。减小运算强度
采用运算量更小的表达式,一般来说,乘法比乘方运算快,加法比乘法运算快,位运算比求余运算快。