Matlab笔记之十一 有关M文件编写Word文件下载.docx
- 文档编号:16657640
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:13
- 大小:22.05KB
Matlab笔记之十一 有关M文件编写Word文件下载.docx
《Matlab笔记之十一 有关M文件编写Word文件下载.docx》由会员分享,可在线阅读,更多相关《Matlab笔记之十一 有关M文件编写Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
当ex等于test1时,执行组命令1,然后跳出该结构。
casetest2
……
casetestk
(commandsk)
当ex等于testk时,执行组命令k,然后跳出该结构。
otherwise
otherwise指令可以不存在
(commands)
表达式不等于前面所有检测值时,则执行该组命令。
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
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);
5
switchS(i).Marks
case100%得分为100时
S(i).Rank='
满分'
;
%列为‘满分’等级
casea
%得分在90和99之间
优秀'
%列为‘优秀’等级
caseb
%得分在80和89之间
良好'
%列为‘良好’等级
casec
%得分在60和79之间
及格'
%列为‘及格’等级
Otherwise
%得分低于60
S(i).Rank='
不及格'
%列为‘不及格’等级
end
%将学生姓名,得分,登记等信息打印出来
disp(['
学生姓名'
得分'
等级'
]);
disp('
'
)
5
disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);
try-catch结构:
try
(commands1)组命令1总被执行。
若正确,则跳出此结构。
catch
(commands2)仅当组命令1出现执行错误,组命令2才被执行。
只有当MATLAB在执行组命令1时出现了错误后,组命令2才会被执行。
可调用lasterr函数查询出错原因。
如果函数lasterr的运行结果为一个空串,则表明组命令1被成功执行了
仅使用lasterr函数返回最近的出错提示。
clear
N=3
A=magic(3)
N=N+1
A_N=A(N,:
)
A_end=A(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
跳过位于其后的循环中的其他指令,执行循环的下一个迭代
pause
pause(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('
输入宗量太多。
'
);
ifnargin==1
s='
b'
clf;
t=0:
pi/100:
2*pi;
x=r*exp(i*t);
ifnargout==0
plot(x,s);
sa=pi*r*r;
fill(real(x),imag(x),s)
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'
)跨空间计算串表达式值。
'
expression1'
expression2'
)跨空间计算替代串表达式值。
1'
可取两个值:
base'
和'
caller'
。
2第一种调用格式的执行机理是:
当'
取'
表示计算eval('
)时,将从基本工作空间获得变量值。
)时,将从主调函数工作空间获得变量值。
主调函数是相对被调函数而言的。
这里,被调函数是指evalin所在的函数。
3第二种调用格式的执行机理是:
先从所在函数空间获得变量值,用eval(‘expression1’)计算原串表达式;
若该计算失败,则再从'
指定的(基本或主调函数)得变量值。
再通过eval('
)计算替代串表达式。
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{'
}
y2=evalin(s,ss);
case'
self'
y2=eval(ss);
%调用该函数。
a=30
sss={'
fork=1:
3
y0=evalinzzy(8,sss{k})
subplot(1,3,k)
plot(real(y0),imag(y0),'
r'
LineWidth'
3)
axissquare
image
assignin('
VN'
x)跨空间向VN变量赋值
把当前工作空间内变量x的值赋给’workspace’指定空间名的VN变量
functiony=assigninxyq(x)
y=sqrt(x)
t=x^2
yy'
t)
y0=evalinzzy(8,sss{k})
subplot(1,3,k)
axissquare
%image
x=4
y=assigninxyq(x);
disp([blanks(5),'
x'
blanks(5),'
y'
blanks(4),'
])
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函数文件名。
t=pi
eval('
theta=t/2,y=sin(theta)'
CEM={'
cos'
sin'
tan'
theta=pi*k/12;
y(1,k)=eval([CEM{k},'
('
num2str(theta),'
)'
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等指定输入宗量的内联函数。
n)把串表达式转化为x,P1,P2,…Pn等指定输入宗量的内联函数。
是字符串;
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('
G=inline('
a*exp(x)*cos(y)'
a'
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('
)替代。
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('
ys=sin(pi/4)
%函数直接调用
yfold=feval('
pi/4)
%feval指令的“老式”调用
yfnew=feval(fhandle,pi/4)
%feval指令的“新式”调用
Alpha=sym('
pi/4'
%定义符号常数
yss=sin(Alpha)
Alpha)
yfnews=feval(fhandle,Alpha)%feval指令的“新式”调用
xold=fminbnd('
0,2*pi)%泛函指令的“老式”调用
xnew=fminbnd(fhandle,0,2*pi)%泛函指令的“新式”调用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab笔记之十一 有关M文件编写 Matlab 笔记 十一 有关 文件 编写