Matlab GUI:如何保存函数结果(应用程序状态)

时间:2010-05-10 15:27:14

标签: user-interface matlab

我想创建一个动画,让用户可以在模拟步骤中前后移动。

动画必须模拟信道解码的迭代过程(接收器接收比特块,执行操作,然后检查块是否对应于奇偶校验规则。如果块不对应,则再次执行操作,当代码对应于给定的规则时,该过程最终结束。

我编写了执行解码过程并返回m x n x i矩阵的函数,其中m x n是数据块,i是迭代索引。因此,如果需要3次迭代来解码数据,则函数返回m x n x 3矩阵,每一步都被激活。

在GUI(.fig文件)中,我放置了一个“解码”按钮,它运行解码方法,并且有“后退”和“前进”按钮,这些按钮必须使用户能够在记录步骤的数据之间切换。

我已将“decodedData”矩阵和currentStep值存储为全局变量,因此点击“前进”和“下一步”按钮,索引必须更改并指向适当的步骤状态。 / p>

当我尝试调试应用程序时,该方法返回解码数据,但当我尝试单击“返回”和“下一步”时,解码数据似乎没有被声明。

有谁知道如何访问(或存储)函数的结果以启用我想在Matlab GUI中实现的描述逻辑?

2 个答案:

答案 0 :(得分:1)

最终,这是变量问题的范围。

全局变量很少是正确答案。

此视频讨论了GUIDE中的句柄结构: http://blogs.mathworks.com/videos/2008/04/17/advanced-matlab-handles-and-other-inputs-to-guide-callbacks/

本视频讨论了GUI之间的变量共享,也可以应用于单个GUI问题。 http://blogs.mathworks.com/videos/2005/10/03/guide-video-part-two/

答案 1 :(得分:1)

诀窍是使用嵌套函数,以便它们共享相同的工作区。由于我已经开始使用example in your last question,现在我只是添加GUI控件以实现前进/后退交互,除了播放/停止动画:

function testAnimationGUI()
    %# coordinates
    t = (0:.01:2*pi)';         %# 'fix SO syntax highlight
    D = [cos(t) -sin(t)];

    %# setup a figure and axis
    hFig = figure('Backingstore','off', 'DoubleBuffer','on');
    hAx = axes('Parent',hFig, 'XLim',[-1 1], 'YLim',[-1 1], ...
              'Drawmode','fast', 'NextPlot','add');
    axis(hAx, 'off','square')

    %# draw circular path
    line(D(:,1), D(:,2), 'Color',[.3 .3 .3], 'LineWidth',1);

    %# initialize point
    hLine = line('XData',D(1,1), 'YData',D(1,2), 'EraseMode','xor',  ...
                 'Color','r', 'marker','.', 'MarkerSize',50);
    %# init text
    hTxt = text(0, 0, num2str(t(1)), 'FontSize',12, 'EraseMode','xor');

    i=0;
    animation = false;

    hBeginButton = uicontrol('Parent',hFig, 'Position',[1 1 30 20], ...
                           'String','<<', 'Callback',@beginButton_callback);
    hPrevButton = uicontrol('Parent',hFig, 'Position',[30 1 30 20], ...
                           'String','<', 'Callback',@previousButton_callback);
    hNextButton = uicontrol('Parent',hFig, 'Position',[60 1 30 20], ...
                           'String','>', 'Callback',@nextButton_callback);
    hEndButton = uicontrol('Parent',hFig, 'Position',[90 1 30 20], ...
                           'String','>>', 'Callback',@endButton_callback);

    hSlider = uicontrol('Parent',hFig, 'Style','slider', 'Value',1, 'Min',1,...
                       'Max',numel(t), 'SliderStep', [10 100]./numel(t), ...
                       'Position',[150 1 300 20], 'Callback',@slider_callback);

    hPlayButton = uicontrol('Parent',hFig, 'Position',[500 1 30 20], ...
                           'String','|>', 'Callback',@playButton_callback);
    hStopButton = uicontrol('Parent',hFig, 'Position',[530 1 30 20], ...
                           'String','#', 'Callback',@stopButton_callback);

    %#----------- NESTED CALLBACK FUNCTIONS -----------------
    function beginButton_callback(hObj,eventdata)
        updateCircle(1)
    end

    function endButton_callback(hObj,eventdata)
        updateCircle(numel(t))
    end
    function nextButton_callback(hObj,eventdata)
        i = i+1;
        if ( i > numel(t) ), i = 1; end
        updateCircle(i)
    end

    function previousButton_callback(hObj,eventdata)
        i = i-1;
        if ( i < 1 ), i = numel(t); end
        updateCircle(i)
    end

    function slider_callback(hObj, eventdata)
        i = round( get(gcbo,'Value') );
        updateCircle(i)
    end

    function playButton_callback(hObj, eventdata)
        animation = true;
        while animation
            i = i+1;
            if ( i > numel(t) ), i = 1; end
            updateCircle(i)
        end
    end

    function stopButton_callback(hObj, eventdata)
        animation = false;
    end

    function updateCircle(idx)
        set(hSlider, 'Value', rem(idx-1,numel(t))+1)  %# update slider to match

        set(hLine,'XData',D(idx,1), 'YData',D(idx,2)) %# update X/Y data
        set(hTxt,'String',num2str(t(idx)))            %# update angle text
        drawnow                                       %# force refresh
        if ~ishandle(hAx), return; end                %# check valid handle
    end
    %#-------------------------------------------------------
end

您可能会发现滑块功能有点不对劲,但您明白了这一点:)