【问题标题】:What's the closest thing to #define in Matlab?Matlab中最接近#define的东西是什么?
【发布时间】:2010-02-25 21:54:06
【问题描述】:

在 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 中做什么? (需要跨多个文件工作。)

【问题讨论】:

标签: matlab


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    f00 = 88;

    显然有效。但这不会在其他函数中看到。所以你可以将它定义为一个全局变量,但是你需要在每个需要它的函数中将每个变量声明为全局变量。对我来说,这似乎是一个杂牌。恕我直言,稍微好一点的是为 foo 定义一个函数 m-file。

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

    (请注意,我这里有一个注释行。当您调用 help foo 时会返回该行,同样,lookfor 也会看到该行。推荐比这更好的帮助,但我现在感觉很懒。)

    只要 foo.m 在您的搜索路径上,那么它总是返回值 88。请注意,我没有包含任何参数。但是您可以更有创意,并且可能允许使用大小参数,以便 foo(N) 的行为与 zeros、ones 和 eye 一样。这是在这里使用函数的好处。它可以完全按照您的意愿进行。所以也许...

    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
    

    我可能会在上面做一些更好的错误检查,但你应该明白大致的想法。

    【讨论】:

    • 是的。事实上,这似乎有点矫枉过正。我首先建议的简单选项一点也不复杂。您可以按照自己的意愿谨慎而完整地做某事。
    【解决方案3】:

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

    另一种可能性是只需#define 任何你想要的并使用 cpp 预处理你的 .m 文件。但是,您将失去 Matlab 开发的交互性。

    【讨论】:

    • 使用cpp 也是我最初的爱好之一。但是,根据man 页面:“C 预处理器仅用于 C、C++ 和 Objective-C 源代码。过去,它被用作通用文本处理器。它会在输入时阻塞它不遵守 C 的词法规则。”
    【解决方案4】:

    像 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

    【讨论】:

    • 避免使用 verversion 作为变量/函数名称,因为它们已经存在于 MATLAB 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2011-06-08
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多