matlab中length博客,MATLAB自学笔记(十三):MATLAB编程基础4

一、特殊函数

匿名函数

匿名函数没有函数名,也不是M文件,他只包含一个表达式与输出结果,类似于C中的define。创建方法如下

Python

f = @(input1,input2,..) expression

1

f=@(input1,input2,..)expression

f为创建的函数句柄。函数句柄是一种间接访问函数的途径可以使用户调用函数的过程变得简单,且可以在执行函数时保存相关信息

Python

>> Fxy = @(x,y) x.^y+3*x*y

Fxy =

@(x,y)x.^y+3*x*y

>> Fxy(2,5)

ans =

62

1

2

3

4

5

6

7

8

9

10

11

>>Fxy=@(x,y)x.^y+3*x*y

Fxy=

@(x,y)x.^y+3*x*y

>>Fxy(2,5)

ans=

62

子函数

在同一个M文件中,写入了多个函数的情况

第一个出现的函数为主函数,该文件中其他函数为子函数

保存文件时文件名应于主函数相同,且外部程序只能调用主函数

子函数只能被当前M文件中主函数或子函数调用

同一M文化的主函数、子函数的工作区都是彼此独立的。各个函数间的信息传递可以通过输入输出变量、全局变量或跨空间变量指令来实现

lookfor、help等指令不能用来获取M文件的子函数信息

举例如下,创建TEMP.m文件,写入如下程序

Python

function f = TEMP(n)

A = 1; w = 2; phi = pi/2;

signal = createsig(A,w,phi);

f = signal.^n;

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

function signal = createsig(A,w,phi)

x = 0 : pi/10 : pi*2;

signal = A * sin(w * x + phi);

1

2

3

4

5

6

7

8

functionf=TEMP(n)

A=1;w=2;phi=pi/2;

signal=createsig(A,w,phi);

f=signal.^n;

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

functionsignal=createsig(A,w,phi)

x=0:pi/10:pi*2;

signal=A*sin(w*x+phi);

点击运行,输入3

Python

>> TEMP(3)

ans =

1 至 15 列

1.0000 0.5295 0.0295 -0.0295 -0.5295 -1.0000 -0.5295 -0.0295 0.0295 0.5295 1.0000 0.5295 0.0295 -0.0295 -0.5295

16 至 21 列

-1.0000 -0.5295 -0.0295 0.0295 0.5295 1.0000

1

2

3

4

5

6

7

8

9

10

11

>>TEMP(3)

ans=

1至15列

1.00000.52950.0295-0.0295-0.5295-1.0000-0.5295-0.02950.02950.52951.00000.52950.0295-0.0295-0.5295

16至21列

-1.0000-0.5295-0.02950.02950.52951.0000

私有函数与私有目录

私有函数是指私有目录private下的M函数文件,其主要性质为

私有函数的构造与普通M文件完全一致

调用:私有函数只能被private直接父目录下的M文件调用

在M文件中,任何指令通过‘名称’对函数进行调用时,私有函数的优先级仅次于MATLAB内置函数与子函数

lookfor、help等指令不能显示一个私有函数文件的任何信息

二、重载函数

重载是计算机编程中非常重要的概念,常被用来处理功能类似,但变量属性不同的函数

用户可以编写两个同名但是传递参数数据类型不同的函数。当调用时,MATLAB会自动匹配参数数据类型,然后选择函数

三、eval函数与feval函数

eval函数

eval函数可以与文本变量一起用,实现有利的文本宏工具

eval(s):为使用MATLAB的注释器求表达式的值或包含文本字符串s的语句

举例如下,本例程共展示了eval分别计算4种不同类型的语句字符串

‘表达式’字符串

‘指令语句’字符串

‘备选指令语句’字符串

‘组合’字符串

Python

array = 1:5;

string = '[array*2; array/2; 2.^array]';

output = eval(string)

theta = pi;

eval('output = exp(sin(theta))')

matrix = magic(3)

array = eval('matrix(5,:)','matrix(3,:)')

expression = {'zeros','ones','rand','magic'};

num = 2;

output = [];

for i = 1 : length(expression)

output = [output eval([expression{i},'(',num2str(num),')'])];

end

output

>> TEMP

output =

2.0000    4.0000    6.0000    8.0000   10.0000

0.5000    1.0000    1.5000    2.0000    2.5000

2.0000    4.0000    8.0000   16.0000   32.0000

output =

1.0000

matrix =

8     1     6

3     5     7

4     9     2

array =

4     9     2

output =

0         0    1.0000    1.0000    0.6557    0.8491    1.0000    3.0000

0         0    1.0000    1.0000    0.0357    0.9340    4.0000    2.0000

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

array=1:5;

string='[array*2; array/2; 2.^array]';

output=eval(string)

theta=pi;

eval('output = exp(sin(theta))')

matrix=magic(3)

array=eval('matrix(5,:)','matrix(3,:)')

expression={'zeros','ones','rand','magic'};

num=2;

output=[];

fori=1:length(expression)

output=[outputeval([expression{i},'(',num2str(num),')'])];

end

output

>>TEMP

output=

2.0000  4.0000  6.0000  8.0000  10.0000

0.5000  1.0000  1.5000  2.0000  2.5000

2.0000  4.0000  8.0000  16.0000  32.0000

output=

1.0000

matrix=

8   1   6

3   5   7

4   9   2

array=

4   9   2

output=

0     0  1.0000  1.0000  0.6557  0.8491  1.0000  3.0000

0     0  1.0000  1.0000  0.0357  0.9340  4.0000  2.0000

feval函数

[y1, y2, …] = feval(‘FN’, arg1, arg2, …)

该指令的功能为用变量arg1,arg2,…来执行FN函数指定的计算

说明:

在此,FN为函数名,不能是表达式

在eval和feval函数通用的情况下,feval比eval的执行效率高

feval函数主要用来构造‘泛函’型M函数文件

Python

j = sqrt(-1);

z = exp(j*(-pi:pi/100:pi));

eval('plot(z)')

set(gcf,'units','normalized','position',[0.2, 0.3, 0.2, 0.2])

title('Results by eval'); axis('square')

figure

set(gcf,'units','normalized','position',[0.2, 0.3, 0.2, 0.2])

feval('plot',z)

title('Results by feval'); axis('square')

1

2

3

4

5

6

7

8

9

j=sqrt(-1);

z=exp(j*(-pi:pi/100:pi));

eval('plot(z)')

set(gcf,'units','normalized','position',[0.2,0.3,0.2,0.2])

title('Results by eval');axis('square')

figure

set(gcf,'units','normalized','position',[0.2,0.3,0.2,0.2])

feval('plot',z)

title('Results by feval');axis('square')

四、向量化和预分配

向量化

要想让MATLAB最高速的工作,则需要把M文件中的算法向量化

其他语言一般使用for或do, MATLAB则是由向量或矩阵

Python

x = 0.01;

for k = 1:1001

y(k) = log10(x);

x = x+0.01;

end

x = 0.01 : 0.01 : 10;

y = log10(x)

1

2

3

4

5

6

7

8

x=0.01;

fork=1:1001

y(k)=log10(x);

x=x+0.01;

end

x=0.01:0.01:10;

y=log10(x)

预分配

若一条代码不能向量化,则可以通过预分配输出结果空间,来保存其中的向量或数组,用来加快for循环

Python

r = zeros(32,1);

for n = 1:32

r(n) = rank(magic(n));

end

1

2

3

4

r=zeros(32,1);

forn=1:32

r(n)=rank(magic(n));

end

五、函数的函数

一个以标量为变量的非线性函数称为‘函数的函数’,即以函数名为自变量的函数

这类函数包括求零点、最优化、求积分、常微分方程等

赞赏作者

喜欢 (0)or分享 (0)

你可能感兴趣的:(matlab中length博客)