2016-12-03 151 views
2

我的问题是,即使存在称为“亩”的局部变量,当代码运行命令如何让MATLAB忽略一个函数?

SQRT(亩)

Matlab的尝试运行称为亩内部函数。

据我所知这不是一个正常的行为。我如何让Matlab使用局部变量来控制它的内部函数?

我打算用deploy工具编译这个代码,因此修改matlab的内部函数文件是不合适的。在编译版本中会出现问题。

让我给有关该问题的更详细,

的main.m文件调用function_a.m功能。 Function_a函数运行另一个脚本,名称为常量。 Constants.m文件不是一个函数,而是一个脚本,它只保留一些变量,因此当它加载它时,会用这些变量填充工作区。它的格式是,

const1=3; const2=5; mu=2; 

在function_a运行constant.m之后,它会尝试使用mu值。这是当matlab从内部mu函数中发出错误时。这意味着Matlab不使用由contants.m创建的本地mu变量。

我用调试器在运行constant.m之后停止代码,但在命令中使用mu之前。穆实际上应该是在工作空间。在调试模式下,如果我使用sqrt(mu)命令,它应该可以正常工作。但是当我让继续运行时,当同样的命令写入函数文件时,Matlab会给出显示它正在尝试使用内部函数的错误。

我该如何解决这个问题?

回答

4

首先,没有名为mu的内部函数,所以我不知道这里有什么混乱。

的问题可能发生,因为你已经使用mu作为一个函数,然后内Constants脚本,你把它作为一个变量和MATLAB的静态代码分析会很困惑,所以它去与它的第一次使用的功能。这是你遇到的相同问题if you called load and tried to load a variable with the name of a function into the current workspace

但一般来说,为了避免这样的问题,您应该避免使用像Constants.m这样的脚本来填充调用函数的工作区。这是因为如果调用函数的工作空间包含具有相同名称的函数或变量,那么最终会产生歧义。更好的方法是使Constants功能,并使其返回一个struct然后可以用于访问常数变量

function S = Constants 
    S.const1 = 3; 
    S.const2 = 5; 
    S.mu = 2; 
end 

然后从调用函数

constants = Constants(); 

% Use the constants 
value = constants.const1 + constants.mu; 

% Or assign them to "safe" variables that are specific to this calling function 
my_mu = constants.mu; 

以这种方式中, mu from Constants.m并不总是必须被调用mu,这导致更强大和可重用的代码。

+0

不应该是'函数S =常量'吗? – hbaderts

+0

@hbaderts是的,谢谢 – Suever