matlab M文件和面向对象编程

一.matlab控制流

1.for循环结构: 

for i=1:10;

x(i)=i;

end;

x

x =

1 2 3 4 5 6 7 8 9 10

2.while循环结构:

  Fibonacci数组的元素满足Fibonacci 规则,现要求该数组中第一个大于10000的元素。

a(1)=1;a(2)=1;i=2;

while a(i)<=10000

a(i+1)=a(i-1)+a(i);

i=i+1;end;

i,a(i)

i =

21

ans =

10946

3.if-else-end分支结构

cost=10;number=12;

if number>8

sums=number*0.95*cost;

end,sums

sums =

114.0000

用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

4.switch-case结构:学生的成绩管理,用来演示switch 结构的应用

clear;

%

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);

%

S=struct(\'Name\',Name,\'Marks\',Mark,\'Rank\',Rank);

%

for i=1:5

switch S(i).Marks

case 100

S(i).Rank=\'满分\';

case a

S(i).Rank=\' 优秀\';

case b

S(i).Rank=\' 良好\';

case c

S(i).Rank=\' 及格\';

otherwise

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 满分

5.try-catch结构:对(3× 3)魔方阵的行进行援引,当“行下标”超出魔方阵的最大行数时,将改向对最后一行的援引,并显示“出错”警告。

clear,N=4;A=magic(3);

try

A_N=A(N,:)

catch

A_end=A(end,:)

end

lasterr

A_end =

4 9 2

ans =

Index exceeds matrix dimensions.

二.跨空间变量传递

1.跨空间计算串表达式的值:(A)编写绘制正多边形或圆的程序。(B)子函数与(母)函数的关系。(C)各种不同的工作空间。(D)evalin 运行机理与eval 的异同。

(1)

[exm070531_1.m]

function y1=exm070531_1(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)

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

for k=1:3

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

subplot(1,3,k)

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

end

2.跨空间赋值:assignin 运作机理示范。

(1)

[exm070532_1.m]

function y=exm070532_1(x)

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

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

(2)

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

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

x y yy

4 2 16

三.串演算函数

1.eval

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

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

y =

1.5708 6.2832 0.0000

【例 7.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

【例 7.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.

【例 7.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

2.feval

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

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

Ve =

1.7071

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

??? Error using ==> feval

Invalid function name \'1+sin(x)\'.

【例 7.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.9193 -0.3936 1.2212 0 -0.7897 -0.6135

-0.3936 0.9193 0 0.2633 -0.6135 0.7897

Results by feval

-0.9193 -0.3936 1.2212 0 -0.7897 -0.6135

-0.3936 0.9193 0 0.2633 -0.6135 0.7897

3.内联函数

【例 7.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

【例 7.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

【例 7.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

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

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