目录
4.3 参数传递函数
matlab中的参数传递是传值传递,传入的实际变量赋值为形式参数指定的变量名,储存在函数中,与工作区变量空间彼此独立。每个函数调用都有独立的函数空间。
4.3.1 输入和输出参数的数目
通过natgin和nargout函数,确定调用时实际传递的输入和输出参数情况。
function [n1,n2]=mythe(m1,m2)
if nargin==1
n1=m1;
if nargout==2
n2=m1;
end
else
if nargout==1
n1=m1+m2;
else
n1=m1;
n2=m2;
end
end
4.3.2 可变数目的参数传递
使用varargin和varargout函数实现可变参数的参数传递,将函数调用时传递的参数封装成一个元胞数组。
function y=myth(x)
a=0;
for i=1:1:length(x)
a=a+mean(x(i));
end
y=a/length(x);
4.3.3返回被修改的输入参数
matlab函数具有独立于工作区之外的变量空间,因此输入参数在函数内部的修改,如果不指定将此修改后输入的参数值返回到工作空间,则函数调用结束后,修改后的值都将被自动清除。
(1)函数内部输入参数修改
function y=mythe(x)
x=x+2;
y=x.^2;
(2)返回matalb工作区
function [y,x]=mythee(x)
x=x+2;
y=x.^2;
4.3.4 全局变量
使用全局变量从函数内部修改matlab工作区变量。使得matlab工作空间和函数空间共享。global variable。
function y=myt(x)
global a;
a=a+9;
y=cos(x);
调用
global a
a=2
myt(pi)
a
4.4 插值函数
数字信号和图像处理中。插值函数保存在matlab工具箱的polyfun工具箱中。
4.4.1 一维插值命令及案例
使用interp1()实现。找出一元函数f(x)在中间点的数值。
4.4.2 二维插值命令及案例
clear all
clc
[x,y]=meshgrid(-5:1:5); %原始数据
z=peaks(x,y);
[xi,yi]=meshgrid(-5:0.8:5); %插值数据
zi_nearest=interp2(x,y,z,xi,yi,'nearest'); %临近点插值
zi_linear=interp2(x,y,z,xi,yi); %系统默认为线性插值
zi_spline=interp2(x,y,z,xi,yi,'spline'); %三次样条插值
zi_cubic=interp2(x,y,z,xi,yi,'cubic'); %三次多项式插值
figure; %数据显示
hold on;
subplot(321);
surf(x,y,z); %绘制原始数据点
title('原始数据');
subplot(322);
surf(xi,yi,zi_nearest); %绘制临近点插值的结果
title('临近点插值');
subplot(323);
surf(xi,yi,zi_linear); %绘制线性插值的结果
title('线性插值');
subplot(324);
surf(xi,yi,zi_spline); %绘制三次样条插值的结果
title('三次样条插值');
subplot(325);
surf(xi,yi,zi_cubic); %绘制三次多项式插值的结果
title('三次多项式插值');
注意事项:
(1)二维插值中已知数据(x,y)必须是栅格格式,一般用meshgrid产生。
(2)interp2要求已知数据必须严格单调。
(3)如果数据(x,y)在平面上分布不等间距,则interp2会将其转化为等间距。如果数据已经等间距,则可以在method参数前面加星号‘*’,例如‘cubic’变为‘*cubic’,来提高插值速度。
4.4.3 样条插值
三次样条插值可以采用函数spline。
clear all
clc
x = [0 2 4 5 8 12 12.8 17.2 19.9 20];
y = exp(x).*sin(x);
xx = 0:.25:20;
yy = spline(x,y,xx);
plot(x,y,'o',xx,yy)