Take the 2-minute tour ×
Computational Science Stack Exchange is a question and answer site for scientists using computers to solve scientific problems. It's 100% free, no registration required.

I have a function with a number of arguments, but some of them are optional.

1.) If when the function is called, some are left empty, how do I code it so that it defaults to a specific value?

2.) What if of 5 arguments, 3 are optional, how can the code recognize which one to set to default? For example:

function [u, v] = somefxn(required, required2, optional, optional2, optional3)

and say when I call this function, only optional2 is filled.

Update: Is there something I can use that says

if optional2 is empty
    return default_value
end
share|improve this question
    
Do you mean "empty" as in optional2=[] or as in somefxn(required,required2,optional,optional3)? –  Christian Clason Dec 30 '12 at 21:12
    
@ChristianClason I suppose the second one, but aren't they the same? –  AlanH Dec 30 '12 at 21:23
1  
They're not -- an empty variable as argument is not the same as a missing argument. Since the argument names are local to the function, Matlab has no way of telling whether the second or the third optional argument is missing. If you require arguments that are independent of their order, you need to implement key/value pairs. A rather elegant way is described in this answer on SO. –  Christian Clason Dec 30 '12 at 21:26
1  
The answer is indeed (as usual for SO) rather compact... Unfortunately, there's no simpler way to make Matlab do something it was not designed to do. If you really(!) need to account for missing arguments, your best bet is to adapt the SO answer (you just need to replace the line option=... with the full(!) list of expected arguments); otherwise you should follow Nat Wilson's edited suggestion (which is how most Matlab commands such as gmres work, in fact). –  Christian Clason Dec 30 '12 at 23:26
2  
You can do this in a slightly more elegant way (though that's a matter of taste) using inputParser(). One example is here (just look at the setup_params() function starting on line 178). –  David Ketcheson Dec 31 '12 at 13:47
show 2 more comments

2 Answers

up vote 6 down vote accepted

Here's one take:

1) In Matlab, if you use varargin, then you must provide all preceding optional arguments (that is, optional must be given as well as optional2). In this case (for example, if you call somefxm(myarg, myarg2, myoptarg, myoptarg2), then you know based on the length of varargin (2) that only optional3 needs a default applied. You can have an if statement that says something like

if length(varargin) == 2
    optional3 = 3;  % or whatever
end

You can have additional conditional statements to handle having only one optional argument (e.g. length(varargin) == 1) or no optional arguments (e.g. length(varargin) == 0).

2) Note that with this scheme, Matlab has no clever way of knowing which function argument fits into which option, so you must keep everything in sequential order. If you need more flexibility, you can do something sort of like keyword arguments by preceding the argument with a descriptive string, which is the way that some common functions like plot work. Then you either need to write logic to parse varargin (as in Christian Clason's comment), or you can use the inputParser object.

edit

Another (in my opinion, clunkier) way of treating an "empty" optional2 is to test whether the provided argument is simply an empty matrix, with

if isempty(cell2mat(varargin(2))
    optional2 = 3; % or whatever
end

Then, you could call somefxn with an "empty" second optional argument as:

somefxn(myarg, myarg2, myoptarg, [], myoptarg3)

Then, the second optional argument will be assigned whatever you've coded into the function. If you do this, you need to make sure that an empty matrix is not an otherwise valid argument to somefxn, otherwise you'll have just overloaded the proper behaviour.

share|improve this answer
2  
You can also use nargin (and nargout) instead of length(varargin) (and length(varargout)) if you know the number of optional arguments beforehand. –  Christian Clason Dec 30 '12 at 10:55
add comment

You can do this in a way that isn't as prone to breaking when the order of the arguments changes using inputParser(), which also allows you to validate the arguments.

One example is here (just look at the setup_params() function starting on line 178). More documentation with examples is here.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.