Matlab GUI: как сохранить результаты функций (состояния приложений) - PullRequest
0 голосов
/ 10 мая 2010

Я хотел бы создать анимацию, которая позволит пользователю идти вперед и назад по всем этапам симуляции.

Анимация должна моделировать итеративный процесс декодирования канала (получатель получает блок битов, выполняет операцию, а затем проверяет, соответствует ли блок правилам четности. Если блок не соответствует, операция выполняется снова и процесс окончательно завершается, когда код соответствует заданным правилам).

Я написал функции, которые выполняют процесс декодирования и возвращают матрицу m x n x i, где m x n - блок данных, а i - индекс итерации. Таким образом, если для декодирования данных требуется 3 итерации, функция возвращает матрицу m x n x 3 с каждым шагом.

В графическом интерфейсе (файл .fig) я поместил кнопку «декодировать», которая запускает метод декодирования, и есть кнопки «назад» и «вперед», которые должны позволять пользователю переключаться между данными записанных шагов.

Я сохранил матрицу "decodedData" и значение currentStep как глобальную переменную, поэтому, нажимая кнопки "вперед" и "далее", индексы должны измениться и указать на соответствующие состояния шага.

Когда я пытался отладить приложение, метод возвращал декодированные данные, но когда я пытался нажать «назад» и «далее», оказалось, что декодированные данные не были объявлены.

Кто-нибудь знает, как можно получить доступ (или сохранить) результаты функций для включения описанной логики, которую я хочу реализовать в Matlab GUI?

Ответы [ 2 ]

1 голос
/ 11 мая 2010

Хитрость заключается в использовании вложенных функций , чтобы они совместно использовали одно и то же рабочее пространство. Поскольку я уже начал с примера в вашем последнем вопросе , теперь я просто добавляю элементы управления графическим интерфейсом для интерактивного движения вперед / назад, а также для воспроизведения / остановки анимации:

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

Может показаться, что функциональность слайдера немного глючит, но вы поняли:)

1 голос
/ 11 мая 2010

В конечном счете, это проблема определения объема переменных.

Глобальные переменные редко бывают правильным ответом.

В этом видео обсуждается структура дескрипторов в GUIDE: http://blogs.mathworks.com/videos/2008/04/17/advanced-matlab-handles-and-other-inputs-to-guide-callbacks/

В этом видео обсуждается совместное использование переменных между графическими интерфейсами и может также применяться к одной проблеме графического интерфейса http://blogs.mathworks.com/videos/2005/10/03/guide-video-part-two/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...