Matlab assignin('base',...)重置

时间:2015-04-28 20:33:09

标签: matlab animation workspace

我正在尝试编写一个函数,如果在任何动画之前调用该函数,它将处理关闭事件,而不需要动画文件中的额外代码。

function matlabStopFunction(varargin)
persistent runs
if runs==2
    runs = [];
end
if isempty(runs)
    evalin('base','figure(''DeleteFcn'',@matlabStopFunction);');
    runs = 1;
else
    assignin('base','play',false);
    pause(1);
    runs = 2;
end
end

这是我一直在使用的示例动画代码:

function sampleAnimation
matlabStopFunction;
r = 5;
th = 0;
play = true;
while play
    x = r * cosd(th);
    y = r * -sind(th);
    plot(x,y,'r*');
    axis([-10 10 -10 10]);
    th = th + 45;
    pause(0.25);
end
end

停止功能可以很好地创建图形,当我关闭图形时,它会调用与预期相同的功能(包括第10行的assignin)。但是,当我逐步回到基本函数(sampleAnimation)时,播放是假的,如预期的那样: Base Workspace

但是当我再多一行时,播放会重置为真

Base Workspace

我是否在stop函数中错误地将play的值赋值为false,如果是这样,我怎么能更正这个以便在关闭图形时动画停止同时将动画中的代码保持在最小值?我试图在this blog上复制该方法,除非所有代码都包含在单独的文件中。

我在Windows 8.1上运行Matlab 2014b。

1 个答案:

答案 0 :(得分:1)

要回答您的问题 - 您正在修改基础工作区中的值EqualityComparer<TEnum>.Default.Equals - 其中循环位于sampleAnimation函数的工作空间中 - &gt;所以你没有改变所需的值来停止动画。要验证这一点,请在运行代码之前清除基础工作区play中的变量,并且您将看到变量clear已创建并设置为false。

顺便说一下,有一种更简单的方法可以做到这一点,你可以创建一个数字,然后你可以在它被删除时停止:

play