matlab程序设计的一些问题

function pareto = moead( mop, varargin) 函数式m文件必须包括function这个词,其后就是这个函数最常用的方式调用的语法。在第一行声明的输入和输出变量是这个函数的局部变量。输入变量包含传递给这个函数的数据,输出变量包含传递给这个函数的数据,输出变量包含从这个函数输出的变量。通过输入变量将数据输出来是不行的。

%MOEAD runs moea/d algorithms for the given mop.

%   Detailed explanation goes here

%   The mop must to be minimizing.

%   The parameters of the algorithms can be set through varargin. including

%   popsize: The subproblem's size.

%   niche: the neighboursize, must less then the popsize.

%   iteration: the total iteration of the moead algorithms before finish.

%   method: the decomposition method, the value can be 'ws' or 'ts'.

在函数声明行之后的第一个连续的注释行的集合是这个函数的帮助文本。第一个注释行被称作H1行,这一行也是lookfor命令搜索的行。H1行通常包括大写的函数名以及这个函数功能的一个简要描述。在第一行之后的注释行描述了可能的调用语法所使用的算法,而且可能会有简单的实例。在一个函数的帮助文本中出现的函数名通常都是大写的,这样做的目的就是让函数在视觉上突出,而函数调用的时候都是用小写字母。

在第一个连续注释行集合之后的所有语句构成了函数体。一个函数的函数体包含了对输入参数进行运算并且将运算结果取值给输出参数的matlab语句

一个函数m文件在这个文件的最后一行被执行完毕或者在任何地方遇到return语句的时候就终止

一个函数可以通过调用函数error来异常终止操作指令运行并控制权返还给命令窗口

通过调用函数warning,一个函数可以发出一条警报信息然后继续执行。这个函数对于报告意外的或者是其他一些异常行为来说是非常有用的。

函数式m文件可以包含对脚本文件的调用。当遇到一个脚本文件时,这个脚本文件就在这个函数的工作区执行,而不是在matlab的工作区间执行。

在一个函数式m文件中可以出现多个函数。这些函数被称作子函数或者局部函数,子函数以一个标准的函数声明语句开始,并且遵循所有的函数创建规则

子函数可以被这个m文件中的子函数调用,也可以被这个m文件中的其他函数调用。同所有的函数一样,子函数也有自己独立的工作区间。

除了子函数之外,m文件还可以调用私有的m文件,这种私有的m是驻留在标识为private的调用函数的子目录下的标准m文件。只有在私有m文件的父目录下的函数才能访问这些私有m文件。

调用medit窗口,在里面输入如下内容。

Function f=factn                    %函数的定义行

%compute a factorial value.                %H1

%FACT(N) return the factorial of N,          %帮助文本

%usually demoted by N

%put simply,FACT(N) is PROD(1:N)             %注释

f=prod1n                             %函数体   

m文件的组成部分及其功能

函数定义行(仅限于函数式m文件)  定义函数名,以及输出和输入变量的数目和顺序

H1   对程序进行概括性的描述,使用helplookfor命令都可以调出此行

帮助文本  这是比H1行更详细的帮助信息,使用help 命令时与H1行一起显示

函数体  m文件的主要组成部分,程序的计算和设计都在此实现

注释     解释程序行的意义

 

【脚本式m文件】

由于脚本式文件的运行相当于在命令窗口中顺次输入运行命令,在编制这类文件时,只需将所要执行的语句逐行编辑到指定的文件中,且变量不需要预先定义,在命令中的变量都是全局变量,任何其他的命令文件和函数都可以访问这些变量,也不存在问文件名对应的问题

运行m文件,一定要保证所调用的m文件在当前的路径下。

查找路径which 文件名

如果所用文件名不在当前路径下,可以使用addpath来设置路径

%这是一个关于脚本式m文件的例子

%主要用于介绍脚本式m文件的生成

%该函数用于顺此求出从sin1)到sin10)的值

for I=1:10

     a=sin(i);

fprintf{‘sin(%d)=’,i}

  fprintf(‘%12.8f/n’,a)

end

【函数式m文件】

函数式m文件比脚本文件要复杂,函数式m文件要自带参数,并且又返回结果,这样把整个程序连为一段。也有一些函数式文件不带参数,这时,文件中一般使用一些全局变量来实现与外界和其它函数之间的数据交换。

函数式m文件的第一行都是以function开始,说明此文件是一个函数。其实质就是用户往matlab函数库中添加的子函数。函数式m文件中的变量都不是全局变量尽在函数运行期间有效,函数运行完毕后,他所定义的变量将从工作区间中消除

%该函数用于判断某一年是否为闰年

%使用格式为isleapyeary),其中y使用户所要计算的年份

Function isleapyearyear

Sign=0

If rem(year,4)=0

Sign=sign+1;

End

If rem(year,100)=0

  Sign=sign+1;

End

If rem(year,400)=0

Sign=sign+1;

End

If sign=1

Fprintf(‘%4d year is a leap year./n’,year)

Else

   Fprintf(‘%4d year is not a leap year./n’,year)

end

在函数式m文件中,变量的值是以局部变量的形式存储在文件中的,这与脚本式m文件截然不同。

%该程序用于检验函数式m文件中变量的存储方式

%即检验它的变量是否为全局变量或是局部变量

Function y=hanshu(a)

X1=a*3

X2=3/a

X3=3+a

X4=3-a

将函数命名为hanshu.m,并在命令窗口中给出x1,x2,x3x4赋值如下

X1=0.1

X2=0.2

X3=0.3

X4=0.4

此时,赋值已经完成,给定一个a值,运行程序如下。

a=2;

hanshu(a)

x1=6

x2=1.5

````````````````````````````````````````````````````````````````````````````````````````````````````````

使用脚本式m文件时,在m文件中改变的值将带到工作区间来,用户在使用时,一定要注意这两种不同文件在这一上的区别

【【程序控制】】

【顺序结构】

用户依次输入命令语句即可

4种高级的控制结构

If –else-end结构

Switch-case-otherwise-end结构

For循环

While循环

【选择语句】

If –else-end结构

1.       只有一种选的情况

If 表达式

      执行语句

End

 

%该函数用于演示If –else-end语句的第一种用法

Function f=ifone(x)

If x>0

   Fprintf(‘%f is a positive number/n’,x)

End

当参数x为正数时,系统将执行语句Fprintf(‘%f is a positive number/n’,x)

 

2.        有两种选择时的情况

If 表达式

  执行语句1

Else

   执行语句2

End

3   有三种或三种以上选择时的情况

If  表达式1

  表达式1为真时执行语句1

Elseif 表达式2

表达式为2为真时的执行语句2

Elseif  表达式3

表达式3为真时的执行语句3

············································

Else 

所有表达式为假时的执行语句

End

%该函数用于演示if-else-end语句的第三种用法

Function f=ifthree(x)

If x>100

      ````````````````

Elseif

`````````````````````````````

Elseif

````````````````````````````

else

`````````````````````````````

End

 

【分支语句】

Switch-case-otherwise-end

 

Switch 开关语句

Case 条件语句

   执行语句,······,执行语句

Case{条件语句1,条件语句2,条件语句3,·····}

       执行语句,······,执行语句

  ········

   Otherwise

      执行语句,····,执行语句

End

 

 

【模块】*****

Try-catch模块给用户提供了一种错误不活机制。

Try

执行语句1

Catch

执行语句2

End

catch模块中,函数lasterr包含了在try模块中遇到的错误生成的字符串。这样,catch模块中的执行语句2就可以获取这个错误字符串,然后采取相应动作

Try-catch模块也可以嵌套使用,即在一个try-catch模块的执行语句1和执行语句2中都可以嵌入了try-catch模块

for循环语句】

循环判断条件通常就是对循环次数的判断,也就是说,循环语句的循环次数是预先设定好的。它的格式如下:

For i=表达式

执行语句,···,执行语句

End

 

For i=1:1:10

   Xi=i^2

End

 

For循环的另一个特点是嵌套使用,他可以多次嵌套for循环或是和其他的结构形式嵌套使用,这样用户就可以利用它实现更为复杂的功能

For i=1:5

Forj=1:5

a(i,j)=1/(i+j-1)

end

end

while循环语句】

for循环不同,while循环的判断控制可以是逻辑判断语句,因此,它的循环次数可以是一个不定数,这样就赋予了他比for循环更广泛的用途。

While 表达式

执行语句

End

 

while循环时一定要在执行语句中设置使表达式的值为false的情况

【人机交互命令】

提前终止循环,跳出子程序以及显示m文件的执行过程等操作。从而使得用户在程序设计时能够与计算机进行即时的交互,使得程序设计变得更为得心应手,所设计的程序也能变得更加合理。

1、  终止命令breakreturn   break语句一般用在循环控制中,如for循环和while循环,一般通过if语句来使用break语句,当if语句满足一定条件时,break语句将被调用,系统将在循环尚未结束时跳出当前循环。在多层嵌套循环中,break只能跳出包含它的最内层循环。

当用户要求再循环语句以外进行终止操作时,可以使用return命令,执行return命令后。进程将返回调用函数或是键盘,同时,使用return命令可以终止keyboard模式。通常,程序在end处结束,而return命令可以提前结束命令

2、  继续命令continue

【变量和函数的种类】

Matlab的输入和输出规则

函数式m文件可以没有输入和输出变量

Nargin  nargout

在一次调用中所用到的输入和输出变量个数可以通过分别调用函数nargin nargout来确定。因为narginnargout是函数不是变量

当一个函数被调用时,输入变量并没有复制到函数的工作空间中,但是他们的值在这个函数中是可读的。应当注意的是,如果输入变量的任何值被改变了。这个输入变量组就被复制到了函数的工作区。这样,为了节省内存和提高速度,最好是将元素从大的数组中提出来,然后再修改它们,而不是迫使整个数组都被复制到这个函数的工作区中,另外,对输入变量和输出变量使用相同的变量名将会使matlab将输入变量的值复制到函数的工作区中。

如果一个函数声明了一个或多个输出变量,但是用户在使用的时候又不想要输出参数,则只要不把输出变量赋值给任何变量就可以了

Nargin函数的初级用法

Function d=nargintest(a,b,c)

If nargin<=1

   Error(‘not enough input arguments.’)

Elseif nargin=2

D=a+b;

Elseif nargin=3

D=a+b-c;

end

使用nargin可查找函数输入变量的个数

【全局变量】

matlab中,函数内部定义的变量都是局部变量,它们不被夹在到工作区中。有时,用户需要使用全局变量,这是要用global函数来进行定义,而且在任何使用该全局变量的函数中都应加以定义,即使在命令窗口也不例外

【永久变量】

除了通过全局这些变量变量共享数据外,函数式m文件还可以通过申明一个变量persistent来对函数中重复使用和递归调用的变量的访问进行限制,使用格式形如persistentx y z

永久变量的范围被限制在声明的函数内部,不允许在其他的函数中对它们进行改变。只要m文件在matlab内存中,永久变量就存在

【主函数】

M文件中的第一个函数就叫做主函数,主函数之后可以使任意数量的子函数,它们可以做为主程序的子程序。一般来说,在命令窗口或是其他的m文件只能调用主函数,调用的时候就是是直接调用其函数名

【匿名函数】

匿名函数提供了一种创建简单程序的方法,使用它用户可以不必每次都编写m文件,用户可以再matlab的命令窗口或其他任意m文件和脚本文件中使用匿名函数。

格式

Fhandle=@(arglist) expr

Fhandle为该函数创建的函数句柄,有关函数句柄的内容将在下面的章节予以说明。@s符号用于在matlab中创建函数句柄;arglist是一些有逗号分隔的输入参数,这些参数将被传输到函数;而expr是函数的主体,有执行语句组成

【子函数】

【匿名函数】

【局部函数】

【函数句柄】

函数句柄提供了一种间接访问函数的手段,用户可以很方便地调用其它函数;提供函数调用过程中的可靠性;减少程序设计中的冗余;同时还可以在使用函数的过程中保存函数相关的信息,尤其是关于函数执行的信息。

1.       函数句柄的创建

fhandle=@functionname,其中fhandle为所创建的函数句柄,functionname为所创建的函数

给匿名函数创建函数句柄如前边所述,sqr=@xx.^2创建了函数句柄

当需要创建函数句柄时,可以使用单元数组,

trigfun={@sin, @cos, @tan};

plot(trigfun{2}(-pi:0.01:pi))

在给出不在当前路径下的函数创建函数句柄时,将产生无效的函数句柄

函数句柄的调用

本例调用一个函数plotfhandle,传递一个matlab内置的sin函数给该函数,然后,由plotfhandle调用plot函数,将数据和sin的函数句柄传递给它。plot函数调用与该句柄相关的函数来绘制曲线。

function x=plotfhandlefhandle,data

plot(data,fhandle(data))

在命令窗口中调用程序如下

plotfhandle@sin,-pi:0.01:pi

函数句柄的操作

functions   返回函数句柄的相关信息

func2str    根据函数句柄创建一个函数名的字符串

str2func    由一个函数名的字符串创建一个函数句柄

save        从当前工作区间向m文件保存函数句柄

load       从一个m文件中向当前工作区间调用函数句柄

isa        判断一个变量是否包含由一个函数句柄

isequal      判断2个函数句柄是否为某一相同函数的句柄

函数句柄:是包含了函数的路径、函数名、类型以及可能存在的重载方法。
函数句柄必须通过专门的定义创建的,而一般的图像的句柄是自动建立的。

创建函数句柄使用@或者str2func命令创建
[email=h_fun=@fun]h_fun=@fun[/email];
h_fun=str2func('fun');
比如说sin函数,[email=h_sin=@sin]h_sin=@sin[/email];   h_sin=str2func('sin');

执行sin函数
     feval
feval('sin',pi/2)  feval
就是把已知的数据或符号带入到一个定义好的函数句柄中

ans =
     1
那么使用函数句柄有什么好处呢?
1
、提高运行速度。因为matlab对函数的调用每次都是要搜索所有的路径,从set path中我们可以看到,路径是非常的多的,所以如果一个函数在你的程序中需要经常用到的话,使用函数句柄,对你的速度会有提高的。
2
、使用可以与变量一样方便。比如说,我再这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝过来。因为你创建的function handles中,已经包含了路径,比如说我创建了一个fun
h_fun=str2func('rei');
可以用functions来查看这个function结果果然已经包括了路径。


functions(h_fun)
ans =
    function: 'rei'
        type: 'simple'
        file: 'G:/program/serial232/rei.m'

 

【辅助函数】

执行函数

eval  字符串调用函数

 

feval  字符串调用m文件

 

run    运行脚本文件

eval函数

容错函数

程序设计的好坏在很大程度上取决于其容错能力的大小。

error

warning

lastwarn

errortrap on/off

【时间运算函数】

clock  以向量的形式显示当前的时间和日期

date    以字符型显示当前的日期

now    以数值型显示当前的时间和日期

calendar  显示当月的日历表

weekday  显示当前日期对应的星期表达

comday

datetick 

datevec

datestr

datenum

tic    计时的开始函数

toc     计时的结束函数

cputime

etime

¥¥**【程序的调用和优化】

两类错误:语法错误  运行错误

【文件和数据的导入和导出】

matlab使用多种文件格式打开和保存数据,有的文件格式是为matlab定制的,有的是业界标准的文件格式,好友一些为其他应用程序定制的文件格式,用来保存和打开数据文件包括GUI以及命令窗口命令

matlab把当前目录作为数据文件和m文件的默认目录。目录管理工具和改变当前目录都是通过GUI和命令窗口函数来实现的

save

这条命令将matlab工作区中所有变量以matlab二进制的格式存储在当前目录下的matlab.mat文件中

save也可以用来保存特定的变量

save var1 var2

这条命令将var1var2保存在名为matlab.mat的文件中

利用命令-函数的两重性,上边这种命令形式还可以写成函数形式

save(‘filename’,‘var1,‘var2e

fname=myfile

savefname,‘var1,‘var2

指定的变量是被保存在一个名为myfile.mat的文件中

文件的打开

load

load filename var1var2

load(‘filename’,‘var1,‘var2

filename.mat被打开,变量var1var2被载入到工作区

 

for i=1:N

   fname=sprintf('mydata%d',i);

   load(fname)

end

这段代码用sprintf 来在一个for循环中来生成文件名字符串,这样的一组数据文件都可以载入到工作区中。

当用户不想将工作区中的变量覆盖时候,命令load可以写成函数的形式并且返回一个输出参数。例如

vnew=load'filename','var1','var2';

这条命令打开filename.mat并且将变量var1var2载入到一个名为vnew的结构变量中,这个结构变量有两个域,一个是var1,一个是var2.也就是说,vnew.var1=var1,vnew.var2=var2

load命令还可以打开ascii文本文件。特别是当数据文件是有matlab的注释行和一行一行用空格隔开的值组成的时候,例如

load filename.ext

打开文件filename.ext,然后将数据载入到一个名为filename的双精度数据组织中。更详细的信息可以参见matlab中关于load命令的帮助系统

为了查到一个数据文件是否存在,以及它包含哪些变量,就是使用matlab命令existwhos

例如,

exist(‘matlab.mat,'file'

如果文件不存在,就返回0,如果存在就返回2

delete filename.ext

【数据的导入和导出】

dlmread  ascii码中的数据输入矩阵

dlmwrite  把矩阵写入ascii文件

textread   把文件读入格式化的文本

wklread   从电子表格文件读入

wklwrite   写入电子表格文件

xlsread    从电子表格读入

aviread  从电影文件读入

imread  从图形文件读入

imwrite  写入图形文件

auread   sun声音文件读入

auwrite  写入sun声音文件

wavread   microsoft声音文件读入

wavwrite   写入microsoft声音文件

hdf   matlab-hdf网关函数

关于文件格式的详细信息用户可以参见fileformats的帮助信息

【低级文件I/O】低级文件i/o函数来读取或写入任何可能的二进制或格式化的ascii文件

fopen  打开文件

fclose  关闭文件

fread   读取一个二进制文件的全部或部分

fwrite   将数组写入二进制文件

fscanf  从文件中读取格式化数据

fprintf  将格式化数据写入文件

fgetl  从文件中读取行,并删除换行符

fgets   从文件中读取行,并保留换行符

sprintf 将格式化数据写入字符串

sscanf  在格式控制下读取字符串

ferror   获取文件i/o状态的信息

feof   检测是否到了文件的结尾

fseek   设置文件定位指针

ftell   获取文件定位指针的位置

frewind  将文件定位指针设置在文件的开头

 

【基本的绘图操作】

plot  x轴和y轴都按照线性比例绘制二维图形

plot3 xyz轴都按照线性比例会制三维图形

loglogxy轴按照对数比例绘制二维图形

 

semilogx  x 轴按对数比例,y轴按线性比例绘制二维图形

semilogy  y轴按对数比例,x轴按线性比例绘制二维图形

plotyy  绘制双y轴图形

【绘图步骤】

准备绘图数据

选择一个窗口并在窗口中给图形定位

调用基本的绘图函数

选择线型和标记特性

设置坐标轴的极限值,标记符号和网格线

使用坐标轴标签,图例和文本对图形进行注释

输出图形

 

 

你可能感兴趣的:(matlab)