Matlab:将变量从GUI传输到基础工作空间和新变量(静态工作空间,脚本,创建新变量)

时间:2014-10-10 13:02:23

标签: matlab variables user-interface static workspace

我正在为现有脚本开发一个GUI,它希望在基础工作区中有一些Struct值。 GUI应将用户值传输到Base-Workspace,然后立即启动脚本并自行关闭。这听起来非常简单,值与assignin和evalin一起使用,但我工作了几天,问题是如果脚本后来创建值本身,我得到消息:

尝试将var_name添加到静态工作区。有关详细信息,请参阅MATLAB编程,分配给变量的限制。

问题是什么? GUI关闭,脚本应无限制地使用Base-Workspace。如何才能做到这一点? 脚本是不可触及的(不是来自我)并且它期望基础Workspace中的变量,因此GUI应该将值传递给工作空间而不是其他任何东西。不需要静态工作区。工作区不受任何限制。简而言之:我希望删除“静态工作区”中的“静态”

1 个答案:

答案 0 :(得分:0)

MATLAB文档指定:

  

如果您尝试动态添加变量,MATLAB会发出错误   匿名函数的工作空间,嵌套函数或   包含嵌套函数的函数。

所以,你的问题很可能是因为你的GUI中的某个按钮的匿名回调直接调用脚本(没有我不得不猜的细节)。如果是这种情况,则将其包装到又一个函数中,这样您就可以将脚本创建的变量与anon函数工作区隔离开来。

设计包装器函数以接受要传递给脚本的变量作为参数,因此脚本将具有所需的内容。另外,请确保不要在包装器中嵌套函数,因为你会遇到同样的问题。

注意:与您期望的相反,函数调用的脚本不会在Base工作区中创建其变量,而是在函数的工作空间中创建。只有从另一个脚本调用它才会使用Base工作区来创建变量。

示例:假设脚本“his_script.m”要求变量invar1invar2已经位于其可访问的工作区中;脚本的输出(即创建的变量)是变量outvar3outvar4

% his_script.m
outvar3 = invar1 + invar2;
outvar4 = invar1 - invar2;

因为没有assigninevalin我们可以将其包装到函数my_wrapper.m中:

% my_wrapper.m
function [outvar3, outvar4] = my_wrapper(invar1, invar2)
        % Pre-create the outputs if the script cannot promise with
        % the hand on the Holy Book of Execution Paths that it will
        % create all the output variables.
        outvar3 = [];
        outvar4 = [];

        % Call the script
        his_script;
end

并且函数参数将作为脚本的输入,函数的返回值将是脚本的输出。

现在,您可以在按钮的匿名回调中使用您的调用包装函数,例如:

% initialization function of your GUI
        % ...
        set(action_button_handle, 'Callback', action_button_callback);
        % ...

% somewhere deep in your GUI code, nested function for
% manipulating the script
function action_button_callback(hObject, callbackdata)
    [out1, out2] = my_wrapper(5,3);
    display(out1);
    display(out2);
end

% ...

我希望这个想法现在更加清晰。请告诉我它是如何运作的。

进一步评论:脚本和函数之间的主要区别之一是脚本没有自己的工作区,而函数则有。脚本使用调用它们的上下文的工作空间。

这意味着您的目标“GUI应该将值传输到工作区而没有别的”会产生误导,因为您不知道脚本的工作区在哪里,除非您调用它首先。

如果您确实希望GUI在Base工作区中写入,那么您应该这样做,但是您应该从控制台窗口手动调用脚本,因为控制台窗口的上下文是基础工作区。或者尝试使用evalin('base', 'script_name;');,但是你需要测试(到目前为止,我抵制了使用这样的东西的诱惑 - 完全是因为很容易搞砸,而且我不想让我感到厌恶。)