Benjamin Oakes
Benjamin Oakes

Reputation: 12782

What's the closest thing to #define in Matlab?

In C, I might do something like this:

#define MAGIC_NUMBER (88)

int foo(int a, int b, int c) {
  return a + b + c + MAGIC_NUMBER;
}

double bar(double x, double n) {
  return x + n + MAGIC_NUMBER;
}

/*
 * ...and so on with many kind-of-long functions using
 * MAGIC_NUMBER instead of writing a literal 88 like so:
 */

double bar(double x, double n) {
  return x + n + 88;
}

What should I do in Matlab? (Needs to work across multiple files.)

Upvotes: 12

Views: 14578

Answers (4)

Bret Dahme
Bret Dahme

Reputation: 21

A local function like AVB says is nice, and can be make a bit more durable using persistent variables instead of global. Persistent variables can't be edited by or seen anything outside of the m file, so it's a bit more like using #define at the top of a .c file.

function ver = version( ver )
% #define version = 'something'
% returns '' if not set since last time m file was edited, els persistently
% returns the last value set

persistent ver_;

if nargin
    ver_ = char(ver);  % garentee the data type
else
    ver_ = char(ver_);  % garentee the data type
end

ver = ver_;

end

The first line in the parent function will set the version

version('6.00'); % version number of the current converter

And anywhere within the same .m file I want to use this #define equivalent, I can refer to it just like a variable.

myMat.convertVersion = version

Upvotes: 1

AVB
AVB

Reputation: 4024

You can define a global variable or declare a function which simply returns a constant value (the second possibility looks better).

Upvotes: 6

edgar.holleis
edgar.holleis

Reputation: 5001

I second AB's response, declare a function that simply returns a constant value.

The other possibility is to just #define whatever you want and preprocess your .m files using cpp. Then however you lose the interactive nature of Matlab developoment.

Upvotes: 1

user85109
user85109

Reputation:

There is no really good answer at the current time. If you want to just define a simple variable that is seen in your workspace, then

f00 = 88;

obviously works. But this will not be seen inside other functions. So you could define it as a global variable, but then you need to declare each variable as global inside every function that will need it. To me this seems a kludge. Slightly better IMHO, is to define a function m-file for foo.

function returnvalue = f00
% returns the scalar value of 88
returnvalue = 88;

(Note that I have a comment line here. This is returned when you call help foo, as well, lookfor will see that line too. Better help than this is recommended, but I am feeling lazy right now.)

As long as foo.m is on your search path, then this always returns the value 88. Note that I have included no arguments. But you could be more creative, and perhaps allow a size argument, so that foo(N) would behave as do zeros, ones and eye. This is the nice thing about using a function here. It can do exactly as you wish. So perhaps...

function returnvalue = f00(varargin)
% returns the scalar value of 88, or replicated elements if a size is supplied
% usage: foo
% usage: foo(N)
% usage: foo(N1,N2,...)
%
% arguments: 
%  N - a scalar or vector that denotes the number
%      of repeated elements (all 88) to be generated
%
%  returnvalue - a scalar (or vector/array) of
%      size indicated by N.
%
% see also: ones, zeros, eye

if (nargin == 0)
  % no arguments, so return a scalar 88
  returnvalue = 88;
elseif (nargin == 1) && isscalar(varargin{1})
  % be consistent with ones, zeros, eye, etc.
  returnvalue = repmat(88,[varargin{1},varargin{1}]);
elseif (nargin == 1)
  % the size is a vector already
  if isvector(varargin{1})
    returnvalue = repmat(88,varargin{1});
  else
    error('FOO:impropersize','Size argument cannot be a general array')
  end
elseif 
  % nargin must have been more than 1
  returnvalue = repmat(88,cell2mat(varargin));
end

I could probably do a bit better error checking above, but you should get the general idea.

Upvotes: 1

Related Questions