Matlab 在函数中使用定义调用脚本
我们有一个脚本,它将值定义为与c中的#define类似的名称。例如: script.m:Matlab 在函数中使用定义调用脚本,matlab,Matlab,我们有一个脚本,它将值定义为与c中的#define类似的名称。例如: script.m: ERR_NOERROR = 0; ERR_FATAL = 1; 此脚本已存在,在从文件读取数据时用于值替换 现在我们有一个(或更多)函数来进行一些分析,我们希望在这个函数中使用相同的定义来避免幻数。但是当从函数调用脚本时,我们会得到一个错误 尝试将“ERR\u NOERROR”添加到静态工作区。 有关详细信息,请参阅MATLAB编程,变量分配限制。 这对理解这个问题没有多大帮助 问题是我们如何使这些定义在
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将脚本定义为函数会使其比全局变量更无用。发现了问题。下面这个庞然大物中有一个嵌套函数。我知道我不能在嵌套函数中这样做,但当存在嵌套函数时(我不知道这一点),这似乎就够了。我们将分解嵌套函数,这将解决问题。谢谢