在MATLAB中具有灵活的有序/无序和标记/未标记输入列表的函数

时间:2013-12-02 21:00:14

标签: matlab argument-passing variadic-functions

许多MATLAB函数都有一个输入结构,例如:

output = function MyFun(a,b,c,'-setting1',s1,'-setting2',s2,'-setting3',s3)

我想知道如何在自己的功能中实现这种功能。确切地说,我想知道如何创建一个函数:

  1. 该函数具有可变数量的输入N + M

  2. 第一个N输入是有序且未标记。在上面的示例中,N = 3。第一个输入始终为a,第二个输入始终为b,第三个输入始终为c。函数输入是可变的,因为用户不一定需要发送bc;当他们不这样做时,这些可以采用默认(硬编码)值。据我所知,此类功能通常通过varargin.

  3. 处理
  4. 剩余的M输入无序,但标记为。在上面的示例M = 3中,变量是s1,s2,s3,它们的标签分别是setting1setting2setting3,我希望用户能够以他们想要的顺序指定这些变量。如果用户选择不指定其中一个输入(即setting1),那么我希望我的函数为s1.分配默认值

  5. 这种功能的一个例子是dlmwrite功能。

    理想情况下,我正在寻找一种MATLAB开发人员通常使用的方法,以便我的代码易于理解。

1 个答案:

答案 0 :(得分:7)

InputParser类解决了所有这些问题。您可以指定任意数量的:

  1. 必需参数(有序,无标签)
  2. 可选参数(有序,无标签)
  3. 任何顺序的字符串参数 - 值对(无序,标记)

  4. MathWorks提供了一个非常清晰的tutorial with examples。对于定义为function printPhoto(filename,varargin)的函数,该示例归结为以下内容。

    创建inputParser

    p = inputParser;
    

    指定默认值并定义验证标准:

    defaultFinish = 'glossy';
    validFinishes = {'glossy','matte'};
    checkFinish = @(x) any(validatestring(x,validFinishes));
    
    defaultColor = 'RGB';
    validColors = {'RGB','CMYK'};
    checkColor = @(x) any(validatestring(x,validColors));
    
    defaultWidth = 6;
    defaultHeight = 4;
    

    定义必需/可选/参数输入名称,设置其默认值和验证功能:

    addRequired(p,'filename',@ischar);
    addOptional(p,'finish',defaultFinish,checkFinish);
    addOptional(p,'color',defaultColor,checkColor);
    addParameter(p,'width',defaultWidth,@isnumeric);
    addParameter(p,'height',defaultHeight,@isnumeric);
    

    将输入解析为结构:

    parse(p,filename,varargin{:});
    

    然后您在p.Results中有输入参数及其值。

    InputParser类在新的MathWorks函数中使用,所以不要害怕自己使用它!