[原创教程] Matlab内嵌函数varargin使用教程

    • @Copyright HUST-悟空实验室 2013
    • Matlab有非常多的内嵌函数和工具箱函数用到了varargin

      • 比如最常见的plot函数,除了x,y是数据意外,剩下的都需指定 属性名称(PropertyName) 及其 属性值(PropertyValue) 。
      • 例如:
        1. x = -pi:pi/10:pi;
        2. y = tan(sin(x)) - sin(tan(x));
        3. plot(x,y,'--rs','LineWidth',2, 'MarkerEdgeColor','k',…
        4. 'MarkerFaceColor','g', 'MarkerSize',10);
    • 当函数形参过多的时候,使用varargin定义函数形参的形式是非常必要的。

      • 但是帮助文件言之不详,而且普通的调用方法无法实现报错功能。
      • 在查阅众多内嵌函数后,这里给大家以一个例子说明各种数据类型:字符串、数值、变量的用法。
    • 本文最有价值的在于两个内嵌函数(help都help不到哦)的使用:
      • internal.stats.parseArgs
      • internal.stats.getParamVal
        • 对每个属性赋值,若调用lrh函数时没有添加某个属性,则自动为默认值。
        • 这个函数的意义就在于不需要对着varargin元胞一个一个对比、赋值了。
    • 报错功能
      • 凡是属性值包含字符串的属性,都需要用此函数检查用户输入的属性值是否包含在属性的全部属性值中

    函数调用脚本

    1. x=1:20;
    2. y=60:-1:41;
    3. result=lrh(x,y,'Algorithm','+','U',4,'Sqornot','false');
    4. function result=lrh(x,y,varargin)
    5. %% varargin示例函数
    6. % x,y为长度为l的两个数值向量
    7. % 用于计算result=f(x,y)
    8. % Algorithm包含加、减、乘、除四种运算
    9. % ax前系数,by前系数,如result=ax+by默认为1.
    10. % u为截距项,默认为长度为l的零向量
    11. % sqornot为是否开方,属性值为true 或者 false
    12. %% 设置默认属性、属性值
    13. paramNames = {'Algorithm','A','B','U','Sqornot'};
    14. vU=zeros(length(x),1);
    15. defaultsValue = {'+',1,1,vU,'false'};
    16. %% 对每个属性赋值,若调用lrh函数时没有添加某个属性,则自动为默认值
    17. [vAlgorithm, vA, vB, vUU,vSqornot]...
    18. =internal.stats.parseArgs(paramNames,defaultsValue,varargin{:});
    19. %% 报错功能:凡是属性值包含字符串的属性,都需要用internal.stats.getParamVal检查是否用户输入的属性值不包含在属性全部属性值中
    20. AlgorithmNames = {'+','-','*','/'};
    21. vAlgorithm =internal.stats.getParamVal(vAlgorithm,AlgorithmNames,...
    22. '''Algorithm''');
    23. SqornotNames = {'true','false'};
    24. vSqornot =internal.stats.getParamVal(vSqornot,SqornotNames,...
    25. '''Sqornot''');
    26. %% 主函数
    27. vUU=zeros(length(x),1)+vUU;
    28. switch vAlgorithm
    29. case '+'
    30. switch vSqornot
    31. case 'true'
    32. result=sqrt(vA*x+vB*y+vUU);
    33. case 'false'
    34. result=vA*x+vB*y+vUU;
    35. end
    36. case '-'
    37. switch vSqornot
    38. case 'true'
    39. result=sqrt(vA*x-vB*y-vUU);
    40. case 'false'
    41. result=vA*x-vB*y-vUU;
    42. end
    43. case '*'
    44. switch vSqornot
    45. case 'true'
    46. result=sqrt((vA*x).*(vB*y).*vUU);
    47. case 'false'
    48. result=(vA*x).*(vB*y).*vUU;
    49. end
    50. case '/'
    51. switch vSqornot
    52. case 'true'
    53. result=sqrt((vA*x)./(vB*y)./vUU);
    54. case 'false'
    55. result=(vA*x)./(vB*y)./vUU;
    56. end
    57. end
    58. end