8
votes

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?

3
What are you trying to do in Matlab? - Will Robertson

3 Answers

13
votes

NaN while not equivalent, often serves the similar purpose.

11
votes

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.

7
votes

nargin is definitely the easiest way of doing it. Also it is usually good practice 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.

UPDATE: A new function was introduced in R2011b narginchk, which replaces the use of the deprecated nargchk+error seen above:

narginchk(2,4);

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.