matlab电子教案doc(8)

更新时间:2023-11-15 22:36:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

7、文件操作 文件的打开与关闭 (1) 打开文件

fopen 函数的调用格式为:

Fid= fopen(文件名,打开方式) (2) 关闭文件调用格式为:

Sta=fclose(Fid) 二进制文件读写操作 (1) 读二进制文件

fread 函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:

[A,COUNT]=fread(Fid,size, precision) (2)写二进制文件

fwrite 函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:

COUNT=fwrite (Fid, A, precision) 文本文件读写操作 (1)读文本文件

fscanf 函数可以读取文本文件的内容,并按指定格式存入矩阵。 其调用格式为:

[A,COUNT]= fscanf (Fid, format, size)

(2)写文本文件

fprintf 函数可以将数据按指定格式写入到文本文件中。其调用格式为:

COUNT= fprintf(Fid, format, A) 数据文件定位

fseek 函数用于定位文件位置指针,其调用格式为: status=fseek(Fid, offset, origin)

ftell 函数返回文件指针的当前位置,其调用格式为:

position=ftell (Fid)

例4-24 分析下列程序执行后,four、position 和 three 三个变量的值。 a=1:5;

Fid=fopen('fdat.bin', 'w');

%以写方式打开文件fdat.bin,若没有该文件则创建一个新文件 fwrite(Fid, a, 'int16' );

%将 a 的元素以双字节整型写入文件 fdat.bin status=fclose(Fid);

Fid=fopen('fdat.bin', 'r'); %以读数据方式打开文件 fdat.bin status=fseek(Fid, 6, 'bof');

%将文件指针从开始位置向尾部移动 6 个字节

four=fread(Fid, 1, 'int16');

%读取第 4 个数据,并移动指针到下一个数据 position=ftell(Fid); %ftell 的返回值为 8 status=fseek(Fid, -4, 'cof');

%将文件指针从当前位置往前移动 4 个字节

three=fread(Fid, 1, 'int16'); %读取第 3 个数据 status=fclose(Fid); (fseek 函数的参数:

'bof' or -1 Beginning of file 'cof' or 0 Current position in file 'eof' or 1 End of file)

4.3 编程中使用的通用函数

本节通过例子学习3个通用函数和函数句柄,它们提供了Matlab 的宏操作能力。 例4-25

y=eval('CEM') %执行 CEM 指定的计算 [y1,y2,…]=eval('CEM') %执行对 CEM 代表的函数文件调用,并输出计算结果

eval('peaks')

[A,B]=eval('peaks(3)');

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

注意:eval()函数的要点是,被执行的 CEM 命令可以是随机填入的 字符串。这一功能可以使得我们根据需要运行不同的函数。请看下面的例子:

CEM={'cos','sin','tan'}; for k=1:3 theta=pi*k/12;

y(1,k)=eval([CEM{k},'(',num2str(theta),')']) end 例4-26

y=feval(FH,arg1,arg2,…) 执行函数句柄指定的计算 rand('seed',1); A=rand(2,2); Heig=@eig; d=feval(Heig,A) d=feval('eig',A) dd=eig(A)

以下两句都是错误的: eval(Heig,A)

feval('1+sin(A)') 但是, eval('1+sin(A)')

注意:eval()和 feval()函数的区别

例4-27

inline('CE',arg1,arg2,…) 把串表达式'CE'转化为变量为arg1,arg2,…的内联函数

G=inline('a*exp(x)*cos(y)','a','x','y');%定义内联函数 disp([class(G),blanks(5),char(G)]) %显示函数G的类 argnames(G) %显示函数 G 的参数 G(2,-1,pi/2) %计算函数值 syms a x, y;

GG=sym('a*exp(x)*cos(y)'); %注意符号函数表达式与内联函数的区别 GG(2,-1,2) %出错 GG

例4-28 函数句柄的创建及意义 函数句柄的创建有两种方法:

hsin=@sin; %创建 sin 函数的函数句柄 hpeaks=str2func('peaks');

4.4 函数句柄的类型及含义:

ee=functions(hpeaks) %peaks 函数的类型及含义 %peaks 是一个重载函数

feval(hpeaks,20) 一、函数句柄的调用:

假如函数的调用格式是:

[argout,argout2,…,argoutn]=FunName(argin1,argin2,…,arginn); Hfun=@FunName;

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

二、函数句柄的意义:

? 函数从其存储形式来看,可以分为内装函数(在内存中的)和重载函数(在外存中);在内存中的函数可以直接运行,在外存中 的函数要先调入内存,然后运行。

? 函数句柄是计算机系统辨识函数的标识,引用函数句柄就像调用函数本身一样。

? 程序中用函数句柄来代表函数,可以增加简洁性和通用性,这通 常是程序设计追求的目标之一。

? 在一个程序中,当函数句柄指向重载函数时,第一次调用便把该 函数装入内存,再次调用时该函数变成为一个内装函数,从而加 速了程序运行的速度。 三、函数句柄的调用 1、在数值计算中调用:

fhandle=@sin; %定义函数句柄

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

yfnew=feval(fhandle,pi/4) tval 的新式调用 2、在符号计算中调用:

Alpha=sym('pi/4'); %定义符号常数 yss=sin(Alpha) %直接调用

yfnew=feval(fhandle,Alpha) tval 指令的新式调用 3、在泛指令中的调用:

xnew=fminbnd(fhandle,0,2*pi) %求sin在[0,2*pi]的极小值点

例4-29 函数句柄的调用实例:自建函数及其句柄的使用。

通过本例可看到:只要在当前MATLAB工作空间中存在函数句柄,那末不管该函数当前是否在搜索范围内,均可通过函数句柄实现正确的运作。 (1)[zzy076_3.m]

function Hr=zzy076_3(flag )

% ZZY076_3 为演示函数、子函数句柄而设计的绘图文件。 % flag 可以取字符串'line'或 'circle'。 t=(0:100)/100*2*pi; x=sin(t); y=cos(t);

Hr=@cirline; %创建子函数的句柄 feval(Hr,flag,x,y,t)

%

Hr=cirline,(wd,x,y,t)=(flag,x,y,t)

% -------------subfunction--------------------------- function cirline(wd,x,y,t)

% wd 接受字符串'line'或'circle' % t 画线用的独立参变量 % x 由 t 产生的横坐标变量 % 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 otherwise

error('输入宗量只能取 ''line'' 或 ''circle'' ! ') end

shg %show graph window

(1)zzy076_3.m 所在目录不是当前目录并且不在Matlab的搜索路径中,以下操作不可用: zzy076_3('line') %函数不可运行

feval('zzy076_3','line'); tval 函数也不可运行 (2)在 zzy076_3 函数的目录下调用 zzy076_3.m,返回子函数

cirline 的函数句柄 HCL HCL=zzy076_3('circle')

(3)子函数即使在其所在的当前目录下也不可运行 tt=(0:100)/100*2*pi; xx=sin(tt); yy=cos(tt); cirline('circle',xx,yy,tt); feval('circle',xx,yy,tt)

(4)子函数可以通过它的句柄并借用feval函数调用feval(HCL,'circle', xx,yy,tt)

总结:可以利用函数句柄来调用父函数的子函数。其条件是: 1.该子函数要在其父函数中定义句柄 2.子函数句柄通过运行主函数获得

3.子函数句柄在 workspace 空间时,可用 feval 函数通过句柄来调用它,调用时与工作目录无关 总结:

1.函数在 Matlab 的当前工作目录下可执行,feval 函数也可用 2.函数不在 Matlab 的当前工作目录下但在Matlab的搜索路径中可执行,feval 函数也可用

3.在该函数的目录下或该函数的目录在Matlab的搜索路径中,可定义该函数的句柄,句柄定义后,可用 feval 函数和句柄在任何目录下调用该函数,其原因是该函数一旦定义该函数的句柄后

便被该句柄标识并驻留在 workspace 空间。

本文来源:https://www.bwwdw.com/article/x8iv.html

Top