Matlab 在函数中使用定义调用脚本

Matlab 在函数中使用定义调用脚本,matlab,Matlab,我们有一个脚本,它将值定义为与c中的#define类似的名称。例如: script.m: ERR_NOERROR = 0; ERR_FATAL = 1; 此脚本已存在,在从文件读取数据时用于值替换 现在我们有一个(或更多)函数来进行一些分析,我们希望在这个函数中使用相同的定义来避免幻数。但是当从函数调用脚本时,我们会得到一个错误 尝试将“ERR\u NOERROR”添加到静态工作区。 有关详细信息,请参阅MATLAB编程,变量分配限制。 这对理解这个问题没有多大帮助 问题是我们如何使这些定义在

我们有一个脚本,它将值定义为与c中的#define类似的名称。例如:

script.m:

ERR_NOERROR = 0;
ERR_FATAL = 1;
此脚本已存在,在从文件读取数据时用于值替换

现在我们有一个(或更多)函数来进行一些分析,我们希望在这个函数中使用相同的定义来避免幻数。但是当从函数调用脚本时,我们会得到一个错误

尝试将“ERR\u NOERROR”添加到静态工作区。
有关详细信息,请参阅MATLAB编程,变量分配限制。
这对理解这个问题没有多大帮助

问题是我们如何使这些定义在函数中可见/可用,而每次都必须复制它

例如:

function foo = bar(a)
  run(script.m) %also tried running it without the run command
  if a == ERR_NOERROR
    foo = 5;
  else
    foo = 6;
  end
end
编辑:
在函数下面有一个嵌套函数,我不知道。这就解释了问题。

这不是一个直接的答案,而是一个切换到另一种方法的建议,它不会混合范围和工作空间

您可以创建一个只包含常量属性的类,而不是在
脚本中定义常量。例:错误代码.m的代码:

classdef error_codes
    % ---------------------------------------------------------------------
    % Constant error code definition
    % ---------------------------------------------------------------------

    properties (Constant = true)
        noerror   =  0 ;
        fatal     =  1 ;
        errorlvl2 =  2 ;
        errorlvl3 =  3 ;
        warning   = -1 ;
        % etc ...

    end
end
我将此样式用于许多不同类型的常量。为了整洁起见,我将它们都分组在一个Matlab包目录中(目录以
+
字符开头)

使用常数类属性的附加好处是在代码中间不能改变值的安全性(脚本中定义的变量很容易被粗心的用户覆盖)。


因此,假设我的文件
error\u codes.m
放在一个文件夹中:

\...somepath...\+Constants\error_codes.m
当然,文件夹
+Constants
位于MATLAB路径上,然后在示例中使用它,而不是调用脚本,只需初始化类的实例,然后在需要时使用常量值:

function foo = bar(a)
  ERR = Constants.error_codes ;
  if a == ERR.noerror
    foo = 5;
  else
    foo = 6;
  end
或者它也可以在
开关
语句中工作:

switch a
    case ERR.noerror
        foo = 5 ;
    case ERR.warning
        foo = 42 ;
    case ERR.fatal
        foo = [] ;
end

在函数中使用嵌套函数或匿名函数时,会发生此类作用域错误

对于您的情况,您可以避免使用嵌套函数,或者“将脚本转换为函数并使用参数传递变量”,如文档所示


编辑:我应该明确指出,即使在嵌套函数中没有调用脚本,也会发生错误。类似的情况是,在调试模式下(通过设置断点),如果试图创建一个时态变量来测试某些内容,这将是一个错误。

但是当从函数调用脚本时,我们会得到一个错误什么错误?从函数调用脚本总是有效的。错误可能是因为其他原因。当然,您可能更喜欢使用@luismend我们知道这适用于全局变量,但是它们的概念在这里不是很实用。因为所有的声明。类似于#include的东西会更有用,如果在matlab中可以这样做。如果
script.m
是文件名,将
run(script.m)
替换为
run('script'))
或只是
脚本
问题只出现在使用嵌套或匿名函数时。这就是为什么OP的代码不会重现此问题。这是我的一般想法。唯一的问题是,这些定义必须以这种方式调用,因为规范符合性。它们在c标题中定义。我们可以ammend将来会这样做,但遗憾的是现在不行。好吧,它仍然是可行的。该类的构造函数可以加载
c
头文件并将不同的值解析到它的属性中。这对用户来说是完全透明的,并且可以按照您需要的方式调用。该函数既不是嵌套的,也不是匿名的。And将脚本定义为函数会使其比全局变量更无用。发现了问题。下面这个庞然大物中有一个嵌套函数。我知道我不能在嵌套函数中这样做,但当存在嵌套函数时(我不知道这一点),这似乎就够了。我们将分解嵌套函数,这将解决问题。谢谢