马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
一、 创建函数:(这章我觉得实践性较强,大家一起来多动手,多看例子)
1、 一般形式: Function [outputvariable1, outputvariable2,……]=FunctionName(inputvariable1, inputvariable2,….)
%注释1
%注释2
……..表达式
如:
Function [x,y]=ComputeXY(t,a,b,c)
%x=cos(at)+b
%y=|x |+c
%常量:a,b,c
%变量:t,x,y
x=cos(a*t)+b;
y=abs(x)+c;
(几点说明:1:它不用end来表结束;2:请注意,输出变量是用[ ], 而输入变量用())
2、 三种特殊情况的特殊形式:
(1) 当函数仅用于绘图,在命令窗口中显示标志数据或将数据写到文件中。
Function FunctionName(inputvariable1, inputvariable2,….)
%注释1
%注释2
……..表达式
如:
Function Fabs(x)
%求绝对值的函数,不知道这里做例子否
If x>=0
Fabs(x)=x
Else
Fabs(x)=-x
End
(2) 当函数仅用来以指定的方式存储数据。
Function Outputvariables= FunctionName(inputvariable1, inputvariable2,….)
%注释1
%注释2
……..表达式
如:
Function zanswer=ComputeXY(t, a,b,c)
%对第一个例子改下,用一个向量变量zanswer表示[x,y]
%zanswer(1)=cos(at)+b
%zanswer(2)=|x |+c
%常量:a,b,c
%变量:t, zanswer
x=cos(a*t)+b;
zanswer=[x , abs(x)+c];
(3) 当以普通方式创建的M文件数量很多时,可以将程序文件转化为一个主函数以减少M文件的数量。
Function FunctionName
一般用一个主函数包含好几个子函数,而且这个主函数的名字要和要转化的程序文件名字一样。
如:
Function [m,s]=MeanStdDev(dat)
%主函数为MeanStdDev,计算m的子函数为mean,计算标准偏差的子函数为stdev。函数和子函数存在于文件%MeanStdDev.m中。
n=length(dat);
m=mean(dat,n);
function m=mean(v,n)
m=sum(v)/n;
function sd=stdev(v,n)
m=mean(v,n);
%call a sub functiom
Sd=sqrt((sum(v.^2)-n*m^2)/(n-1));
调试一下:调用函数和子函数的程序为:
v=[1,2,3,4];
[m,s]=MeanStdDev(v)
得到:
m=2.5000 ; s=1.2910
3、 inline的使用
在matlab命令窗口、程序或函数中创建局部函数时,可用inline。优点是不必将其储存为一个单独文件。在运用中有几点限制:不能调用另一个inline函数,只能由一个matlab表达式组成,并且只能返回一个变量---显然不允许[u,v]这种形式。因而,任何要求逻辑运算或乘法运算以求得最终结果的场合,都不能应用inline。除了这些限制,在许多情况下使用该函数非常方便。
Inline函数的一般形式为:
FunctionName=inline(‘任何有效的matlab表达式’, ‘p1’,’p2’ ,….) ,其中‘p1’,’p2’ ,…是出现在表达式中的所有变量的名字。
如:(求解F(x)=x^2*cos(a*x)-b ,a,b是标量;x是向量 )
在命令窗口输入:
Fofx=inline(‘x .^2*cos(a*x)-b’ , ‘x’,’a’,’b’);
g= Fofx([pi/3 pi/3.5],4,1)
系统输出为:g=-1.5483 -1.7259
4、 子函数:
如果在一个函数文件中出现多个function关键字,则在第一个function之后定义的所有函数都称为子函数。含有第一个function关键字的表达式叫做主函数,主函数是由命令窗口、程序和其他函数调用的唯一函数。子函数仅能由主函数和同个主函数的其他子函数调用。(也差不多说子函数是个局部变量,例子同2.(3))
5、 用户自定义函数、函数句柄和feval
有许多matlab内置函数要求用户通过它们创建特定形式的用户自定义函数。这类函数使用matlab函数:
Feval(FunctionHandle,p1,p2,…pn), 其中FunctionHandle是函数句柄,p1…pn是传递给FunctionHandle所指函数的参数。
(1) 函数句柄:是一种引用函数的方法,可以作为函数参数被传递,及使用feval计算。函数句柄由@和函数名构成。举几个例子来演示其基本用法吧:
<1>
fhandle=str2func('sin');
ys=sin(pi/4)
yfold=feval('sin',pi/4)
yfnew=feval(fhandle,pi/4)
ys =
0.7071
yfold =
0.7071
yfnew =
0.7071
<2>
Alpha=sym('pi/4');
yss=sin(Alpha)
yfold=feval('sin',Alpha)
ynews=feval('sin',Alpha)
yss =
1/2*2^(1/2)
yfold =
1/2*2^(1/2)
ynews =
1/2*2^(1/2)
<3>如何避免创建“无效函数句柄“问题
(1)
Hy2=@fhzzy %fhzzy.m 是随书光盘mfiles 文件夹上的一个函数文件。
Hy2 =
@fhzzy
(2)
class(Hy2)
size(Hy2)
ans =
function_handle
ans =
1 1
(3)
feval(Hy2,'line');
??? Error using ==> feval
Undefined function 'fhzzy'.
<4>自建函数及其句柄的使用。(1)
[fhzzy.m]
function Hr=fhzzy(flag )
% fhzzy
%
%
t=(0:100)/100*2*pi;
x=sin(t);
y=cos(t);
Hr=@cirline;
feval(Hr,flag,x,y,t)
% -------------subfunction---------------------------
function cirline(wd,x,y,t)
%
%
switch wd
case 'line'
plot(t,x,'b' ,t,y,'r','LineWidth',2)
case 'circle'
plot(x,y,'g.','MarkerSize',30),
axis square off
13
otherwise
error('输入宗量只能取 ''line'' 或 ''circle'' ! ')
end
shg
(2)
Hy3=@fhzzy
fhzzy('line');
Hy3 =
@fhzzy
fhzzy('line')
feval('fhzzy','line')
??? Undefined function or variable 'fhzzy'.(5)
feval(Hy3,'line');
<5>子函数句柄的创建与使用。
(1)
HCL=fhzzy('circle')
HCL =
@cirline
(2)
tt=(0:100)/100*2*pi;
xx=sin(tt);
yy=cos(tt);
cirline('circle',xx,yy,tt);
feval('circle',xx,yy,tt)
??? Undefined function or variable 'cirline'.
(3)
feval(HCL,'circle',xx,yy,tt)
(2)feval
〈1〉feval 的FN 绝对不能是表达式。:feval 的FN 只接受函数名。如:
Vf=feval('1+sin(x)',x)
??? Error using ==> feval
Invalid function name '1+sin(x)'.
但是可以调用内联函数,就持平了,呵呵
如:
Z2=inline('P1*x*sin(x^2+P2)',2)
Z2 =
Inline function:
Z2(x,P1,P2) = P1*x*sin(x^2+P2)
z2=Z2(2,2,3)
fz2=feval(Z2,2,2,3)
z2 =
2.6279
fz2 =
2.6279
——————————******end*****————————
这章的后面就讲matlab的内置函数,作者把它分成两大组,一组数组为输入参数,另一组需要用户自定义函数。我想做个大大的表格来归纳常用函数(函数名,参数,用途,怎么用,适用范围),就是一个人做不来,不有人和我合作,或者有什么指导的,这里先谢谢啦! |