Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Functions with a flexible list of ordered/unordered and labeled/unlabeled inputs in MATLAB

A lot of MATLAB functions have an input structure such as:

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

I am wondering how I should implement this kind of functionality in my own functions. To be precise, I would like to find out how I can create a function such that:

  1. The function has a variable number of inputs N + M

  2. The first N inputs are ordered and unlabeled. In the example above, N = 3. The first input is always a, second input is always b, third input is always c. The function input is variable in that users do not necessarily need to send b, c; when they do not then these can take on default (hardcoded) values. As far as I know, this type of functionality is generally handled via varargin.

  3. The remaining M inputs are unordered, but labeled. In the example above, M = 3, the variables are s1,s2,s3 and their labels are setting1,setting2 and setting3 respectively, I would like for users to be able to specify these variables in whatever order they want. If users choose not to specify one of these inputs (i.e. setting1), then I would like my function to assign default values for s1.

One example of such a function is the dlmwrite function.

Ideally, I am looking for an approach that is typically used by MATLAB developers so that my code is easy to understand.

like image 805
Berk U. Avatar asked Dec 02 '13 21:12

Berk U.


1 Answers

The InputParser class addresses all of these issues. You can specify any number of:

  1. Required parameters (ordered, unlabeled)
  2. Optional parameters (ordered, unlabeled)
  3. String parameter-value pairs in any order (unordered, labeled)

A very clear tutorial with examples is provided by MathWorks. For a function defined as function printPhoto(filename,varargin), the example boils down to the following.

Create the inputParser:

p = inputParser;

Specify defaults and define validation criteria:

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;

Define required/optional/parameter input names, set their default values and validation functions:

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 the inputs into a struct:

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

Then you have the input arguments and their values in p.Results.

The InputParser class is used throughout newer MathWorks functions, so don't be afraid to use it yourself!

like image 178
chappjc Avatar answered Nov 15 '22 05:11

chappjc