Matlab笔记函数例题.docx

上传人:b****7 文档编号:15358240 上传时间:2023-07-03 格式:DOCX 页数:16 大小:21.82KB
下载 相关 举报
Matlab笔记函数例题.docx_第1页
第1页 / 共16页
Matlab笔记函数例题.docx_第2页
第2页 / 共16页
Matlab笔记函数例题.docx_第3页
第3页 / 共16页
Matlab笔记函数例题.docx_第4页
第4页 / 共16页
Matlab笔记函数例题.docx_第5页
第5页 / 共16页
Matlab笔记函数例题.docx_第6页
第6页 / 共16页
Matlab笔记函数例题.docx_第7页
第7页 / 共16页
Matlab笔记函数例题.docx_第8页
第8页 / 共16页
Matlab笔记函数例题.docx_第9页
第9页 / 共16页
Matlab笔记函数例题.docx_第10页
第10页 / 共16页
Matlab笔记函数例题.docx_第11页
第11页 / 共16页
Matlab笔记函数例题.docx_第12页
第12页 / 共16页
Matlab笔记函数例题.docx_第13页
第13页 / 共16页
Matlab笔记函数例题.docx_第14页
第14页 / 共16页
Matlab笔记函数例题.docx_第15页
第15页 / 共16页
Matlab笔记函数例题.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Matlab笔记函数例题.docx

《Matlab笔记函数例题.docx》由会员分享,可在线阅读,更多相关《Matlab笔记函数例题.docx(16页珍藏版)》请在冰点文库上搜索。

Matlab笔记函数例题.docx

Matlab笔记函数例题

for循环结构:

forx=array

(commands)

end

while循环结构:

whileexpression

(commands)

end

a

(1)=1

a

(2)=1

i=2

whilea(i)<=10000

a(i+1)=a(i-1)+a(i)

i=i+1

end;

i

a(i)

单分支:

ifexpression

(commands)

end

双分支:

ifexpression

(commands1)

else

(commands2)

end

多分支:

ifexpression1

(commands)

elseifexpression2

(commands)

…………

else

(commands)

end

如果判决条件expression为一个空数组,MATLAB认为条件为假(false)。

表达式有时由多个逻辑子表达式组成的,MATLAB将尽可能少地检测这些子表达式的值。

例如,表达式为:

(子表达式1|子表达式2),当MATLAB检测到子表达式1的值为真时,它就认为表达式为真,而不再对子表达式2进行检测。

又如,表达式为:

(子表达式1&子表达式2),当MATLAB检测到子表达式1的值为假时,它就认为表达式值为假的,从而跳过该结构。

if指令判决和break指令的配合使用,可以强制终止for循环或while循环。

switch-case结构:

switchexex为一标量或字符串。

casetest1

(commands1)当ex等于test1时,执行组命令1,然后跳出该结构。

casetest2

……

casetestk

(commandsk)当ex等于testk时,执行组命令k,然后跳出该结构。

otherwiseotherwise指令可以不存在

(commands)表达式不等于前面所有检测值时,则执行该组命令。

end

1当遇到switch结构时,MATLAB将表达式的值依次和各个case指令后面的检测值进行比较。

如果比较结果为假,则取下一个检测值再比较,一旦比较结果为真,MATLAB将执行相应的一组命令,然后跳出该结构。

如果所有的比较结果都为假,即表达式的值和所有的检测都不等,MATLAB将执行otherwise后面的一组命令。

由此可见上述结构保证了至少有一组命令会得到执行。

2switch指令后面的表达式应为一个标量或者为一个字符串。

对于标量形式的表达式,比较这样进行:

表达式==检测值i。

而对于字符串,MATLAB将调用函数strcmp来实现比较:

strcmp(表达式,检测值i)。

3case指令后面的检测值不仅可以为一个标量值或一个字符串,还可以为一个元胞数组。

如果一个检测值是一个元胞数组,MATLAB将把表达式的值和该元胞数组中的所有元素进行比较;如果元胞数组中某个元素和表达式的值相等,MATLAB认为此次比较结果为真,从而执行与该检测值相应的一组命令。

fori=1:

10

a{i}=89+i

b{i}=79+i

c{i}=69+i

d{i}=59+i

end

c=[d,c]

Name={'Jack','Marry','Peter','Rose','Tom'};

Mark={72,83,56,94,100};

Rank=cell(1,5);

%创建一个含5个元素的架构数组S,它有三个域S=struct('Name',Name,'Marks',Mark,'Rank',Rank);

fori=1:

5

switchS(i).Marks

case100%得分为100时

S(i).Rank='满分';%列为‘满分’等级

casea%得分在90和99之间

S(i).Rank='优秀';%列为‘优秀’等级

caseb%得分在80和89之间

S(i).Rank='良好';%列为‘良好’等级

casec%得分在60和79之间

S(i).Rank='及格';%列为‘及格’等级

Otherwise%得分低于60

S(i).Rank='不及格';%列为‘不及格’等级

end

end

%将学生姓名,得分,登记等信息打印出来

disp(['学生姓名','得分','等级']);

disp('')

fori=1:

5

disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);

end;

try-catch结构:

try

(commands1)组命令1总被执行。

若正确,则跳出此结构。

catch

(commands2)仅当组命令1出现执行错误,组命令2才被执行。

end

只有当MATLAB在执行组命令1时出现了错误后,组命令2才会被执行。

可调用lasterr函数查询出错原因。

如果函数lasterr的运行结果为一个空串,则表明组命令1被成功执行了

仅使用lasterr函数返回最近的出错提示。

clear

N=3

A=magic(3)

try

N=N+1

A_N=A(N,:

catch

A_end=A(end,:

end

lasterr

v=imput(‘message’)

v=input(‘message’,‘s’)

该指令执行时,“控制权”交给键盘;待输入结束,按下Enter键,“控制权”交还MATLAB。

Message是提示用的字符串,第一种格式用于键入数值、字符串、元胞数组等数据;第二种格式,不管键入什么,总以字符串形式赋给变量v

keyboard:

遇到keyboard时,将“控制权”交给键盘,用户可以从键盘输入各种MATLAB指令。

仅当用户输入return指令后,“控制权”才交给程序。

它与input的区别是:

它允许输入任意多个MATLAB指令,而input只能输入赋给变量的“值”

break:

可以使包含该指令的while、for循环终止;也可以在if-end、switch-case、try-catch中导致中断。

continue

跳过位于其后的循环中的其他指令,执行循环的下一个迭代

pausepause(n)

第一种格式使程序暂停执行,等待用户按任意键继续;第二种格式使程序暂停n秒后,再继续执行

return

结束return指令所在函数的执行,而把控制转至主调函数或者指令窗,否则,只有待整个被调函数执行完后,才会转出。

error(‘message’)

显示出错信息message,终止程序

lasterr显示最新出错原因,并终止程序

lastwarm显示MATLAB自动给出的最新警告程序继续运行warming(‘message’)显示警告信息message,程序继续运行

全局变量定义:

Globalab

M函数文件示例:

functionsa=circle(r,s)

%CIRCLEplotacircleofradiirinthelinespecifiedbys.

%r指定半径的数值

%s指定线色的字符串

%sa圆面积

%circle(r)利用蓝实线画半径为r的圆周线

%circle(r,s)利用串s指定的线色画半径为r的圆周线

%sa=circle(r)计算圆面积,并画半径为r的蓝色圆面

%sa=circle(r,s)计算圆面积,并画半径为r的s色圆面

%编写于2000年1月1日,修改于2000年2月1日。

ifnargin>2

error('输入宗量太多。

');

end;

ifnargin==1

s='b'

end;

clf;

t=0:

pi/100:

2*pi;

x=r*exp(i*t);

ifnargout==0

plot(x,s);

else

sa=pi*r*r;

fill(real(x),imag(x),s)

end

axis('square')

P码文件:

pcodeFunName在当前目录上生成FunName.p。

pcodeFunName-inplace在FunName.m所在目录上生成FunName.p。

inmem罗列出内存中所有P码文件名。

clearFunName清除内存中的FunName.pP码文件。

clearfunctions清除内存中的所有P码文件。

MATLAB的搜索过程:

假设MATLAB在一个文件中碰到指令cow时,它将按以下步骤逐步进行检索:

1检查cow是否一个变量名;如果不是,执行下一步。

2检查cow是不是内建函数(Built-inFunction);假如不是,执行下一步。

3检查cow是不是cow所在的M文件中的一个子函数;假如不是,再往下执行。

4检查cow是不是cow所在的M文件中的一个私用函数(先找cow.p,然后是cow.m);假如不是,再往下执行。

5检查cow是不是当前目录上的文件(先找cow.p,然后是cow.m);假如不是,再往下执行。

6检查搜索路径上是否有cow存在(先找cow.p,然后是cow.m)。

MATLAB将使用最先找到的那个cow。

如果一直找不到cow,MATLAB就给出错误提示信息。

输入输出宗量检测指令:

nargin在函数体内,用于获取实际输入宗量。

nargout在函数体内,用于获取实际输出宗量。

nargin(‘fun’)获取‘fun’指定函数的标称输入宗量数。

nargout(‘fun’)获取‘fun’指定函数的标称输出宗量数。

inputname(n)在函数体内使用,给出第n个输入宗量的实际调用变量名。

nargin,nargout,inputname本身都是函数,而不是变量

跨空间变量传递:

evalin('workspace','expression')跨空间计算串表达式值。

evalin('workspace','expression1','expression2')跨空间计算替代串表达式值。

1'workspace'可取两个值:

'base'和'caller'。

2第一种调用格式的执行机理是:

当'workspace'取'base'表示计算eval('expression')时,将从基本工作空间获得变量值。

当'workspace'取'caller'表示计算eval('expression')时,将从主调函数工作空间获得变量值。

主调函数是相对被调函数而言的。

这里,被调函数是指evalin所在的函数。

3第二种调用格式的执行机理是:

先从所在函数空间获得变量值,用eval(‘expression1’)计算原串表达式;若该计算失败,则再从'workspace'指定的(基本或主调函数)得变量值。

再通过eval('expression2')计算替代串表达式。

evalin运行机理与eval的异同:

functiony1=evalinzzy(a,s)

t=(0:

a)/a*2*pi

y1=subevalinzzy(4,s);

%------------subfunction-----------

functiony2=subevalinzzy(a,s)

t=(0:

a)/a*2*pi;

ss='a*exp(i*t)';

switchs

case{'base','caller'}

y2=evalin(s,ss);

case'self'

y2=eval(ss);

end

%调用该函数。

clear

a=30

t=(0:

a)/a*2*pi

sss={'base','caller','self'}

fork=1:

3

y0=evalinzzy(8,sss{k})

subplot(1,3,k)

plot(real(y0),imag(y0),'r','LineWidth',3)

axissquare

image

end

assignin('workspace','VN',x)跨空间向VN变量赋值

把当前工作空间内变量x的值赋给’workspace’指定空间名的VN变量

functiony=assigninxyq(x)

y=sqrt(x)

t=x^2

assignin('base','yy',t)

clear

a=30

t=(0:

a)/a*2*pi

sss={'base','caller','self'}

fork=1:

3

y0=evalinzzy(8,sss{k})

subplot(1,3,k)

plot(real(y0),imag(y0),'r','LineWidth',3)

axissquare

%image

end

clear

x=4

y=assigninxyq(x);

disp([blanks(5),'x',blanks(5),'y',blanks(4),'yy'])

disp([x,y,yy])

MATLAB允许一个M函数文件包含多个函数的代码。

其中,第一个出现的函数称为主函数(Primaryfunction),该文件中的其他函数称为子函数(Subfunction)。

保存时所用函数文件名与主函数定义名相同。

外部程序只能对主函数进行调用。

1在M函数文件内,主函数的位置不可改变,但子函数的排列次序可以任意改变。

2子函数只能被处于同一文件的主函数或其他子函数调用。

3在M函数文件中,任何指令通过“名字”对函数进行调用时,子函数的优先级仅次于内装函数。

4同一文件的主函数、子函数的工作空间都是彼此独立的。

各函数间的信息,或通过输入输出宗量传递,或通过全局变量传递,或通过跨空间指令传递。

私用函数,是指位于private目录上的M文件函数。

1私用函数的构造与普通M函数完全相同。

2私用函数只能被private目录的直接父目录上的M函数文件所调用。

它不能被其他目录上的任何M函数、M脚本文件或MATLAB指令窗中的命令所调用,也不能被直接父目录上的M脚本文件调用。

3M文件中,任何指令通过“名字”对函数进行调用时,私用函数的优先级虽低于内装函数和子函数,但高于其他任何目录上的函数。

串演算函数

指令、表达式、语句,以及由它们综合组成的M文件,是用户为达到自己计算目的时所最常用的形式。

为提高计算的灵活性,MATLAB还提供两种演算函数:

一种是“串演算函数”eval,它具有对字符串表达式进行计算的能力;另一种是“函数句柄演算函数”feval,它具有对函数句柄进行操作的能力。

y=eval(‘CEM)执行CEM指定的计算。

[y1,y2,…]=eval(‘CEM’)执行对CEM代表的函数文件调用,并输出计算结果。

1eval指令的输入宗量必须是字符串。

2构成字符串的CEM,可以是MATLAB任何合法的指令、表达式、语句或M文件名。

3第二种格式中的CEM只能是(包含输入宗量在内的)M函数文件名。

clear

t=pi

eval('theta=t/2,y=sin(theta)')

CEM={'cos','sin','tan'}

fork=1:

3

theta=pi*k/12;

y(1,k)=eval([CEM{k},'(',num2str(theta),')'])

end

feval

[y1,y2,…]=feval(FH,arg1,arg2,…)%执行函数句柄FH指定的计算。

[y1,y2,…]=feval(FN,arg1,arg2,…)%执行函数名字符串FN指定的计算。

[y1,y2,…]=feval(FIL,arg1,arg2,…)%执行内联函数FIL指定的计算。

1第一种调用格式是MATLAB6.0版引入的新格式。

其中FN是函数句柄。

它用@或str2func专门创建。

2第二种调用格式是“老格式”,目前仍能使用,但建议尽量少用或不用该格式。

其中FN取“带单引号的MATLAB内装函数名或M函数文件名”。

3第三种调用格式仅对内联函数对象使用。

4三种调用格式中的arg1,arg2,…是传给函数的参数。

它们的含义及排列次序均由与“被计算函数的输入宗量含义及次序”一致。

5feval与函数句柄配套使用;而eval与字符串配套使用。

6MATLAB中的泛函指令(如fzero,ode45,explot等)都借助feval构成。

x=pi/4

Ve=eval('1+sin(x)')

rand('seed',1)

A=rand(2,2)

Heig=@eig

d=feval(Heig,A)

内联函数:

inline('CE',arg1,arg2,…)把串表达式转化为arg1,arg2等指定输入宗量的内联函数。

inline('CE',n)把串表达式转化为x,P1,P2,…Pn等指定输入宗量的内联函数。

1'CE'是字符串;CE必须是不包含赋值号“=”的表达式。

2第一种调用格式是创建内联函数的最稳妥、可靠途径。

输入宗量字符可表达得更自如。

3第二种调用格式最简练,但对输入宗量的字符限制严格。

输入宗量字符只能是x,P1…,Pn等。

注意:

P是大写字母。

4内联函数是沟通eval,feval两个不同指令的“桥梁”。

凡eval可以运作的表达式,都可以通过inline转化为内联函数,而这种内联函数总可被feval使用。

MATLAB的“泛函”指令,就是由于采用了inline,而具备了适应各种被处理函数形式的能力

class(inline_fun)给出内联函数类型。

char(inline_fun)给出内联函数计算公式。

argnames(inline_fun)给出内联函数的输入宗量。

vectorize(inline_fun)使内联函数适用“数组运算”规则。

%以字符串定义的函数亦可%f='sin(x^2)'

f=inline('sin(x^2)')

G=inline('a*exp(x)*cos(y)','a','x','y');

disp([class(G),blanks(10),char(G)])

argnames(G)

GG=vectorize(G)

Z2=inline('P1*x*sin(x^2+P2)',2)

z2=Z2(2,2,3)

fz2=feval(Z2,2,2,3)

函数句柄

hsin=@sin

class(hsin)

size(hsin)

CC=functions(hsin)%借助指令functions观察内涵

CC.methods%同名重载函数观察

1指令hsin=@sin的功能可以用hsin=str2func('sin')替代。

2定义函数句柄时,所指定的函数名不应包括路径信息,也不应包括扩展名。

函数名最多只能包含31个字符。

functions返回构架中各域的名称、可能取值和含义:

Function句柄所代表的函数名

Type函数类型

simple无重载的内建函数、M、P函数文件,或无法判别类型函数

subfunction子函数

private私有函数

constructorMATLAB类的对象构造函数

overloaded有重载的函数

File非重载数据类型所对应的源代码及路径。

假如存在内建函数,则总列在此栏

Methods仅当函数类型为时,返回构架才具有该域。

该域本身又是一个构架,其各子域分别记录着所有的重载函数及路径。

[argout1,argout2,…,argoutn]=FunName(argin1,argin2,…,arginn)

Hfun=@FunName;

[argout1,argout2,…,argoutn]=feval(Hfun,argin1,argin2,…,arginn)

1不管名为FunName的函数文件是否在当前搜索路径上,不管它是否在当前视野内,不管它是否是子函数或私用函数,运用句柄Hfun后总能被正确地执行。

2在FunName存在重载函数时,借助句柄Hfun的计算总能被“恰当地”执行。

也就是说,它也会根据待计算的数据类型,从其包含所有重载函数中选择相应的函数文件执行运算。

3在不使用函数句柄的情况下,对FunName进行多次调用时,每次都要为该函数进行全面的路径搜索,这直接影响计算速度。

借助Hfun可完全克服这种无谓的时间消耗。

fhandle=str2func('sin');

ys=sin(pi/4)%函数直接调用

yfold=feval('sin',pi/4)%feval指令的“老式”调用

yfnew=feval(fhandle,pi/4)%feval指令的“新式”调用

Alpha=sym('pi/4');%定义符号常数

yss=sin(Alpha)

yfold=feval('sin',Alpha)%feval指令的“老式”调用

yfnews=feval(fhandle,Alpha)%feval指令的“新式”调用

xold=fminbnd('sin',0,2*pi)%泛函指令的“老式”调用

xnew=fminbnd(fhandle,0,2*pi)%泛函指令的“新式”调用

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2