- @Copyright HUST-悟空实验室 2013
Matlab有非常多的内嵌函数和工具箱函数用到了varargin。
- 比如最常见的plot函数,除了x,y是数据意外,剩下的都需指定 属性名称(PropertyName) 及其 属性值(PropertyValue) 。
- 例如:
x = -pi:pi/10:pi;
y = tan(sin(x)) - sin(tan(x));
plot(x,y,'--rs','LineWidth',2, 'MarkerEdgeColor','k',…
'MarkerFaceColor','g', 'MarkerSize',10);
当函数形参过多的时候,使用varargin定义函数形参的形式是非常必要的。
- 但是帮助文件言之不详,而且普通的调用方法无法实现报错功能。
- 在查阅众多内嵌函数后,这里给大家以一个例子说明各种数据类型:字符串、数值、变量的用法。
- 本文最有价值的在于两个内嵌函数(help都help不到哦)的使用:
- internal.stats.parseArgs
- internal.stats.getParamVal
- 对每个属性赋值,若调用lrh函数时没有添加某个属性,则自动为默认值。
- 这个函数的意义就在于不需要对着varargin元胞一个一个对比、赋值了。
- 报错功能
- 凡是属性值包含字符串的属性,都需要用此函数检查用户输入的属性值是否包含在属性的全部属性值中
函数调用脚本
x=1:20;
y=60:-1:41;
result=lrh(x,y,'Algorithm','+','U',4,'Sqornot','false');
function result=lrh(x,y,varargin)
%% varargin示例函数
% x,y为长度为l的两个数值向量
% 用于计算result=f(x,y)
% Algorithm包含加、减、乘、除四种运算
% a为x前系数,b为y前系数,如result=ax+by默认为1.
% u为截距项,默认为长度为l的零向量
% sqornot为是否开方,属性值为true 或者 false
%% 设置默认属性、属性值
paramNames = {'Algorithm','A','B','U','Sqornot'};
vU=zeros(length(x),1);
defaultsValue = {'+',1,1,vU,'false'};
%% 对每个属性赋值,若调用lrh函数时没有添加某个属性,则自动为默认值
[vAlgorithm, vA, vB, vUU,vSqornot]...
=internal.stats.parseArgs(paramNames,defaultsValue,varargin{:});
%% 报错功能:凡是属性值包含字符串的属性,都需要用internal.stats.getParamVal检查是否用户输入的属性值不包含在属性全部属性值中
AlgorithmNames = {'+','-','*','/'};
vAlgorithm =internal.stats.getParamVal(vAlgorithm,AlgorithmNames,...
'''Algorithm''');
SqornotNames = {'true','false'};
vSqornot =internal.stats.getParamVal(vSqornot,SqornotNames,...
'''Sqornot''');
%% 主函数
vUU=zeros(length(x),1)+vUU;
switch vAlgorithm
case '+'
switch vSqornot
case 'true'
result=sqrt(vA*x+vB*y+vUU);
case 'false'
result=vA*x+vB*y+vUU;
end
case '-'
switch vSqornot
case 'true'
result=sqrt(vA*x-vB*y-vUU);
case 'false'
result=vA*x-vB*y-vUU;
end
case '*'
switch vSqornot
case 'true'
result=sqrt((vA*x).*(vB*y).*vUU);
case 'false'
result=(vA*x).*(vB*y).*vUU;
end
case '/'
switch vSqornot
case 'true'
result=sqrt((vA*x)./(vB*y)./vUU);
case 'false'
result=(vA*x)./(vB*y)./vUU;
end
end
end