《MATLAB原理与工程应用(第二版)》第五章 函数的读书笔记
一、 创建函数:(这章我觉得实践性较强,大家一起来多动手,多看例子)1、 一般形式:Function =FunctionName(inputvariable1, inputvariable2,….)
%注释1
%注释2
……..表达式
如:
Function =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) 当函数仅用于绘图,在命令窗口中显示标志数据或将数据写到文件中。
FunctionFunctionName(inputvariable1, inputvariable2,….)
%注释1
%注释2
……..表达式
如:
FunctionFabs(x)
%求绝对值的函数,不知道这里做例子否
If x>=0
Fabs(x)=x
Else
Fabs(x)=-x
End
(2) 当函数仅用来以指定的方式存储数据。
FunctionOutputvariables= FunctionName(inputvariable1, inputvariable2,….)
%注释1
%注释2
……..表达式
如:
Functionzanswer=ComputeXY(t, a,b,c)
%对第一个例子改下,用一个向量变量zanswer表示
%zanswer(1)=cos(at)+b
%zanswer(2)=|x |+c
%常量:a,b,c
%变量:t, zanswer
x=cos(a*t)+b;
zanswer=;
(3) 当以普通方式创建的M文件数量很多时,可以将程序文件转化为一个主函数以减少M文件的数量。
FunctionFunctionName
一般用一个主函数包含好几个子函数,而且这个主函数的名字要和要转化的程序文件名字一样。
如:
Function =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=;
=MeanStdDev(v)
得到:
m=2.5000; s=1.2910
3、 inline的使用
在matlab命令窗口、程序或函数中创建局部函数时,可用inline。优点是不必将其储存为一个单独文件。在运用中有几点限制:不能调用另一个inline函数,只能由一个matlab表达式组成,并且只能返回一个变量---显然不允许这种形式。因而,任何要求逻辑运算或乘法运算以求得最终结果的场合,都不能应用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(,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)
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的内置函数,作者把它分成两大组,一组数组为输入参数,另一组需要用户自定义函数。我想做个大大的表格来归纳常用函数(函数名,参数,用途,怎么用,适用范围),就是一个人做不来,不有人和我合作,或者有什么指导的,这里先谢谢啦! 补充几点:
1、用nargin/nargout 可用来判断函数的输入参数的个数/输出参数的个数,再根据参数的个数不同来处理参数
。
2、不同工作空间之间变量的传递:assignin(ws,'var','val')表示将值val赋值给工作空间ws中的变量var,当
var不存在时,就在工作空间ws中创建这个变量。 脚本文件的例子:
它是整个文本就是一 个函数:如在edit中写下:
theta=-pi:0.01:pi;
rho(1,:)=2*sin(5*theta).^2;
rho(2,:)=cos(10*theta).^3;
rho(3,:)=sin(theta).^2;
rho(4,:)=5*cos(3.5*theta).^3;
for k=1:4
subplot(2,2,k)
polar(theta,rho(k,:))
end
disp('over')
————————
点下file--save--把文件名改为ftu--保存。
--以后如果要用ftu的功能就直接在命令窗口,打进ftu就可以了。 我也学了一本书,正准备写写笔记,否则以后都忘了,不过看到文件,gui这最后几张看不动了,也看不董了,感觉好难!只能把pushbuton,edit text,生成,然后就不会了,不会call,文字能输入进edit text,但是没有建立他的实际意义,没有和其他函数连接上,还望有人指导一下! 我也是这样,界面设计一直不会 也看不懂 原帖由 vib 于 2006-11-15 21:01 发表
我也学了一本书,正准备写写笔记,否则以后都忘了,不过看到文件,gui这最后几张看不动了,也看不董了,感觉好难!只能把pushbuton,edit text,生成,然后就不会了,不会call,文字能输入进edit text,但是没有建立 ...
pushbuton,edit text是怎么生成的? 挺好,为我门这些新手提供了捷径.
多谢
这个东西很有用,多谢多谢 谢谢分享
页:
[1]