【问题标题】:global variable change Matlab全局变量更改 Matlab
【发布时间】:2013-03-09 13:54:57
【问题描述】:

我在代码中按照以下方式对全局变量进行操作。我想将每次保存到全局变量并保留其内容以便扩展。如果我声明函数的输出是这个变量,如果结构很大,我假设它可能会显着减慢。怎么做?

function test()

    global n1;
    n1 = [1 2 3];

    for x=1:10
%     [n1] = global_up(n1,x); % no need for output parameter, as n1 is global right?
      f_up(n1,x);
    end 
end

function f_up(arg1,arg2) %function [arg1] = f_up(arg1,arg2) is wrong?
    global n1; % need to write it in every function ?
    arg1 = [arg1 arg2];
end

【问题讨论】:

  • 函数f_up的作用是什么?我看不到 n1 在您的函数中被操纵的位置。此外,matlab 是call by value,这意味着 arg1 和 arg2 在函数调用期间被复制,并且您对 arg1 的操作不会影响您在函数调用中用作参数的对象。也许你应该澄清你的问题?
  • 啊,好的。如果变量 f_up, 是全局的,我认为您不必传递它。所以简单地写n1 = [ n1 arg2 ] 就可以了。 (不过,我从未在 matlab 中尝试过。)但是,请尽量避免它。这个问题和你的一样,很好回答:stackoverflow.com/questions/4137905/…
  • 这个问题和你的一样,很好回答:stackoverflow.com/questions/4137905/…
  • 谢谢,我没找到。这个解决方案有效,我意识到它不是最佳的:)
  • @Konstantin 如果我没记错的话,Matlab 使用了一种叫做写时复制的东西。这意味着 Matlab 不会复制任何传递的变量,除非您对其进行修改。在f_up 中,这意味着arg 1 被复制,而不是arg2

标签: matlab parameters global-variables


【解决方案1】:

我真的不明白你要做什么,但全局变量几乎绝对不是要走的路。只需将变量作为参数传递:

   function test()

        n1 = [1 2 3];

        for x=1:10
          n1 = f_up(n1,x);
        end 
    end

function arg3 = f_up(arg1,arg2)
    arg3 = [arg1 arg2];
end

但是,如果您解释这段代码的要点,您可能会得到一个更好的解决方案。就目前而言,f_up 确实没有做任何事情(即它封装了已经非常简洁但没有任何好处的语法)

【讨论】:

  • 函数被简化以显示概念。它们会更复杂。我的问题是我应该如何在 f_up 函数中写入全局变量,以便在 test() 以及稍后在更高实例中调用 test() 等的函数中使用这些数据。我可以创建一个普通变量并作为输出传递,还是使用全局变量,如何做第二个选项?
  • 我的回答是不要。像我一样把它传出去。全局变量不是一个很好的设计,你应该只是传入和传出变量。
  • ok 所以函数 [arg1] = do_it(arg1, arg2) 是让我从 arg2 读取并更新 arg1。每次我在功能上“更高”时都这样做。如果我弄错了,请更正。你能给我一个关于如何使用全局变量的答案吗?
  • 只需将变量声明为global everywhere 您想使用它,然后将其视为普通变量(但请记住,更改将传播到其余部分声明为global的代码)。 [arg1] = do_it(arg1, arg2) 是一个好方法,据我所知,这就是所有求解器等的工作方式
  • @berndh 还有,请注意,如果某个同事在他的某些函数中修改了变量(可能是有充分理由的),您可能会在下次更新后感到震惊...
【解决方案2】:

编辑:考虑这个问题来讨论您的实际问题:How to modify an array in function?

我认为你想要做的是引用调用,全局变量的使用是不必要的

您有一个变量x,您想将该变量提供给一个函数,并且您希望该函数直接对x 进行操作,以便这些操作将在您的函数外部的x 上可见。

这称为call by reference。 Matlab 不支持简单变量。

但是,您可以使用从 handle 类继承的对象。这将为您提供所需的行为。

如果您不想使用对象,则必须在函数中使用返回参数。不要使用全局变量,它们会使您的代码不可读并且几乎肯定会导致错误。

【讨论】:

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