当前位置:文档之家› 【Matlab 简易教程】第八章 M文件和面向对象编程

【Matlab 简易教程】第八章 M文件和面向对象编程

【Matlab 简易教程】第八章  M文件和面向对象编程
【Matlab 简易教程】第八章  M文件和面向对象编程

Matlab 简易教程

8 M 文件和面向对象编程

假如读者想灵活运用MATLAB 去解决实际问题,想充分调动MATLAB ——科学技术资源,想理解MATLAB 版本升级所依仗的基础,那么本章内容将十分有用。 本章将涉及比较深层的MATLAB 内容:脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。本章配备了许多精心设计的算例。这些算例是完整的,可直接演练的。读者通过这些算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到面向对象编程的优越和至关要领。

8.1 入门

【*例8.1-1】通过M 脚本文件,画出下列分段函数所表示的曲面。

???

????-≤+≤+<->+=+-------15457.0117575.015457.0),(215.175.375.0216215.175.375.021121222

12212

122x x e x x e x x e x x p x x x x x x x x

(1)编写M 脚本文件的步骤

图 8.1-1-1 MATLAB Editor/Debugger 窗口

点击MATLAB 指令窗工具条上的New File 图标 ,就可打开如图8.1-1-1所示的

MATLAB 文件编辑调试器MATLAB Editor/Debugger 。其窗口名为untitled ,用户即可在空白窗口中编写程序。比如输入如下一段程序 [zx81.m]

%zx81.m This is my first example. <1> a=2;b=2; % <2> clf;

x=-a:0.2:a;y=-b:0.2:b; for i=1:length(y) for j=1:length(x) if x(j)+y(i)>1

z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j)); elseif x(j)+y(i)<=-1

z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));

else z(i,j)=0.7575*exp(-y(i)^2-6.*x(j)^2);

end

end

end

axis([-a,a,-b,b,min(min(z)),max(max(z))]);

colormap(flipud(winter));surf(x,y,z);

●点击编辑调试器工具条图标,在弹出的Windows标准风格的“保存为”对话框中,

选择保存文件夹,键入新编文件名(如zx81),点动【保存】键,就完成了文件保存。

(2)运行文件

●使zx81.m所在目录成为当前目录,或让该目录处在MATLAB的搜索路径上

●然后运行以下指令,便可得到图形。

zx81

图 8.1-1-2 运行zx81.m得到的图形

【*例8.1-2】通过M函数文件画出上例分段函数的曲面。

整个编程步骤和相同。在此演示,如何在zx81.m基础上产生函数文件zx82.m 。

●在编辑调试器中,选择【File:Save As】子菜单,把zx81.m文件“另存为”zx82.m 。

●用下面4行指令代替原文件的第<1><2>条指令。

function zx82(a , b)

% This is my second example.

% a Define the limit of variable x .

% b Define the limit of variable y .

●进行上述修改后,对zx82.m再次实施“保存”操作。

●在MATLAB指令窗中,运行以下指令,就能产生与图8.1-1-2完全相同的图形。

zx82(2,2)

8.2 M文本编辑器

8.2.1利用文本编辑器编写M文件

8.2.2【tools】菜单

8.3 MATLAB控制流

8.3.1 for 循环结构

【*例8.3.1-1】一个简单的for 循环示例。

for i=1:10; %i 依次取1,2,…10,.

x(i)=i; %对每个i 值,重复执行由该指令构成的循环体, end;

x %要求显示运行后数组x 的值。 x =

1 2 3 4 5 6 7 8 9 10

8.3.2 while 循环结构

【*例8.3.2-1】Fibonacci 数组的元素满足Fibonacci 规则:12+++=k k k a a a ,),2,1( =k ;且121==a a 。现要求该数组中第一个大于10000的元素。

a(1)=1;a(2)=1;i=2; while a(i)<=10000 a(i+1)=a(i-1)+a(i); %当现有的元素仍小于10000时,求解下一个元素。 i=i+1; end;

i,a(i), i =

21 ans =

10946

8.3.3 if-else-end 分支结构

【*例8.3.3-1】一个简单的分支结构。

cost=10;number=12; if number>8

sums=number*0.95*cost; end,sums sums =

114.0000

【*例8.3.3-2】用for 循环指令来寻求Fibonacc 数组中第一个大于10000的元素。

n=100;a=ones(1,n); for i=3:n

a(i)=a(i-1)+a(i-2); if a(i)>=10000 a(i),

break; %跳出所在的一级循环。 end; end,i ans =

10946 i =

21

8.3.4switch-case结构

【*例8.3.4-1】学生的成绩管理,用来演示switch结构的应用。

clear;

%划分区域:满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。for i=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);

%根据学生的分数,求出相应的等级。

for i=1:5

switch S(i).Marks

case 100 %得分为100时

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

case a %得分在90和99之间

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

case b %得分在80和89之间

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

case c %得分在60和79之间

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

otherwise %得分低于60。

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

end

end

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

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

for i=1:5;

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

学生姓名得分等级

Jack 72 及格

Marry 83 良好

Peter 56 不及格

Rose 94 优秀

Tom 100 满分

8.3.5try-catch结构

【*例8.3.5-1】try-catch结构应用实例。

clear,N=4;A=magic(3); %设置3行3列矩阵A。

try

A_N=A(N,:), %取A的第N行元素

catch

A_end=A(end,:), %如果取A(N,:)出错,则改取A的最后一行。

end

lasterr %显示出错原因

A_end =

4 9 2

ans =

Index exceeds matrix dimensions.

8.3.6控制程序流的其它常用指令

8.3.6.1return指令

8.3.6.2input和keyboard指令

8.3.6.3yesinput指令

8.3.6.4pause指令

8.3.6.5break指令

8.3.6.6error和warning指令

8.4脚本文件和函数文件

8.4.1M脚本文件

8.4.2M函数文件

8.4.3局部变量和全局变量

8.4.4M文件的一般结构

【*例8.4.4-1】M函数文件示例。

[circle.m]

function sa = circle(r,s)

%CIRCLE plot a circle of radii r in the line specified by s. % r 指定半径的数值

% s 指定线色的字符串

% sa 圆面积

%

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

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

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

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

% 编写于1999年4月7日,修改于1999年8月27日。

if nargin>2

error('输入宗量太多。');

end;

if nargin==1

s='b';

end;

clf;

t=0:pi/100:2*pi;

x=r*exp(i*t);

if nargout==0

plot(x,s);

else

sa=pi*r*r;

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

end

axis('square')

8.4.5P码文件

8.4.5.1语法分析过程和伪代码

8.4.5.2P码文件的预生成

8.4.5.3内存中P码文件的列表和清除

8.4.6MATLAB的搜索过程

8.5变量的检测传递和限权使用函数

8.5.1输入输出宗量检测指令

8.5.2“变长度”输入输出宗量

【*例8.5.2-1】变长度宗量使用示例。

(1)编写函数文件ringzy.m

[ringzy.m]

function varargout = ringzy(r,varargin)

%RINGZY Plot a ring and calculate the area of the ring.

% r 基圆半径

% 调用格式

% [x1,y1,x2,y2,s1,s2]=ringzy(r,r2,'PropertyName','PropertyValue',...)

% (1)无输出时,绘圆或环。

% (2)有输出时,不绘图。

% (x1,y1),(x2,y2)分别是两个圆的坐标点;

% s1是基圆面积;

% s2为正值时,表示内环面积;为负值时,表示外环面积。

vin=length(varargin);Nin=vin+1; %<11>

error(nargchk(1,Nin,nargin)) %检查输入变量数目是否合适

if nargout>6 %检查输出变量数目是否合适error('Too many output arguments')

end

t=0:pi/20:2*pi;x=r*exp(i*t);s=pi*r*r;

if nargout==0

switch Nin

case 1

plot(x,'b')

case 2

r2=varargin{1}; %<22> x2=r2*exp(i*t);

plot(x,'b');hold on ;plot(x2,'b');hold off

otherwise

r2=varargin{1}; %<26> x2=r2*exp(i*t);

plot(x,varargin{2:end});hold on %利用元胞数组设置对象属性 <28> plot(x2,varargin{2:end});hold off %利用元胞数组设置对象属性 <29> end;

axis('square')

else

varargout{1}=real(x);varargout{2}=imag(x); %<33> varargout{5}=pi*r*r;varargout{6}=[]; %<34> if Nin>1

r2=varargin{1}; %<36> x2=r2*exp(i*t);

varargout{3}=real(x2);varargout{4}=imag(x2); %<38> varargout{6}=pi*(r^2-r2^2); %<39> end;

end

(2)有输出情况:请读者自己用plot(x1,y1,x2,y2) 检验下列三个调用示例的运行结果。r1=1;r2=3;

[x1,y1,x2,y2,s1,s2]=ringzy(r1);

[x1,y1,x2,y2]=ringzy(r1,r2);

[x1,y1,x2,y2,s1,s2]=ringzy(r1,r2);

(3)无输出情况:为节省篇幅,在此给出三个调用示例。

r1=1;r2=0.6;

subplot(1,3,1),ringzy(r1,r2),

subplot(1,3,2),ringzy(r1,r2,'Marker','o')

subplot(1,3,3),ringzy(r1,r2,'LineWidth',5,'Color',[1 0.4 0])

8.5.3跨空间变量传递

8.5.3.1跨空间计算串表达式的值

【*例8.5.3.1-1】evalin运行机理与eval的异同。

(1)编写M函数文件

[evalinzzy.m]

function y1=evalinzzy(a,s)

t=(0:a)/a*2*pi;

y1=subevalinzzy(4,s);

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

function y2=subevalinzzy(a,s)

t=(0:a)/a*2*pi;ss='a*exp(i*t)';

switch s

case {'base','caller'}

y2=evalin(s,ss);

case 'self'

y2=eval(ss);

end

(2)在Notebook或MATLAB指令窗中运行以下指令

clear,a=30;t=(0:a)/a*2*pi;sss={'base','caller','self'};

for k=1:3

y0=evalinzzy(8,sss{k});

subplot(1,3,k)

plot(real(y0),imag(y0),'r','LineWidth',3),axis square image end

8.5.3.2跨空间赋值

【*例8.5.3.2-1】assignin运作机理示范。

(1)编写M函数文件

[assigninxyq.m]

function y=assigninxyq(x)

y=sqrt(x);t=x^2;

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

(2)在Notebbok 或MATLAB指令窗中运行以下指令

clear;x=4;y=assigninxyq(x);

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

4 2 16

8.5.4子函数和私用函数

8.5.4.1子函数

8.5.4.2私用函数

8.6串演算函数

8.6.1eval

【*例8.6.1-1】计算“表达式”串,产生向量值。

clear,t=pi;cem='[t/2,t*2,sin(t)]';y=eval(cem)

y =

1.5708 6.2832 0.0000

【*例8.6.1-2】计算“语句”串,创建变量。

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

theta =

1.5708

y =

1

Your variables are:

t theta y

【*例8.6.1-3】计算“替代”串。

A=ones(2,1);B=ones(1,3);c=eval('B*A','A*B'),errmessage=lasterr

c =

1 1 1

1 1 1

errmessage =

Error using ==> *

Inner matrix dimensions must agree.

【*例8.6.1-4】计算“合成”串。

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

for k=1:3

theta=pi*k/12;

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

end

y

y =

0.9659 0.8660 0.7071

8.6.2feval

【例8.6.2-1】feval 和eval 运行区别之一:feval的FN绝对不能是表达式。

x=pi/4;Ve=eval('1+sin(x)')

Ve =

1.7071

Vf=feval('1+sin(x)',x)

??? Cannot find function '1+sin(x)'.

【*例8.6.2-2】feval 和eval 调用区别:feval 的FN只接受函数名。本例两种方法以后者为好。randn('seed',1);A=rand(2,2);

[ue,de,ve]=eval('svd(A)');

disp('Results by eval');disp([ue,de,ve]);disp(blanks(1))

[uf,df,vf]=feval('svd',A);

disp('Results by feval');disp([uf,df,vf])

Results by eval

0.6180 0.7862 0.5516 0 0.4616 0.8871

0.7862 -0.6180 0 0.3038 0.8871 -0.4616

Results by feval

0.6180 0.7862 0.5516 0 0.4616 0.8871

0.7862 -0.6180 0 0.3038 0.8871 -0.4616

8.6.3内联函数

8.6.3.1内联函数的创建

8.6.3.2涉及内联函数性质的指令

8.6.3.3内联函数创建和应用示例

【*例8.6.3.3-1】演示:内联函数的第一种创建格式;使内联函数适于“数组运算”。clear,F1=inline('sin(rho)/rho') %第一种格式创建内联函数

F1 =

Inline function:

F1(rho) = sin(rho)/rho

f1=F1(2) %内联函数的一种使用方法

f1 =

0.4546

FF1=vectorize(F1) %产生适于“数组运算”的内联函数

xx=[0.5,1,1.5,2];ff1=FF1(xx)

FF1 =

Inline function:

FF1(rho) = sin(rho)./rho

ff1 =

0.9589 0.8415 0.6650 0.4546

【*例8.6.3.3-2】演示:第一种内联函数创建格式的缺陷;含向量的多宗量输入的赋值。

G1=inline('a*exp(x(1))*cos(x(2))'),G1(2,[-1,pi/3])

G1 =

Inline function:

G1(a) = a*exp(x(1))*cos(x(2))

??? Error using ==> inline/subsref

Too many inputs to inline function.

G2=inline('a*exp(x(1))*cos(x(2))','a','x'),G2(2,[-1,pi/3])

G2 =

Inline function:

G2(a,x) = a*exp(x(1))*cos(x(2))

ans =

0.3679

【*例8.6.3.3-3】演示:产生向量输入、向量输出的内联函数;这种向量函数的调用方法。Y2=inline('[x(1)^2;3*x(1)*sin(x(2))]')

argnames(Y2) %观察内联函数的输入宗量

Y2 =

Inline function:

Y2(x) = [x(1)^2;3*x(1)*sin(x(2))]

ans =

'x'

x=[4,pi/6]; %向量输入的赋值

y2=Y2(x) %获得向量输出

y2 =

16.0000

6.0000

【*例8.6.3.3-4】演示:最简练格式创建内联函数;内联函数可被feval 指令调用。

Z2=inline('P1*x*sin(x^2+P2)',2) %必须是大写字母P

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,不能写成 'Z2' 。

z2 =

2.6279

fz2 =

2.6279

8.7创建用户工具箱

8.7.1MATLAB对工具箱文件的管理特点

8.7.2建立用户工具箱须知

8.8调试和剖析

8.8.1直接调试法

8.8.2调试器的使用

8.8.2.1图形式调试器

8.8.2.2调试器应用示例

【*例8.8.2.2.-1】本例的目标:对于任意随机向量,画出鲜明标志该随机向量均值、标准差的频数直方图(如图8.8.2.2-1-1),或给出绘制这种图形的数据。

(1)根据题目要求写出以下两个M文件

[histzzy.m]

function [nn,xx,xmu,xstd]=histzzy(x)

xmu=mean(x);

xstd=std(x);

[nn,xx]=hist(x);

if nargout==0

barzzy(nn,xx,xmu,xstd) %<6> end

[barzzy.m]

function barzzy(nn,xx,xmu,xstd)

clf,

bar(xx,nn);hold on

Ylimit=get(gca,'YLim');

yy=0:Ylimit(2);

xxmu=xmu*size(yy);

xxL=xxmu/xmu*(xmu-xstd);

xxR=xxmu/xmu*(xmu+xstd);

plot(xxmu,yy,'r','Linewidth',3) %<9> plot(xxL,yy,'rx','MarkerSize',8)

plot(xxR,yy,'rx','MarkerSize',8),hold off

(2)初次运行以下指令后,得到运行出错的提示。

randn('seed',1),x=randn(1,100);histzzy(x);

??? Error using ==> plot

Vectors must be the same lengths.

Error in ==> E:\mat53\work\barzzy.m

On line 8 ==> plot(xxmu,yy,'r','Linewidth',3)

Error in ==> E:\MAT53\work\histzzy.m

On line 6 ==> barzzy(nn,xx,xmu,xstd)

(3)初步分析错误原因

(4)断点设置

(5)在指令窗中运行以下指令,进入“动态”调试

randn('seed',1),x=randn(1,100);histzzy(x);

图8.8.2.2-1-3 运行暂停在断点处(6)深入被调文件内部

图8.8.2.2-1-4 动态调试深入barzzy.m (7)连续执行,直到另一个断点

图8.8.2.2-1-5 变量值的鼠标观察法

(B)指令窗观察法

(9)修改程序,停止第一论调试,重新运行。

randn('seed',1),x=randn(1,100);histzzy(x);

8.8.3 M文件性能剖析

8.8.3.1M文件性能优化须知

8.8.3.2剖析器

【*例8.8.3.2-1】演示剖析指令的基本使用:对例8.8.2.2-1中那通过调试后运行正确的histzzy.m进行性能分析。

(1)产生剖析报告

randn('seed',1),x=randn(1,100);

profile on %启动剖析器,在mmex层面上统计数据

for kk=1:100;histzzy(x);end %运行100次,使统计数据受随机因素影响较小profile report histzzy_report %产生名为histzzy_report.htm的分析报告

图8.8.3.2-1-1 超文本形式剖析报告的Summary章的部分内容

(2)研究剖析报告

图8.8.3.2-1-2 从所得barzzy.m明细报告中剪辑的部分内容

(3)改进措施

8.9面向对象编程

8.9.1概念综述

8.9.1.1类和对象

8.9.1.2面向对象编程的内涵

8.9.2面向对象编程应用示例

【例8.9.2-1】本例演示:创建“先进先出”FIFO队列queue类的全过程。在本例中,读者应充分注意:构架域(Fields of a structure array)和定义在其上的方法函数(Method function)之间的关系。

(1)建立类目录 @queue

(2)选择构架数组为queue类的数据结构

(3)创建构造函数queue.m

[@queue\queue.m]

function q=queue(v)

%@QUEUE\QUEUE queue class constructor function

% 调用格式

% q=queue 创建一个"空"队列对象.

% q=queue(v) 创建包含变量v的队列对象。

superiorto('double','sparse','struct','cell','char','inline','sym');

% 使queue对象具有最高优先级<6>

if nargin>1;error('Too many arguments.');end;

if nargin==0 % 没有输入宗量情况

q.value=[]; % value 域被赋“空阵”

https://www.doczj.com/doc/14109311.html,=''; % name 域不给任何字符

q=class(q,'queue'); % 给变量 q 挂上queue标签

elseif isa(v,'queue'); % 输入宗量是同类对象情况

q=v; % 直接把输入量赋给 q

else % 非同类输入宗量情况

q.value=v; % 在 value 域中放置输入对象 v 的内容

https://www.doczj.com/doc/14109311.html,=inputname(1); % 在 name 域中放置输入对象名 v 字符

if isempty(https://www.doczj.com/doc/14109311.html,) % 假如输入量无名

https://www.doczj.com/doc/14109311.html,=['(' class(v) ')']; % 就采用 v 本身的类名

end

q=class(q,'queue'); % 给变量 q 挂上queue标签<20> end

(4)为queue对象编写显示函数display.m

[@queue\display.m]

function display(q,ki,kj)

%QUEUE\DISPLAY command window display of a queue object.

% 调用格式

% display(q) 笼统显示整个队列

% display(q,ki) 单下标法显示具体队列元素的内容

% display(q,ki,kj) 双下标法显示具体队列元素的内容

if nargin==0;error('缺少输入宗量,即被显示对象!');end

switch nargin

case 1 % 显示整个队列

[m,n]=size(q);

vname=inputname(1); % 被显示对象 q 的名称

if isempty(vname) % 显示对象若无名称

fprintf('ans=\n'); % 按MATLAB惯例,屏幕显示ans缺省名elseif fprintf('%s=\n',vname); % 对象有名称时,则屏幕以字符串形式显示名称end;

if isempty(q) % 假如被显示对象为“空”

fprintf(' [ empty ') %<17> fprintf('%s',class(q)) %<18> fprintf(' ]\n\n'); %<19> elseif m*n==1; % 被显示对象今包含一个“元素”时fprintf(' %s: ',https://www.doczj.com/doc/14109311.html,); % 屏幕先以字符串形式显示所存放对象的名称disp(q.value); % 紧接着,不换行,显示所存放对象的内容

fprintf('\n');

else % 被显示对象今包含多个“元素”时fprintf(' [ %d*%d ',m,n) % 以下3条指令只显示队列“元素”排列<25> fprintf('%s',class(q)) %<26> fprintf(' ]\n\n'); %<27> end

case 2 % 单下标法显示具体队列元素的内容

disp(['The content of ',inputname(1),'(',int2str(ki),')'])

disp(['is a ''',class(q(ki).value),''' object'])

fprintf(' %s=\n',q(ki).name);

disp(q(ki).value);

fprintf('\n');

case 3 % 双下标法显示具体队列元素的内容

disp(['The content of ',inputname(1),'(',int2str(ki),',',int2str(kj),')']) disp(['is a ''',class(q(ki,kj).value),''' object'])

fprintf(' %s=\n',q(ki,kj).name);

disp(q(ki,kj).value);

fprintf('\n');

end

(5)编写重载函数isempty.m

[@queue\isempty.m]

function f=isempty(q)

%@QUEUE\ISEMPTY True for an empty queue object.

f=0;

[m,n]=size(q);

if m*n==1;

if isempty(q.value) & isempty(https://www.doczj.com/doc/14109311.html,) %<6>

f=1;

end;

end;

(6)编写“入队”、“离队”函数

[ @queue\comein.m]

function q=comein(p,varargin)

% @QUEUE\COMEIN a variable comes to the end of a queue.

% 调用格式

% comein(p,a,b,...) 使输入宗量a,b等排在p之后形成新队列,

% 其名沿用p位置上的输入队列名.

% q=comein(p,a,b,...) 使输入宗量a,b等排在p之后形成新队列 q .

if nargin<2 error('comein needs at least two arguments.');end;

if ~isa(p,'queue') error([inputname(1),' is not a queue']);end;

q0=p;

qzzy=class(p); %获取第一输入宗量的类别字符串<10> for i=1:length(varargin)

temp=varargin{i};

s=eval([qzzy,'(temp)']); %使后来元素成为与第一输入宗量相同的类别<13> https://www.doczj.com/doc/14109311.html,=inputname(i+1);

if isempty(https://www.doczj.com/doc/14109311.html,) %假如某输入宗量本身无名称

https://www.doczj.com/doc/14109311.html,=['(' class(temp) ')']; %则把它的类别名作为名称使用end

if isempty(q0) %假如前队列是“空”队列

q0=s; %则直接进入队列

else %假如前队列非“空”

q0=[q0 s]; %则新变量排在队尾

end

end

if nargout==0; %假如没有输出宗量

assignin('caller',inputname(1),q0);%新队列沿用第一个输入队列名

evalin('caller',inputname(1));

else %假如有输入输出宗量

q=q0; %新队列名为q

end

[@queue\goout.m]

function [n,v,q]=goout(p)

% @QUEUE\GOOUT removes the first(the front) element from a queue.

% 调用格式

% goout(p) 从队列 p 中的第一个元素离队.

% v=goout(p) v 是从 p 队列中移出的那第一个元素的“值”

% [n,v]=goout(p) n,v 分别是从 p 队列中移出的那第一个元素的“名称”和“值”% [n,v,q]=goout(p) n,v 分别是从 p 队列中移出的那第一个元素的“名称”和“值”% q 是被移去第一个元素后的新队列

if nargin==0 ;error('No queue specifide.');end;

if nargout>3;error('Too many output arguments.');end;

if nargin>1 error('Too many input arguments.');end;

if ~isa(p,'queue');error([inputname(1),' is not a queue.']);end;

if isempty(p)

q1=p;

else

[m,n]=size(p);

v1=p(1).value;n1=p(1).name;

if m*n==1

q1=queue;

else

q1=p(2:end);

end

end

if nargout<3;

assignin('caller',inputname(1),q1);

end;

if nargout==0,

evalin('caller',inputname(1));

end

if nargout>=1;v=v1;end;

if nargout>=2;n=n1;end;

if nargout==3;q=q1;end;

【*例8.9.2-2】本例的目的:一,检验例8.9.2-1所编写的程序的正确性;二,演示所设计的新类是如何被运作的。

(1)创建一个队列对象,并显示。

qe='Hello! 你好!'; %字符串

Q=queue(qe) %生成队列对象Q,并显示

Q=

qe: Hello! 你好!

(2)类别检查和是否对象判断

class(Q) %类别检查

isobject(Q) %是否对象判断

isa(Q,'queue') %是否队列判断

ans =

queue

ans =

1

MATLAB经典数学建模教程

第 1 节Matlab 基本知识 一、Matlab 的主要功能 Matlab是一种功能非常强大的工程语言,诞生于20世纪70年代,1984年正式推向市场。2002年8月,Matlab6.5开始发布。是进行科学研究和产品开发必不可少的工具。 ●数值和符号计算 矩阵(数组)的四则运算(Matrix+Laboratory)、数值差分、导数、积分、求解微分方程、微分方程的优化等 ●数字图像、数字信号处理 ●工程和科学绘图 ●控制系统设计 ●财务工程 ●建模、仿真功能 二、Matlab 的界面 1.命令窗口(Command Window): Matlab各种操作命令都是由命令窗口开始,用户可以在命令窗口中输入Matlab命令,实现其相应的功能。此命令窗口主要包括文本的编辑区域和菜单栏(如:四则运算;“;”禁止显示变量的值;↑↓遍历以前的命令)。在命令窗口空白区域单击鼠标右键,打开快捷菜单,各项命令功能如下: Evaluate Selection :打开所选文本对应的表达式的值。 Open Selection :打开文本所对应的MatLab文件。 Cut :剪切编辑命令。 Paste :粘贴编辑命令。 2. M-文件编辑/调试(Editor/Debugger)窗口 Matlab Editor/Debugger窗口是一个集编辑与调试两种功能于一体的工具环境。 M-文件(函数文件) ●什么是M-文件:它是一种和Dos环境中的批处理文件相似的脚本文件,对于简单问题, 直接输入命令即可,但对于复杂的问题和需要反复使用的则需做成M-文件(Script File)。 ●创建M-文件的方法: Matlab命令窗的File/New/M-file。 在Matlab命令窗口运行edit。 ●M-文件的扩展名:*.m ●执行M-文件:F5 ●M文件的调试 选择Debug菜单,其各项命令功能如下: Step :逐步执行程序。 Step in :进入子程序中逐步执行调试程序。

MATLAB_M文件与M函数

M文件与M函数 Matlab输入命令的常用方式有两种:一种是直接在Matlab的命令窗门中逐条输入Matlab 命令;二是m文件工作方式。当命令行很简单时,使用逐条输入方式还是比较方便的。但当命令行很多时(比如说几十行乃至全成百上千行命令),显然再使用这种方式输入MATLAB 命令,就会显得杂乱无章,不易于把握程序的具体走向,并且给程序的修改和维护带来了很大的麻烦。这时,建议采用Matlab命令的第二种输入形式m文件工作方式。 m文件工作方式,指的是将要执行的命令全部写在一个文本文件中,这样既能使程序显得简洁明了,又便于对程序的修改与维护。m文件直接采用Matlab命令编写,就像在Matlab 的命令窗口直接输入命令一样,因此调试起来也十分方便,并且增强了程序的交互性。 m文件与其他文本文件一样,可以在任何文本编辑器中进打编辑、存储、修改和读取。利用m文件还可以根据白己的需要编写一些函数,这些函数也可以橡Matlab提供的函数一样进行调用。从某种意义上说,这也是对MATLAB的二次开发。 m文件有两种形式:一种是命令方式或称脚本方式;另一种就是函数文件形式。两种形式的文件扩展名均是.m。 1、M文件 当遇到输入命令较多以及要重复输入命令的情况时,利用命令文件就显得很方便了。将所有要执行的命令按顺序放到一个扩展名为.m的文本文件中,每次运行时只需在MATLAB 的命令窗口输入m文件的文件名就可以了。需要注意的是,m文件最好直接放在Matlab 的默认搜索路径下(一般是Matlab安装目录的子目录work中),这样就不用设置m文件的路径了,否则应当用路径操作指令path重新设置路径。另外,m文件名不应该与Matlab的内置函数名以及工具箱中的函数重名,以免发生执行错误命令的现象。Matlab对命令文件的执行等价于从命令窗口中顺序执行文件中的所有指令。命令文件可以访问Matlab工作空间里的任何变量及数据。命令文件运行过程中产生的所有变量都等价于从Matlab工作空间中创建这些变量。因此,任何其他命令文件和函数都可以自由地访问这些变量。这些变量一旦产生就一直保存在内存中,只有对它们重新赋值,它们的原有值才会变化。关机后,这里变量也就全部消失了。另外,在命令窗口中运行clear命令,也可以把这些变量从工作空间中删去。当然,在Matlab的工作空间窗口中也可以用鼠标选择想要删除的变量,从而将这些变量从工作空间中删除。 接下来,编写一个名为test.m的命令文件,用来计算矩阵1到100的和,并把它放到变量s中。 第一步创建新的M-文件。在Matlab主菜单上选择菜单命令File→New→M-File

一个简单的Matlab_GUI编程实例

Matlab GUI编程教程(适用于初学者) 1.首先我们新建一个GUI文件:如下图所示; 选择Blank GUI(Default) 2.进入GUI开发环境以后添加两个编辑文本框,6个静态文本框,和一个按钮,布置如下

图所示; 布置好各控件以后,我们就可以来为这些控件编写程序来实现两数相加的功能了。3.我们先为数据1文本框添加代码; 点击上图所示红色方框,选择edit1_Callback,光标便立刻移到下面这段代码的位置。 1. 2. 3.function edit1_Callback(hObject, eventdata, handles) 4.% hObject handle to edit1 (see GCBO) 5.% eventdata reserved - to be defined in a future version of MATLAB

6.% handles structure with handles and user data (see GUIDATA) 7.% Hints: get(hObject,'String') returns contents of edit1 as text 8.% str2double(get(hObject,'String')) returns contents of edit1 as a double 复制代码 然后在上面这段代码的下面插入如下代码: 1. 2.%以字符串的形式来存储数据文本框1的内容. 如果字符串不是数字,则现实空白内容input = str2num(get(hObject,'String')); %检查输入是否为空. 如果为空,则默认显示为0if (isempty(input)) set(hObject,'String','0')endguidata(hObject, handles); 复制代码 这段代码使得输入被严格限制,我们不能试图输入一个非数字。 4.为edit2_Callback添加同样一段代码 5 现在我们为计算按钮添加代码来实现把数据1和数据2相加的目的。 用3中同样的方法在m文件中找到pushbutton1_Callback代码段 如下; 1.function pushbutton1_Callback(hObject, eventdata, handles) 2.% hObject handle to pushbutton1 (see GCBO) 3.% eventdata reserved - to be defined in a future version of MATLAB 4.% handles structure with handles and user data (see GUIDATA) 复制代码

(整理)matlab实例教程-比较实用.

实验一特殊函数与图形 一、问题背景与实验目的 二、相关函数(命令)及简介 三、实验内容 四、自己动手 一、问题背景与实验目的 著名的Riemann函数大家都很熟悉了,但是关于它的图像你是否清楚呢除了最上面那几点,其他都很难画吧你想不想看看下面那些“挤在一起”的点是怎样分布的呢还有几何中的马鞍面、单叶双曲面等是怎样由直线生成的,是不是也想目睹一下呢这些,都离不开绘图. 实际上绘图一直是数学中的一种重要手段,借助图形,往往可以化繁为简,使抽象的对象得到明白直观的体现.比如函数的基本性质,一个图形常可以使之一目了然,非常有效.它虽不能代替严格的分析与证明,但在问题的研究过程中,可以帮助研究人员节约相当一部分精力.此外,它还可以使计算、证明、建模等的结果得到更明白易懂的表现,有时,这比科学论证更有说服力.同时,数学的教学与学习过程也离不开绘图.借助直观的图形,常可以使初学者更容易接受新知识.如数学分析中有不少函数,其解析式着实让人望而生畏,即使对其性质作了详尽的分析,还是感到难明就里;但如果能看到它的图形,再配合理论分析,则问题可以迎刃而解.又如在几何的学习中,会遇到大量的曲线与曲面,也离不开图形的配合. 传统的手工作图,往往费力耗时,效果也不尽理想.计算机恰恰弥补了这个不足,使你可以方便地指定各种视角、比例、明暗,从各个角度进行观察.本实验通过对函数的图形表示和几个曲面(线)图形的介绍,一方面展示它们的特点,另一方面,也将就Matlab软件的作图功能作一个简单介绍.大家将会看到,Matlab 的作图功能非常强大. 二、相关函数(命令)及简介 1.平面作图函数:plot,其基本调用形式: plot(x,y,s) 以x作为横坐标,y作为纵坐标.s是图形显示属性的设置选项.例如:x=-pi:pi/10:pi; y=sin(x); plot(x,y,'--rh','linewidth',2,'markeredgecolor','b','markerfac ecolor','g')

实验1Matlab基本操作M文件和流程控制语句+答案

实验1 Matlab基本操作、M文件和流程控制语句-答案 1、计算以下表达式的值,将结果按不同格式输出。掌握format命令的使用方法。(1) (2),其中 (3),其中 以(1)为例,其余类似。 (1)>> y=1.3^3*sin(pi/3)*sqrt(26) y = 9.7017 >> format long >> y=1.3^3*sin(pi/3)*sqrt(26) y = 9.70168931166114 >> format short e >> y=1.3^3*sin(pi/3)*sqrt(26) y = 9.7017e+000 >> format bank >> y=1.3^3*sin(pi/3)*sqrt(26) y = 9.70 >> format rat >> y=1.3^3*sin(pi/3)*sqrt(26) y = 2862/295 (2)>> format short >> x=[2 1+2*i;-0.45 5] x = 2.0000 1.0000 + 2.0000i -0.4500 5.0000 >> y=(1/2)*log(x+sqrt(1+x^2)) y = 0.7114 - 0.0253i 0.8968 + 0.3658i 0.2139 + 0.9343i 1.1541 - 0.0044i (3) >> format short >> x=-3:0.1:3; >> y=((exp(0.3*x)-exp(-0.3*x))/2).*sin(x+0.3)+log((0.3+x)/2) 2、已知: 求下列表达式的值: A+6*B和A-B+I

MATLAB 实用教程 课后习题答案

第二章 1.计算复数3+4i与5-6i的乘积。 a=3+4i b=5-6i c=a*b 2.构建结构体Students,属性包含Name、age和Email,数据包括{’Zhang’,18,*‘Zhang@16 https://www.doczj.com/doc/14109311.html,’,’Zhang@https://www.doczj.com/doc/14109311.html,’+}、{’Wang’,21,[]}和{’Li’,[],[]},构建后读取所有Name属性值,并且修改’Zhang’的Age属性值为19。 Students(1).Age=18 Students(1).Email='zhang@https://www.doczj.com/doc/14109311.html,','zhang@https://www.doczj.com/doc/14109311.html,' Students(2).Name='Wang' Students(2).Age=21 Students(2).Email=[] Students(3).Name='Li' Students(3).Age=[] Students(3).Email=[] https://www.doczj.com/doc/14109311.html, Student(1).Age(1)=19 Student.Age 3.用满矩阵和稀疏矩阵存储方式分别构造下属矩阵: A=[0 1 0 0 0;1 0 0 0 0;0 0 0 0 0;0 0 0 1 0] A=[0 1 0 0 0;1 0 0 0 0;0 0 0 0 0;0 0 0 1 0] S=sparse(A) S=sparse([2,1,4],[1,2,4],[1,1,1],4,5) 4.采用向量构造符得到向量[1,5,9....,41]. A=1:4:41 5.按水平和竖直方向分别合并下述两个矩阵:A=[1 0 0;1 1 0;0 0 1],B=[2 3 4;5 6 7;8 9 10] A=[1 0 0;1 1 0;0 0 1] B=[2 3 4;5 6 7;8 9 10] C=[A B] D=[A;B] 6.分别删除第五题两个结果的第2行。 A=[1 0 0;1 1 0;0 0 1] B=[2 3 4;5 6 7;8 9 10] C=[A B] D=[A;B] C(2,:)=[] D(2,:)=[] 7.分别将第5题两个结果的第2行最后3列的数值改为[11 12 13]。 A=[1 0 0;1 1 0;0 0 1] B=[2 3 4;5 6 7;8 9 10] C=[A B] D=[A;B]

matlab2007教程

第 1 章基础准备及入门本章有三个目的:一是讲述MATLAB正常运行所必须具备的基础条件;二是简明地介 绍MATLAB及其操作桌面Desktop的基本使用方法;三是全面介绍MATLAB的帮助系统。 本章的前两节讲述:MATLAB的正确安装方法和MATLAB 环境的启动。因为指令窗是MATLAB最重要的操作界面,所以本章用第 1.3、1.4 两节以最简单通俗的叙述、算例讲述指令窗的基本操作方法和规则。这部分内容几乎对MATLAB各种版本都适用。第1.5到第1.8节专门介绍MATLAB最常用的另五个交互界面:历史指令窗、当前目录浏览器、工作空间浏览器、数组编辑器、M文件编辑器。鉴于实际应用中,帮助信息和求助技能的重要性。本章专设第1.9节专门叙述MATLAB的帮助体系和求助方法。 作者建议:不管读者此前是否使用过MATLAB,都不要忽略本章。 1.1 MATLAB的安装和工具包选择 MATLAB只有在适当的外部环境中才能正常运行。因此,恰当地配置外部系统是保证MATLAB运行良好的先决条件。MATLAB本身可适应于许多机种和系统,如 PC机和 Unix 工作站等。但本节只针对我国使用最广的PC机系统给予介绍。 对PC机用户来说,常常需要自己安装MATLAB。MATLAB R2007a(即旧编号MATLAB7.4)版要求Win2000或WinXP平台。下面介绍从光盘上安装MATLAB的方法。一般说来,当MATLAB光盘插入光驱后,会自启动“安装向导”。假如自启动没有实现,那么可以在<我的电脑>或<资源管理器>中双击setup.exe应用程序,使“安装向导”启动。安装过程中出现的所有界面都是标准的,用户只要按照屏幕提示操作,如输入用户名、单位名、口令等就行。 在安装MATLAB.R2007a时,会出现一个界面,该界面上有两个选项:Typical和Custom。假如你不熟悉MATLAB,或假如你机器的硬盘的自由空间远大于3G,或假如你需要用到光盘上MATLAB的所有功能及工具包,那么你就点选“Typical”。否则,点选“Custom”。 在点选“Custom”后,会引出如图1.1-1的界面。你可以根据需要,在“Select products to install”栏中勾选相应的组件。注意:MATLAB软件光盘总包含很多工具包,它们有的是通用的,有的则专业性很强。对一般用户来说,完全不必采取全部安装,而应根据需要有所选择。否则将占据很多硬盘空间。表1.1-1对各组件的描述供用户选择时参考。

MATLAB中M文件例子

20.11 M文件例子 精通MATLAB工具箱含有许多实用函数,它们可以验证本章的许多概念。这些函数的基本部分已经在二维和三维图形这些章阐述过了。有了前面对句柄图形的讨论,我们现在可以更彻底地讨论这些函数。 最简单的精通MATLAB工具箱的函数之一提出了一个共同的问题。MATLAB函数gcf返回当前图形的句柄。但是,它有一个副作用。如果图形不存在,gcf就创建一个,并返回它的句柄。如果想寻找一个图形是否存在于头一个位置,要是没有,又不得不创建,怎么办?函数mmgcf正好实现由其内容所描述的工作。 function HF=mmgcf %MMGCF Get Current Figure if it Exists. % MMGCF returns the handle of the current figure if it exists. % If no current figure exists,MMGCF returns an empty handle. % % Note that the function GCF is different.It creates a figure and returns its handle if it does not % exist. % Copyright (c) 1996 by Prentice-Hall,Inc. Hf=get(0, ‘Children’ ); % check for figure children if isempty(Hf) return else Hf=get(0, ‘CurrentFigure’ ); end 函数mmgcf首先检查根对象的子对象的图形是否存在,如至少有一个图形对象时,根对象的‘CurrentFigure’属性就返回当前的图形。 函数mmgca为坐标轴对象执行同样的功能,如同在它的M文件内所描述的那样。 function Ha=mmgca %MMGCA Get Current Axes if it exists. % MMGCA returns the handle of the current axes if it exists. % If no current axes exists,MMGCA returns an empty handle. % % Note that the function GCA is diffent.It create a figure and an axes and returns the axes % handle if they do not exist. % Copyright (c) 1996 by Prentice-Hall,Inc.

Matlab基础教程

1-1、基本运算与函数 在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可。例如: >> (5*2+1.3-0.8)*10/25 ans =4.2000 MATLAB会将运算结果直接存入一变数ans,代表MATLAB运算後的答案(Answer)并显示其数值於萤幕上。 小提示: ">>"是MATLAB的提示符号(Prompt),但在PC中文视窗系统下,由於编码方式不同,此提示符号常会消失不见,但这并不会影响到MATLAB的运算结果。 我们也可将上述运算式的结果设定给另一个变数x: x = (5*2+1.3-0.8)*10^2/25 x = 42 此时MATLAB会直接显示x的值。由上例可知,MATLAB认识所有一般常用到的加(+)、减(-)、乘(*)、除(/)的数学运算符号,以及幂次运算(^)。 小提示: MATLAB将所有变数均存成double的形式,所以不需经过变数宣告(Variable declaration)。MATLAB同时也会自动进行记忆体的使用和回收,而不必像C语言,必须由使用者一一指定.这些功能使的MATLAB易学易用,使用者可专心致力於撰写程式,而不必被软体枝节问题所干扰。 若不想让MATLAB每次都显示运算结果,只需在运算式最後加上分号(;)即可,如下例: y = sin(10)*exp(-0.3*4^2);

若要显示变数y的值,直接键入y即可: >>y y =-0.0045 在上例中,sin是正弦函数,exp是指数函数,这些都是MATLAB常用到的数学函数。 下表即为MATLAB常用的基本数学函数及三角函数: 小整理:MATLAB常用的基本数学函数 abs(x):纯量的绝对值或向量的长度 angle(z):复数z的相角(Phase angle) sqrt(x):开平方 real(z):复数z的实部 imag(z):复数z的虚部 conj(z):复数z的共轭复数 round(x):四舍五入至最近整数 fix(x):无论正负,舍去小数至最近整数 floor(x):地板函数,即舍去正小数至最近整数 ceil(x):天花板函数,即加入正小数至最近整数 rat(x):将实数x化为分数表示 rats(x):将实数x化为多项分数展开

matlab入门教程文献

MATLAB入门教程 1.MATLAB的基本知识 1-1、基本运算与函数 在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之後,并按入Enter键即可。例如: >> (5*2+1.3-0.8)*10/25 ans =4.2000 MATLAB会将运算结果直接存入一变数ans,代表MATLAB运算後的答案(Answer)并显示其数值於萤幕上。 小提示:">>"是MATLAB的提示符号(Prompt),但在PC中文视窗系统下,由於编码方式不同,此提示符号常会消失不见,但这并不会影响到MATLAB的运算结果。 我们也可将上述运算式的结果设定给另一个变数x: x = (5*2+1.3-0.8)*10^2/25 x = 42 此时MATLAB会直接显示x的值。由上例可知,MATLAB认识所有一般常用到的加(+)、减(-)、乘(*)、除(/)的数学运算符号,以及幂次运算(^)。小提示:MATLAB将所有变数均存成double的形式,所以不需经过变数宣告(Variable declaration)。MATLAB同时也会自动进行记忆体的使用和回收,而不必像C语言,必须由使用者一一指定.这些功能使的MATLAB易学易用,使用者可专心致力於撰写程式,而不必被软体枝节问题所干扰。 若不想让MATLAB每次都显示运算结果,只需在运算式最後加上分号(;)即可,如下例: y = sin(10)*exp(-0.3*4^2); 若要显示变数y的值,直接键入y即可: >>y y =-0.0045 在上例中,sin是正弦函数,exp是指数函数,这些都是MA TLAB常用到的数学函数。 下表即为MATLAB常用的基本数学函数及三角函数: 小整理:MATLAB常用的基本数学函数 abs(x):纯量的绝对值或向量的长度 angle(z):复数z的相角(Phase angle) sqrt(x):开平方 real(z):复数z的实部 imag(z):复数z的虚部 conj(z):复数z的共轭复数 round(x):四舍五入至最近整数 fix(x):无论正负,舍去小数至最近整数 floor(x):地板函数,即舍去正小数至最近整数

matlab教程详解 (5)

第五章符号计算 符号计算的特点:一,运算以推理解析的方式进行,因此不受计算误差积累问题困扰;二,符号计算,或给出完全正确的封闭解,或给出任意精度的数值解(当封闭解不存在时);三,符号计算指令的调用比较简单,经典教科书公式相近;四,计算所需时间较长,有时难以忍受。 在MATLAB中,符号计算虽以数值计算的补充身份出现,但涉及符号计算的指令使用、运算符操作、计算结果可视化、程序编制以及在线帮助系统都是十分完整、便捷的。 MATLAB的升级和符号计算内核Maple的升级,决定着符号计算工具包的升级。但从用户使用角度看,这些升级所引起的变化相当细微。即使这样,本章还是及时作了相应的更新和说明。如MATLAB 6.5+ 版开始启用Maple VIII的计算引擎,从而克服了Maple V计算“广义Fourier变换”时的错误(详见第5.4.1节)。 5.1符号对象和符号表达式 5.1.1符号对象的生成和使用 【例5.1.1-1】符号常数形成中的差异 a1=[1/3,pi/7,sqrt(5),pi+sqrt(5)] % <1> a2=sym([1/3,pi/7,sqrt(5),pi+sqrt(5)]) % <2> a3=sym([1/3,pi/7,sqrt(5),pi+sqrt(5)],'e') % <3> a4=sym('[1/3,pi/7,sqrt(5),pi+sqrt(5)]') % <4> a24=a2-a4 a1 = 0.3333 0.4488 2.2361 5.3777 a2 = [ 1/3, pi/7, sqrt(5), 6054707603575008*2^(-50)] a3 = [ 1/3-eps/12, pi/7-13*eps/165, sqrt(5)+137*eps/280, 6054707603575008*2^(-50)] a4 = [ 1/3, pi/7, sqrt(5), pi+sqrt(5)] a24 = [ 0, 0, 0, 189209612611719/35184372088832-pi-5^(1/2)] 【例5.1.1-2】演示:几种输入下产生矩阵的异同。 a1=sym([1/3,0.2+sqrt(2),pi]) % <1> a2=sym('[1/3,0.2+sqrt(2),pi]') % <2> a3=sym('[1/3 0.2+sqrt(2) pi]') % <3> a1_a2=a1-a2 % a1 = [ 1/3, 7269771597999872*2^(-52), pi] a2 = [ 1/3, 0.2+sqrt(2), pi] a3 = [ 1/3, 0.2+sqrt(2), pi] a1_a2 =

MATLAB课程设计报告(绝对完整)

课程设计任务书 学生姓名:董航专业班级:电信1006班 指导教师:阙大顺,李景松工作单位:信息工程学院 课程设计名称:Matlab应用课程设计 课程设计题目:Matlab运算与应用设计5 初始条件: 1.Matlab6.5以上版本软件; 2.课程设计辅导资料:“Matlab语言基础及使用入门”、“Matlab及在电子信息课程中的应 用”、线性代数及相关书籍等; 3.先修课程:高等数学、线性代数、电路、Matlab应用实践及信号处理类相关课程等。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.课程设计内容:根据指导老师给定的7套题目,按规定选择其中1套完成; 2.本课程设计统一技术要求:研读辅导资料对应章节,对选定的设计题目进行理论分析, 针对具体设计部分的原理分析、建模、必要的推导和可行性分析,画出程序设计框图,编写程序代码(含注释),上机调试运行程序,记录实验结果(含计算结果和图表),并对实验结果进行分析和总结。具体设计要求包括: ①初步了解Matlab、熟悉Matlab界面、进行简单操作; ②MA TLAB的数值计算:创建矩阵矩阵运算、多项式运算、线性方程组、数值统计; ③基本绘图函数:plot, plot3, mesh, surf等,要求掌握以上绘图函数的用法、简单图形 标注、简单颜色设定等; ④使用文本编辑器编辑m文件,函数调用; ⑤能进行简单的信号处理Matlab编程; ⑥按要求参加课程设计实验演示和答辩等。 3.课程设计说明书按学校“课程设计工作规范”中的“统一书写格式”撰写,具体包括: ①目录; ②与设计题目相关的理论分析、归纳和总结; ③与设计内容相关的原理分析、建模、推导、可行性分析; ④程序设计框图、程序代码(含注释)、程序运行结果和图表、实验结果分析和总结; ⑤课程设计的心得体会(至少500字); ⑥参考文献(不少于5篇); ⑦其它必要内容等。 时间安排:1.5周(分散进行) 参考文献: [1](美)穆尔,高会生,刘童娜,李聪聪.MA TLAB实用教程(第二版) . 电子工业出版社,2010. [2]王正林,刘明.精通MA TLAB(升级版) .电子工业出版社,2011. [3]陈杰. MA TLAB宝典(第3版) . 电子工业出版社,2011. [4]刘保柱,苏彦华,张宏林. MA TLAB 7.0从入门到精通(修订版) . 人民邮电出版社,2010. 指导教师签名:年月日 系主任(或责任教师)签名:年月日

MatlabM文件编程

M文件及程序调试 本章详细讲解利用M语言进行编程的方法讲述的主要内容: 主程序文件 函数文件 M文件的调试

MATLAB的工作模式 (1)指令驱动模式 即在MATLABM命令行窗口下用户输入单行指令 时,MATLAB立即处理这条指令,并显示结果, 这就是MATLAB命令行方式。 缺点:命令行方式程序可读性差,而且不能存 储,当处理复杂问题和大量数据时很不方便。(2)M文件模式 将MATLAB语句构成的程序存储成以m为扩展名的 文件,然后再执行该程序文件,这种工作模式 称为程序文件模式。

M语言文件可以分为主程序文件和函数文件 一个M语言文件就是由若干MATLAB的命令组合在一起构成的。 M语言文件是标准的纯文本格式的文件,其文件扩展名为.m。 MATLAB提供了meditor编辑器编辑M文件 注意: (1)不可用汉字命名(若用汉字命名虽然可以打开M文件,但是编译运行时会出错); (2)文件名不可与MATLAB内置函数重名; (3)文件名不可以以数字命名。

主程序文件(脚本文件) 相当于C语言的主函数 主程序文件没有输入参数和输出参数。 执行主程序文件时,文件中的指令或者命令按照出现在脚本文件中的顺序依次执行。 主程序文件主要由注释行和代码行组成: M文件的注释行需要使用%,定义符注释定义符仅能影响一行代码 程序执行的结果将显示于命令窗中

函数文件(相当于C语言的子函数) 函数文件供主程序文件调用,必须指定函数名和输入输出参数,并由主程序文件中语句序列给出一系列操作,从而生成所需数据 函数文件格式一般包括以下部分: (1)函数定义行:表明该m文件包含一个函数,且为其定义函数名、输入参数和输出参数 function y=mean(x) (2)帮助信息:处在文件中的第二行,应该反 映该m文件概括性信息 %求平均值

MATLAB基础及应用教程

第4章程序设计 在前面我们已经看到,MATLAB不但可以在命令窗直接输入命令并运行,而且还可以生成自己的程序文件,这就是我们通常说的一类以M为后缀的M文件,本章我们就来研究这类文件的形成方法。 M文件可分分为两大类,一是命令式M文件(也称为脚本文件,script),二是函数式M 文件(function)。两类文件的区别在于: (1)命令式文件可以直接运行,函数式文件不能直接运行,只能调用。 (2)命令式文件运行时没有输入输出参量,函数式文件在调用时需要进行输入输出参量设置。 (3)命令式文件运行中可以调用工作空间的数据,运行中产生的所有变量为全局变量。 (4)函数式文件不能调用工作空间的数据,运行中产生的所有变量为局部变量。命令式文件运行中产生的所有变量为全局变量,可以调用和存储到工作空间的数据。 4.1 MATLAB的程序文件-M文件 4.1.1 脚本文件(Scripts) 当我们需要在命令窗进行大量的命令集合运行时,直接从命令窗口输入比较麻烦,这时就可以将这些命令集合存放在一个脚本文件(Scripts)中,运行时只需要输入其文件名就可以自动执行这些命令集合。需要注意的是,脚本文件运行所产生的变量都驻留在MATLAB 的工作空间中,同时脚本文件也可以调用工作空间中的数据。因此,脚本文件所涉及的变量是全局变量。前几章所涉及到的M文件都是这类脚本文件。 编辑一个脚本文件可以直接在命令窗口的左上角打开编辑窗进行编辑。 4.1.2 函数文件(function) 函数式文件(function)的构成 (1)函数定义行: Function [输出参量]=gauss(输入参量) (2): 完成函数的功能。 (3)函数说明。 (4)函数行注。 从上面构成的情况看,函数式文件实际上是完成输入参量与输出参量的转换,这样的转换是由函数文件名为gauss的文件来完成的。函数体的功能必须说明清楚输入参量与输出参量的关系。函数说明是用来解释该函数的功能的,函数行注是对程序行进行说明的。上面(1)和(2)是必须的。 【例4-1】分析下面函数文件。 %一个数列,任意项等于前两项之和,输入项数可以给出这个数列

北航 MATLAB教程答案(张志涌)

1 数字1.5e2,1.5e3 中的哪个与1500相同吗? 1.5e3 2 请指出如下5个变量名中,哪些是合法的? abcd-2 xyz_ 3 3chan a 变量 ABCDefgh 2、5是合法的。 3 在MATLAB 环境中,比1大的最小数是多少? 1+eps 4 设 a = -8 , 运行以下三条指令,问运行结果相同吗?为什么? w1=a^(2/3) w2=(a^2)^(1/3) w3=(a^(1/3))^2 w1 = -2.0000 + 3.4641i ;w2 = 4.0000 ;w3 =-2.0000 + 3.4641i 5 指令clear, clf, clc 各有什么用处? clear 清除工作空间中所有的变量。 clf 清除当前图形。clc 清除命令窗口中所有显示。 第二章 1 说出以下四条指令产生的结果各属于哪种数据类型,是“双精度”对象,还是“符号”符号对象? 3/7+0.1双; sym(3/7+0.1)符; sym('3/7+0.1') 符;; vpa(sym(3/7+0.1)) 符; 2 在不加专门指定的情况下,以下符号表达式中的哪一个变量被认为是自由符号变量. sym('sin(w*t)'),sym('a*exp(-X)'),sym('z*exp(j*th)') symvar(sym('sin(w*t)'),1) w a z 3 (1)试写出求三阶方程05.443 =-x 正实根的程序。注意:只要正实根,不要出现其他根。 (2)试求二阶方程022=+-a ax x 在0>a 时的根。 (1)reset(symengine) syms x positive solve(x^3-44.5) ans = (2^(2/3)*89^(1/3))/2 (2)求五阶方程02 2 =+-a ax x 的实根 syms a positive %注意:关于x 的假设没有去除 solve(x^2-a*x+a^2) Warning: Explicit solution could not be found. > In solve at 83 ans = [ empty sym ] syms x clear syms a positive solve(x^2-a*x+a^2) ans = a/2 + (3^(1/2)*a*i)/2 a/2 - (3^(1/2)*a*i)/2 4 观察一个数(在此用@记述)在以下四条不同指令作用下的异同。 a =@, b = sym( @ ), c = sym( @ ,' d ' ), d = sym( '@ ' ) 在此,@ 分别代表具体数值 7/3 , pi/3 , pi*3^(1/3) ;而异同通过vpa(abs(a-d)) , vpa(abs(b-d)) , vpa(abs(c-d))等来观察。 ● 理解准确符号数值的创建法。 ● 高精度误差的观察。 (1)x=7/3 x=7/3;a=x,b=sym(x),c=sym(x,'d'),d=sym('7/3'),

(Matlab)SVM工具箱快速入手简易教程

SVM工具箱快速入手简易教程(by faruto) 一. matlab 自带的函数(matlab帮助文件里的例 子)[只有较新版本的matlab中有这两个SVM的函数] ===== svmtrain svmclassify =====简要语法规则==== svmtrain Train support vector machine classifier Syntax SVMStruct = svmtrain(Training, Group) SVMStruct = svmtrain(..., 'Kernel_Function', Kernel_FunctionValue, ...) SVMStruct = svmtrain(..., 'RBF_Sigma', RBFSigmaValue, ...) SVMStruct = svmtrain(..., 'Polyorder', PolyorderValue, ...) SVMStruct = svmtrain(..., 'Mlp_Params', Mlp_ParamsValue, ...) SVMStruct = svmtrain(..., 'Method', MethodValue, ...) SVMStruct = svmtrain(..., 'QuadProg_Opts', QuadProg_OptsValue, ...) SVMStruct = svmtrain(..., 'SMO_Opts', SMO_OptsValue, ...) SVMStruct = svmtrain(..., 'BoxConstraint', BoxConstraintValue, ...) SVMStruct = svmtrain(..., 'Autoscale', AutoscaleValue, ...) SVMStruct = svmtrain(..., 'Showplot', ShowplotValue, ...) --------------------- svmclassify Classify data using support vector machine Syntax Group = svmclassify(SVMStruct, Sample) Group = svmclassify(SVMStruct, Sample, 'Showplot', ShowplotValue) ============================实例研究==================== load fisheriris %载入matlab自带的数据[有关数据的信息可以自己到UCI查找,这是UCI的经典数据之一],得到的数据如下图:

实验一、MATLAB基本操作和M文件的编写及调试.

实验一、MATLAB基本操作和M文件的编写及调试 一、实验目的 1、熟悉MATLAB环境。 2、掌握MATLAB矩阵输入、运算以及元素运算和矩阵运算的区别。 3、熟悉MATLAB中M文件的编辑环境; 4、掌握MATLAB中M文件的编写与调试; 5、熟悉MATLAB中基本程序语句的使用; 二、预习要求 1、矩阵的基本运算法则以及矩阵转置、逆矩阵、线性方程组的求解问题等基本概念。 2、If、for、while以及switch语句的用法。 3、子程序的调用。 三、实验内容 1、利用help命令,查找plot、stem和*、.*等的帮助文件。同时在命令窗口中运行demo 命令,运行有关通信、信号处理的演示。 2、以及输入D=[1,4,7;8,5,2,;3,6,0],计算Z=D^3,D.^3,Z=3.^D,掌握元素运算和矩阵 运算的区别。 3、输入X=[-1 0 1],计算Y=X-1,l=length(X),pi*X,X*Y',Y'*X,验证矩阵的左乘与 右乘不相等。 4、输入A=[1,2,3;4,5,6],B=[2,4,0;1,3,5],D=[1,4,7;8,5,2,;3,6,0] ,计算D\A',A/D,掌握矩阵 的左除与右除的含义。 5、在命令窗口中输入edit命令,观察M文件编辑器的组成及各部分功能。 6、自行编写函数,定义全局变量及局部变量,并进行访问,观察全局变量与局部变量 的区别。 7、编写M文件试用input函数的功能: 8、请编写一个判断数据(整数)奇偶性的函数。 四、实验报告要求 1、写清学号、姓名、班级及实验名称; 2、简练描述MATLAB的窗口组成,它可以编辑哪些文件,这些文件的作用是什么。 3、简略写出实验内容的操作步骤及运行结果。 五、思考题 1、MATLAB中元素运算和矩阵运算的区别是什么? 2、矩阵的左除与右除的含义是什么? 3、MATLAB中M文件的编写与调试的过程是什么? 4、MATLAB中基本程序语句的如何使用? 六、注意事项

#【Matlab 简易教程】第八章 M文件和面向对象编程

Matlab 简易教程 8 M 文件和面向对象编程 假如读者想灵活运用MATLAB 去解决实际问题,想充分调动MATLAB ——科学技术资源,想理解MATLAB 版本升级所依仗的基础,那么本章内容将十分有用。 本章将涉及比较深层的MATLAB 内容:脚本;函数(一般函数、内联函数、子函数、私用函数、方法函数);程序调试和剖析;数据结构(类、对象);重载和继承;面向对象编程。本章配备了许多精心设计的算例。这些算例是完整的,可直接演练的。读者通过这些算例,将真切感受到抽象概念的内涵、各指令间的协调,将从感知上领悟到面向对象编程的优越和至关要领。 8.1 入门 【*例8.1-1】通过M 脚本文件,画出下列分段函数所表示的曲面。 ??? ????-≤+≤+<->+=+-------15457.0117575.015457.0),(215.175.375.0216215.175.375.021121222 12212 122x x e x x e x x e x x p x x x x x x x x (1)编写M 脚本文件的步骤 图 8.1-1-1 MATLAB Editor/Debugger 窗口 点击MATLAB 指令窗工具条上的New File 图标 ,就可打开如图8.1-1-1所示的 MATLAB 文件编辑调试器MATLAB Editor/Debugger 。其窗口名为untitled ,用户即可在空白窗口中编写程序。比如输入如下一段程序 [zx81.m] %zx81.m This is my first example. <1> a=2;b=2; % <2> clf; x=-a:0.2:a;y=-b:0.2:b; for i=1:length(y) for j=1:length(x) if x(j)+y(i)>1 z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2-1.5*x(j)); elseif x(j)+y(i)<=-1 z(i,j)=0.5457*exp(-0.75*y(i)^2-3.75*x(j)^2+1.5*x(j));

Matlab2012教程--经典教程

第1章基础准备及入门 1.1 最简单的计算器使用法 为易于学习,本节以算例方式叙述,并通过算例归纳一些MATLAB最基本的规则和语 法结构。建议读者,在深入学习之前,先读一读本节。 2 【例1.3-1】求[122(74)]3的算术运算结果。本例演示:最初步的指令输入形式 和必需的操作步骤。 (1)用键盘在MA TLAB指令窗中输入以下内容 >> (12+2*(7-4))/3^2 (2)在上述表达式输入完成后,按[Enter] 键,该指令被执行,并显示如下结果。 ans = 2 〖说明〗 本例在指令窗中实际运行的情况参见图 1.3-1。 指令行“头首”的“>>”是“指令输入提示符”,它是自动生成的。本书在此后的输入指令前将不再带提示符“>>”。理由是:(A)为使本书简洁;(B)本书用MATLAB 的M-book写成,而在M-book中运行的指令前是没有提示符的。 5

MATLAB的运算符(如+、- 等)都是各种计算程序中常见的习惯符号。 一条指令输入结束后,必须按[Enter] 键,那指令才被执行。 由于本例输入指令是“不含赋值号的表达式”,所以计算结果被赋给MATLAB的一个默认变量“ans”。它是英文“answer”的缩写。 【例1.3-2】“续行输入”法。本例演示:或由于指令太长,或出于某种需要,输入指令行必 须多行书写时,该如何处理。 S=1-1/2+1/3-1/4+ ... 1/5-1/6+1/7-1/8 S = 0.6345 〖说明〗 MA TLAB用3个或3个以上的连续黑点表示“续行”,即表示下一行是上一行的继续。 本例指令中包含“赋值号”,因此表达式的计算结果被赋给了变量S。 指令执行后,变量S被保存在MA TLAB 的工作空间(Workspace)中,以备后用。如果用户不用clear 指令清除它,或对它重新赋值,那么该变量会一直保存在工作空间中, 直到本MATLAB 指令窗被关闭为止。 1.3.3数值、变量和表达式 前节算例只是表演了“计算器”功能,那仅是MA TLAB全部功能中小小一角。为深入 学习MA TLAB,有必要系统介绍一些基本规定。本节先介绍关于变量的若干规定。 一数值的记述 MATLAB的数值采用习惯的十进制表示,可以带小数点或负号。以下记述都合法。 3 -99 0.001 9.456 1.3e-3 4.5e33 在采用IEEE浮点算法的计算机上,数值通常采用“占用64位内存的双精度”表示。 其相对精度是eps (MATLAB的一个预定义变量),大约保持有效数字16位。数值范围大308308 致从10到10。 二变量命名规则 变量名、函数名是对字母大小写敏感的。如变量myvar和MyVar表示两个不同的变量。 sin是MATLAB定义的正弦函数名,但SIN,Sin等都不是。 变量名的第一个字符必须是英文字母,最多可包含63个字符(英文、数字和下连符)。 如myvar201是合法的变量名。 变量名中不得包含空格、标点、运算符,但可以包含下连符。如变量名my_var_201是合法的,且读起来更方便。而my,var201由于逗号的分隔,表示的就不是一个变量名。 6

相关主题
文本预览
相关文档 最新文档