2010-02-25 23 views
9

En C, podría hacer algo como esto:¿Qué es lo más cercano a #define en Matlab?

#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; 
} 

¿Qué debo hacer en Matlab? (Necesita trabajar en varios archivos).

+2

preguntas relacionadas: http://stackoverflow.com/questions/1773850/constants-in-matlab y http://stackoverflow.com/questions/1389042/how-do-i-create-enumerated -types-in-matlab – Amro

+0

Lo siento, mi respuesta fue basura. Lo borré. – Peter

+0

Es curioso que diga eso, Peter, terminé haciendo eso con globals. –

Respuesta

5

Puede definir un global variable o declarar una función que simplemente devuelve un valor constante (la segunda posibilidad se ve mejor).

2

No hay una muy buena respuesta en este momento. Si solo quiere definir una variable simple que se ve en su área de trabajo, entonces

f00 = 88;

obviamente funciona. Pero esto no se verá dentro de otras funciones. Entonces, podrías definirlo como una variable global, pero luego debes declarar cada variable como global dentro de cada función que la necesitará. Para mí esto parece un error. Un poco mejor en mi humilde opinión, es definir una función m-file para foo.

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

(Tenga en cuenta que tengo una línea de comentario aquí. Este es devuelto cuando se llama ayuda foo, así, lookfor a ver esa línea también. Se recomienda una mejor ayuda que esto, pero estoy perezoso en este momento .)

Siempre que foo.m esté en su ruta de búsqueda, esto siempre devuelve el valor 88. Tenga en cuenta que no he incluido ningún argumento. Pero podría ser más creativo, y quizás permitir un argumento de tamaño, para que foo (N) se comporte como ceros, unos y ojo. Esto es lo bueno de usar una función aquí. Puede hacer exactamente lo que desee. Entonces quizás ...

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 

Probablemente podría hacer un mejor error al verificar arriba, pero debería tener una idea general.

+0

Eso es una gran cantidad de código y archivos para algo tan simple. –

+0

Sí, lo es. De hecho, parece un poco exagerado. La opción simple que sugerí primero no es para nada compleja. Puedes hacer algo tan cuidadosamente y completamente como desees. –

1

I segunda respuesta de AB, declara una función que simplemente devuelve un valor constante.

La otra posibilidad es simplemente # definir lo que quieras y preprocesar tus archivos .m utilizando cpp. Entonces, sin embargo, se pierde la naturaleza interactiva del desarrollo de Matlab.

+2

Usar 'cpp' fue también una de mis primeras inclinaciones. Pero, según la página 'man':" El preprocesador C está destinado a ser utilizado solo con código fuente C, C++ y Objective C. En el pasado, se ha abusado de él como procesador de texto general. que no obedece las reglas léxicas de C ". –

1

Una función local como AVB dice que es agradable, y puede ser un poco más duradera usando variables persistent en lugar de globales. Las variables persistentes no pueden editarse ni verse por fuera del archivo m, por lo que es un poco más parecido al uso de #define en la parte superior de un archivo .c.

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 

La primera línea en la función madre establecerá la versión

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

y en cualquier lugar dentro del mismo archivo .m Quiero utilizar este #define equivalente, que pueda referirse a ella simplemente como una variable.

myMat.convertVersion = version

+0

Evite usar 'ver' o' version' como nombres de variable/función, ya que ya existen en MATLAB. gnovice

+0

buen punto como regla –

Cuestiones relacionadas