views:

253

answers:

3

Is there a keyword in Matlab that is roughly equivalent to None in python?

I am trying to use it to mark an optional argument to a function. I am translating the following Python code

def f(x,y=None):
    if y == None:
     return g(x)
    else:
     return h(x,y)

into Matlab

function rtrn = f(x,y)
    if y == []:
     rtrn = g(x);
    else
     rtrn = h(x,y);
    end;
end

As you can see currently I am using [] as None. Is there a better way to do this?

+1  A: 

NaN while not equivalent, often serves the similar purpose.

SilentGhost
+7  A: 

in your specific case. you may use nargin to determine how many input arguments here provided when calling the function.

from the MATLAB documentation:

The nargin and nargout functions enable you to determine how many input and output arguments a function is called with. You can then use conditional statements to perform different tasks depending on the number of arguments. For example,

function c = testarg1(a, b) 
     if (nargin == 1)
         c = a .^ 2; 
     elseif (nargin == 2)
         c = a + b; 
     end

Given a single input argument, this function squares the input value. Given two inputs, it adds them together.

Adrien Plisson
I'd also add another else step in the if loop to catch the cases where the function is called with the incorrect number of input arguments, you could then flag this as an error
Adrian
+3  A: 

nargin is definitely the easiest way of doing it. Also it is usually good practise to validate the number of input argument using nargchk:

function e = testFunc(a,b,c,d)
    error( nargchk(2, 4, nargin, 'struct') );

    % set default values
    if nargin<4, d = 0; end
    if nargin<3, c = 0; end

    % ..
    c = a*b + c*d;

end

... which acts as a way to ensure the correct number of arguments is passed. In this case, a minimum of two arguments are required, with a maximum of four.

If nargchk detects no error, execution resumes normally, otherwise an error is generated. For example, calling testFunc(1) generates:

Not enough input arguments.

You can use functions like: exist and isempty to check whether a variable exists and whether it is empty respectively:

if ~exist('c','var') || isempty(c),
  c = 10;
end

which allows you to call your function such as: testFunc(1,2,[],4) telling it to use the default value for c but still giving a value for d

You could also use varargin to accept a variable number of arguments.

Finally a powerful way to parse and validate named inputs is to use inputParser

To see examples and other alternatives of passing arguments and setting default values, check out this post and its comments as well.

Amro