代码之家  ›  专栏  ›  技术社区  ›  Niko Gamulin

matlab gui:如何保存函数结果(应用状态)

  •  0
  • Niko Gamulin  · 技术社区  · 14 年前

    我想创建一个动画,让用户能够在模拟的各个步骤中前后移动。

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

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

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

    我已经储存了 decodedData “矩阵与 currentStep 值作为全局变量,因此通过单击“前进”和“下一步”按钮,索引必须更改并指向适当的步骤状态。

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

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

    2 回复  |  直到 14 年前
        1
  •  1
  •   MatlabDoug    14 年前

    最后,这是一个变量范围问题。

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

    本视频讨论指南中的手柄结构: 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/

        2
  •  1
  •   Community Romance    7 年前

    诀窍是使用 嵌套函数 以便它们共享相同的工作区。因为我已经开始 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
    

    您可能会发现滑动条功能有点问题,但您得到了这个想法:)