Matlab中最接近#define的东西是啥?

Posted

技术标签:

【中文标题】Matlab中最接近#define的东西是啥?【英文标题】: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 中做什么? (需要跨多个文件工作。)

【问题讨论】:

相关问题:***.com/questions/1773850/constants-in-matlab和***.com/questions/1389042/… 对不起,我的回答很垃圾。我删了。 有趣的是,彼得,你应该这么说,我最终用全局变量来做到这一点。 我实际上写了你提到的第一个问题,Amro。我仍在玩弄mpp 的想法。这个问题有点不同,因为另一个接受的答案仅适用于每个函数,并且更关心使常量不可变。 【参考方案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(varargin1)
  % be consistent with ones, zeros, eye, etc.
  returnvalue = repmat(88,[varargin1,varargin1]);
elseif (nargin == 1)
  % the size is a vector already
  if isvector(varargin1)
    returnvalue = repmat(88,varargin1);
  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 中。

以上是关于Matlab中最接近#define的东西是啥?的主要内容,如果未能解决你的问题,请参考以下文章

用matlab如何求出一个数组中最接近某个数的两个数的下标??

iOS 中最接近 Cocoa 的“NSSwitchButton”复选框的类比是啥?

纱线中最接近“npm ci”的是啥

Java是啥东西?

js中Ext.create()是啥东西 ? 有啥作用?求解答

matlab中的subsystem是啥,怎么建立?