在Matlab中#define最接近的是什么?

时间:2010-02-25 21:54:06

标签: matlab

在C中,我可能会这样做:

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

我应该在Matlab中做什么? (需要跨多个文件工作。)

4 个答案:

答案 0 :(得分:5)

您可以定义global variable 或声明一个只返回一个常量值的函数(第二种可能性看起来更好)。

答案 1 :(得分:2)

目前没有真正好的答案。如果您只想定义在工作区中看到的简单变量,那么

f00 = 88;

显然有效。但是在其他功能中不会出现这种情况。因此,您可以将其定义为全局变量,但是您需要在每个需要它的函数内将每个变量声明为全局变量。对我来说,这似乎是一个蠢货。稍微好一点的恕我直言,就是为foo定义一个函数m文件。

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

(请注意,我在这里有一个注释行。当你调用help foo时会返回此信息,lookfor也会看到该行。建议使用比这更好的帮助,但我现在感觉很懒。)

只要foo.m在你的搜索路径上,那么这总是返回值88.注意我没有包含任何参数。但是你可能更有创意,也许允许一个大小参数,这样foo(N)的行为就像零,一个和眼睛一样。这是在这里使用函数的好处。它可以完全按照您的意愿行事。所以也许......

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

我可能会在上面做一些更好的错误检查,但你应该得到一般的想法。

答案 2 :(得分:1)

我是AB的第二个响应,声明一个只返回一个常量值的函数。

另一种可能性就是#define你想要的任何东西,并使用cpp预处理.m文件。然而,你失去了Matlab开发的交互性。

答案 3 :(得分:1)

像AVB这样的本地函数说的很好,使用persistent变量而不是全局变量可以更耐用。持久变量不能被m文件编辑或看到任何内容,所以它更像是在.c文件的顶部使用#define。

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

父函数中的第一行将设置版本

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

在同一个.m文件中的任何地方我想使用这个#define等价物,我可以像变量一样引用它。

myMat.convertVersion = version