第二种调用格式的执行机理是:先从所在函数空间获得变量值,用eval(‘expression1’)计算原串表达式;若该计算失败,则再从'workspace'指定的(基本或主调函数)得变量值。再通过eval('expression2')计算替代串表达式。
20.4 一个M函数文件包含多个函数
1、 一个 M 文件可以包含一个以上的函数,一个主函数(Primary Function),其它为子函数(Subfunctions) 2、 主函数必需出现在最上方 3、 其后接上任意数目的子函数 4、 子函数的次序并无任何限制
5、 子函数只能被同文件中的函数(主函数或子函数)调用,但不可被不同文件的其它函数调用 6、 保存时所用函数文件名与主函数定义名相同。外部程序只能调用主函数。
7、 在M函数文件中,任何指令通过“名字”对函数进行调用时,子函数的优先级仅次于内装函数。
8、 同一文件的主函数、子函数的工作空间都是彼此独立的。各函数间的信息,或通过输入输出宗量传递,或通过
全局变量传递,或通过跨空间指令传递。
私用函数,是指位于private目录上的M文件函数。
1 私用函数的构造与普通M函数完全相同。
2 私用函数只能被private目录的直接父目录上的M函数文件所调用。它不能被其他目录上的任何M函数、M脚本文件或MATLAB指令窗中的命令所调用,也不能被直接父目录上的M脚本文件调用。
3 M文件中,任何指令通过“名字”对函数进行调用时,私用函数的优先级虽低于内装函数和子函数,但高于其他任何目录上的函数。
20.5 串演算函数
指令、表达式、语句,以及由它们综合组成的M文件,是用户为达到自己计算目的时所最常用的形式。为提高计算的灵活性,MATLAB还提供两种演算函数:一种是“串演算函数”eval,它具有对字符串表达式进行计算的能力;另一种是“函数句柄演算函数”feval,它具有对函数句柄进行操作的能力。
y=eval(‘CEM) 执行CEM指定的计算。
[y1,y2,?]=eval(‘CEM’) 执行对CEM代表的函数文件调用,并输出计算结果。 1 eval指令的输入宗量必须是字符串。
2 构成字符串的CEM,可以是MATLAB任何合法的指令、表达式、语句或M文件名。 3 第二种格式中的CEM只能是(包含输入宗量在内的)M函数文件名。
feval
[y1,y2,?]=feval(FH,arg1,arg2,?) %执行函数句柄FH指定的计算。
[y1,y2,?]=feval(FN,arg1,arg2,?) %执行函数名字符串FN指定的计算。 [y1,y2,?]=feval(FIL,arg1,arg2,?) %执行内联函数FIL指定的计算。
1 第一种调用格式是MATLAB6.0版引入的新格式。其中FN是函数句柄。它用@或str2func专门创建。 2 第二种调用格式是“老格式”,目前仍能使用,但建议尽量少用或不用该格式。其中FN取“带单引号的MATLAB内装函数名或M函数文件名”。
3 第三种调用格式仅对内联函数对象使用。
4 三种调用格式中的 arg1,arg2,?是传给函数的参数。它们的含义及排列次序均由与“被计算函数的输入宗量含义及次序”一致。
46
5 feval与函数句柄配套使用;而eval与字符串配套使用。
6 MATLAB中的泛函指令(如fzero,ode45,explot等)都借助feval构成。
21 数据传递
‘base’ workspace中的变量要传给子函数,两种途径:形参、global variable
子函数中的变量要传到’base’ workspace,3种途径:返回值、global variable、assignin
21.1 Matlab支持不确定个数的形参,但输入个数得比原型形参个数少
’nargin’是用来描述输入变量的个数的。
22 频谱分析
频谱分析的一个例子
figure(11) hua_fft(slipSpeed_sum,fs,1); title('slipSpeed_sum frequency spectrum') Fs = 1000; % Sampling frequency T = 1/Fs; % Sample time L = 1000; % Length of signal t = (0:L-1)*T; % Time vector % Sum of a 50 Hz sinusoid and a 120 Hz sinusoid x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); y = x + 2*randn(size(t)); % Sinusoids plus noise figure(1) plot(Fs*t(1:50),y(1:50)) title('Signal Corrupted with Zero-Mean Random Noise') xlabel('time (milliseconds)') NFFT = 2^nextpow2(L); % Next power of 2 from length of y Y = fft(y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2); % Plot single-sided amplitude spectrum. figure(2) plot(f,2*abs(Y(1:NFFT/2))) 47
title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)') ylabel('|Y(f)|') 一个简单的例子 Fs = 1000; % Sampling frequency T = 1/Fs; % Sample time L = 500000; % Length of signal t = (0:L-1)*T; % Time vector,只在画figure(1)的时候有用 y = sin(t); % Sinusoids figure(1) plot(t,y) title('Signal Corrupted with Zero-Mean Random Noise') xlabel('time (milliseconds)') NFFT = 2^nextpow2(L); % Next power of 2 from length of y Y = fft(y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2); % Plot single-sided amplitude spectrum. figure(2) plot(f,2*abs(Y(1:NFFT/2))) title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)') ylabel('|Y(f)|')
48