2011-02-06 87 views
33

有没有一种方法可以在MATLAB中声明全局变量?在MATLAB中声明一个全局变量

请不要回应:

global x y z; 

因为我还可以阅读the help files

我声明了一个全局变量,x,然后做了这样的事情:

function[x] = test() 
    global x; 
    test1(); 
end 

当功能test1()被定义为:

function test1() 
    x = 5; 
end 

当我运行test(),我的输出是x = []。有没有办法让它输出x=5,或者我定义的x是在一个单独的函数中吗?在C中,这将是一个外部变量,我认为把它作为一个全局变量应该能够实现这一点。

+5

+1能够读取帮助文件,至少直到它说:“但是,如果几个函数,并可能基地工作区,*所有*声明一个特定的名称为全球,他们都共享一个副本那个变量。' – Jonas 2011-02-06 13:30:52

回答

46

您需要在每个范围(即函数/工作空间)中声明xglobal variable,您希望它在其中共享。所以,你需要写test1为:

function test1() 
    global x; 
    x = 5; 
end 
+19

这是正确的。然而,对于“锄头我应该使用全局语言X”这个问题的答案几乎总是“不要” – KitsuneYMG 2011-02-06 07:07:25

+4

@KitsuneYMG:同意。全局变量并不美观,并且很难追踪,但在极少数情况下可能是必要的罪恶。如果我更了解OP的具体情况(我认为以上是一个简化的例子),我可能会提出一个更好的方法。 – gnovice 2011-02-06 07:15:21

4

使用全局变量可以解决您的问题的方法参照您的评论对gnovice,但它不是一个常用。

首先确保您的.m文件功能而不是脚本脚本共享一个共同的工作空间,很容易不愿意覆盖你的变量。相比之下,函数有自己的范围。

使用xUnit为了生成可重复的单元测试您的功能。通过测试程序中涉及的每个函数,您将追踪错误来源。进行单元测试后,可以轻松验证进一步的代码修改。

1

解决global混乱的一种可能的方法是将变量分配为appdata。您可以使用功能setappdatagetappdata从MATLAB窗口分配和检索appdata。只要MATLAB会话处于活动状态,就会出现一个由0表示的窗口。

>> setappdata(0,'x',10) % 0 indicates the root MATLAB window 

现在变量x没有任何脚本或函数可见,但可根据需要随时随地使用getappdata访问。

function test 
    globalX = getappdata(0,'x'); 
    disp(globalX); 
end 

x = 
    10 

好消息是,你可以在任何有效的MATLAB对象分配到appdata,只是用名持谨慎态度,采用独特的名字应用程序数据领域像ModelOptimizerOptions而不是一个通用的xy会有所帮助。这也适用于在MATLAB生产服务器上部署的已编译的可执行文件和代码。