【问题标题】:Declaring a global variable in MATLAB在 MATLAB 中声明一个全局变量
【发布时间】:2011-06-22 04:00:30
【问题描述】:

有没有办法在 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 语言中,这将是一个外部变量,我认为将其设为全局变量应该可以做到这一点。

【问题讨论】:

  • +1 表示能够阅读帮助文件,至少在它说:` 但是,如果有多个函数,可能还有基础工作区,all 声明一个特定的名称作为全局变量,它们都共享该变量的一个副本。`

标签: matlab global-variables


【解决方案1】:

您需要在您希望共享的每个范围(即函数/工作区)中将x 声明为global variable。所以,你需要把test1写成:

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

【讨论】:

  • 这是正确的。但是,“我应该在语言 X 中使用全局变量”这个问题的答案几乎总是“不要”
  • @KitsuneYMG:同意。全局变量并不漂亮,并且很难跟踪,但在极少数情况下可能是必要的邪恶。如果我对 OP 的具体情况有更多了解(我认为上面是一个简化的示例),我可能会提出更好的方法。
  • 或许你可以给我一些建议。我编写了一个由几个.m 文件组成的程序。该程序将矩阵 A 作为输入,然后将其传递给一个函数,该函数对矩阵执行某些操作,然后将其传递给另一个函数,该函数对矩阵 A 执行另一项操作。最后,我们回到原始矩阵,它检查输出的矩阵,然后将其传递给最后一个函数来处理矩阵。我的问题是我不认为函数是从函数中正确传递的,所以我认为我需要全局声明它?
  • @Amit:我已经在an answer to your follow-up question 中处理了您的评论。
  • 所以本质上,原因是在 Matlab/Octave 中,与大多数语言不同,.m 文件和它包含的函数是完全独立的范围?
【解决方案2】:

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

首先确保您的.m 文件是函数而不是脚本脚本 共享一个公共工作区,很容易不情愿地覆盖您的变量。相反,函数有自己的作用域。

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

【讨论】:

  • 感谢您的回复。你说的绝对正确,+1。我现在不使用全局变量,而是使用函数的返回值并将其设置为等于我在主函数中想要的任何值。它的效果要好得多,这就是我最初的目标,尽管我不知道如何完成这些任务。现在效果很好,谢谢!
【解决方案3】:

解决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,只需谨慎使用名称,对 appdata 字段使用唯一名称,例如 ModelOptimizerOptions,而不是通用的 xy 会有所帮助.这也适用于已编译的可执行文件和部署在 MATLAB 生产服务器上的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 2011-03-22
    • 2011-02-12
    相关资源
    最近更新 更多