2010-02-25 18 views
9

In C, potrei fare qualcosa di simile:Qual è la cosa più vicina a #define in 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; 
} 

Cosa devo fare in Matlab? (È necessario lavorare su più file.)

+2

questioni correlate: http://stackoverflow.com/questions/1773850/constants-in-matlab e http://stackoverflow.com/questions/1389042/how-do-i-create-enumerated -types-in-matlab – Amro

+0

Mi dispiace, la mia risposta è stata spazzatura. L'ho cancellato. – Peter

+0

Divertente dovresti dirlo, Peter, ho finito per farlo con i globals. –

risposta

5

È possibile definire uno global variable o dichiarare una funzione che restituisce semplicemente un valore costante (la seconda possibilità sembra migliore).

2

Non c'è una risposta veramente buona al momento attuale. Se si desidera semplicemente definire una variabile semplice che viene visualizzata nell'area di lavoro, quindi

f00 = 88;

ovviamente funziona. Ma questo non si vedrà all'interno di altre funzioni. Quindi potresti definirlo come una variabile globale, ma poi devi dichiarare ogni variabile come globale all'interno di ogni funzione che ne avrà bisogno. Per me questo sembra un kludge. IMHO leggermente migliore, consiste nel definire una funzione m-file per foo.

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

(Si noti che ho una riga di commento qui. Questo viene restituito quando si chiama aiuto foo, così, lookfor vedrò che la linea troppo. Si raccomanda Meglio aiuto di questo, ma mi sento pigro in questo momento .)

Finché foo.m è nel percorso di ricerca, questo restituisce sempre il valore 88. Si noti che non ho incluso argomenti. Ma potresti essere più creativo, e forse permettere un argomento di dimensioni, in modo che foo (N) si comporti come fanno gli zeri, gli uni e gli occhi. Questa è la cosa bella dell'utilizzo di una funzione qui. Può fare esattamente come desideri. Quindi forse ...

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 

Probabilmente potrei fare un po 'meglio l'errore di controllo sopra, ma dovresti avere l'idea generale.

+0

Questo è un sacco di codice e file per qualcosa di così semplice. –

+0

Sì, lo è. In effetti, sembra un po 'eccessivo. La semplice opzione che ho suggerito per prima non è affatto complessa. Puoi fare qualcosa nel modo più accurato e completo che desideri. –

1

I seconda risposta di AB, dichiara una funzione che restituisce semplicemente un valore costante.

L'altra possibilità è solo #definire ciò che si desidera e preelaborare i file .m utilizzando cpp. Quindi, tuttavia, si perde la natura interattiva dello sviluppo di Matlab.

+2

Anche usare 'cpp' è stata una delle mie prime inclinazioni. Ma, secondo la pagina 'man':" Il preprocessore C è concepito per essere usato solo con codice sorgente C, C++ e Objective-C. In passato, è stato abusato come un processore di testo generale. che non obbedisce alle regole lessicali di C. " –

1

Una funzione locale come AVB dice è buona, e può essere un po 'più duratura usando le variabili persistent invece che globali. Le variabili persistenti non possono essere modificate o viste nulla al di fuori del file m, quindi è un po 'come usare #define nella parte superiore di un file .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 prima riga della funzione genitore imposterà la versione

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

E ovunque all'interno dello stesso file .m voglio usare questo #define equivalente, posso fare riferimento ad esso solo come una variabile.

myMat.convertVersion = version

+0

Evita di utilizzare 'ver' o' version' come nomi di variabili/funzioni, poiché esistono già in MATLAB. gnovice

+0

buon punto come regola –

Problemi correlati