一、特殊函数
匿名函数
匿名函数没有函数名,也不是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)