tags:

views:

97

answers:

3

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.)

+2  A: 

You can define a global variable http://www.mathworks.com/access/helpdesk/help/techdoc/ref/global.html or declare a function which simply returns a constant value (the second possibility looks better).

AVB
+1  A: 

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.

woodchips
That's a lot of code and files for something so simple.
Benjamin Oakes
Yes, it is. In fact, it does seem a bit overkill. The simple option I suggested first is not complex at all though. You can do something as carefully and completely as you wish.
woodchips
+1  A: 

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.

edgar.holleis
Using `cpp` was one of my first inclinations as well. But, per the `man` page: "The C preprocessor is intended to be used only with C, C++, and Objective-C source code. In the past, it has been abused as a general text processor. It will choke on input which does not obey C's lexical rules."
Benjamin Oakes

related questions