Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab:将变量从GUI传输到基本工作区和新变量(静态工作区、脚本、创建新变量)_Matlab_Variables_User Interface_Static_Workspace - Fatal编程技术网

Matlab:将变量从GUI传输到基本工作区和新变量(静态工作区、脚本、创建新变量)

Matlab:将变量从GUI传输到基本工作区和新变量(静态工作区、脚本、创建新变量),matlab,variables,user-interface,static,workspace,Matlab,Variables,User Interface,Static,Workspace,我正在为一个现有脚本开发一个GUI,该脚本在基本工作区中需要一些结构值。GUI应将用户值传输到基本工作区,然后启动脚本并立即关闭自身。这听起来很简单,赋值和evalin都使用了这些值,但我工作了好几天,遇到了一个问题:如果脚本自己创建了后续值,我会得到以下消息: 尝试将变量名称添加到静态工作区。有关详细信息,请参阅MATLAB编程,变量分配限制。 有什么问题?GUI已关闭,脚本应无限制地使用基本工作区。如何做到这一点? 脚本是不可触摸的(不是从我这里),它需要基本工作区中的变量,因此GUI应该将

我正在为一个现有脚本开发一个GUI,该脚本在基本工作区中需要一些结构值。GUI应将用户值传输到基本工作区,然后启动脚本并立即关闭自身。这听起来很简单,赋值和evalin都使用了这些值,但我工作了好几天,遇到了一个问题:如果脚本自己创建了后续值,我会得到以下消息:

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

有什么问题?GUI已关闭,脚本应无限制地使用基本工作区。如何做到这一点?
脚本是不可触摸的(不是从我这里),它需要基本工作区中的变量,因此GUI应该将值传输到工作区,而不是其他。不需要静态工作空间。工作空间应不受任何限制。简而言之:我希望删除“静态工作区”中的“静态”

MATLAB文档规定:

如果您尝试将变量动态添加到 匿名函数、嵌套函数或 包含嵌套函数的函数

因此,您的问题很可能是直接从GUI中某个按钮的匿名回调调用脚本(没有细节,我只能猜测)。如果是这种情况,那么将其包装到另一个函数中,以便将脚本创建的变量与anon函数工作区隔离

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

注意:与预期相反,函数调用的脚本不会在基本工作区中创建变量,而是在函数的工作区中创建变量。只有从另一个脚本调用时,它才会使用基本工作区创建变量

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

% his_script.m
outvar3 = invar1 + invar2;
outvar4 = invar1 - invar2;
因为没有
赋值
evalin
我们可以将其包装到函数
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在基本工作区中编写,您可以让它这样做,但是您应该从控制台窗口手动调用脚本,因为控制台窗口的上下文是基本工作区。或者尝试使用
evalin('base','script_name;')但您需要进行测试(到目前为止,我抵制了使用这种东西的诱惑-正是因为它很容易搞糟,我不想让这种诅咒降临到我身上)。

这就是您使用的真正的脚本或函数吗?GUI是由手写函数(而不是指南)制成的。被调用的脚本是真实脚本。是否使用嵌套函数?你能提供代码吗?是的,我使用嵌套函数更新用户入口的值(值、单选按钮和复选框)。谢谢,这是一个很好的答案,我理解。但正如所描述的:我必须设置一个外来脚本,该脚本需要工作区中的值,并使用GUI将用户输入传递到基本工作区,以提供脚本。我相信这是不可能的。这是我期望从GUI获得的一个基本功能:将值传递到工作区。我需要一个解决方法,我想从cst链接接受答案,但找不到一个按钮。@René如果您将鼠标悬停在答案分数以下,您应该会看到一个大的复选标记。对于函数/脚本问题:您知道脚本是否使用
assignin
evalin
?如果没有,包装器函数应该可以工作。如果是。。。嗯,我需要考虑一下。啊,我看到了对勾。但是如果你有更多的想法,请告诉我。该脚本没有evalin或assignin命令,但具有将变量传输到工作区的GUI功能。再说一次,我不想对脚本做任何更改,只有GUI应该以无限制地将值传递到工作区的方式工作…@RenéHi,我在回答中添加了一个示例