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

Ber*_* U. 5 matlab variadic-functions argument-passing

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

output = function MyFun(a,b,c,'-setting1',s1,'-setting2',s2,'-setting3',s3)
Run Code Online (Sandbox Code Playgroud)

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

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

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

  3. 其余M输入是无序的,但标记为.在上面的例子中,M = 3中,变量是S1,S2,S3和他们的标签setting1,setting2setting3分别,我想为用户能够指定这些变量中的任何命令他们想要的.如果用户选择不指定其中一个输入(即setting1),那么我希望我的函数为其分配默认值s1.

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

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

cha*_*pjc 7

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

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

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

创建inputParser:

p = inputParser;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

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

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

将输入解析为结构:

parse(p,filename,varargin{:});
Run Code Online (Sandbox Code Playgroud)

然后你有输入参数及其值p.Results.

InputParser班在整个新MathWorks公司的功能使用,所以不要害怕自己用吧!