0

自从使用 Matlab 已经有一段时间了,直到现在我从未将它用于任何 GUI 创建。我的目标是有一个我可以按下的按钮,然后在计算结果时绘制结果。该按钮应根据发生的情况在“开始”和“停止”之间切换。这些结果被收集了几次迭代,每次迭代都会给出另一个数据点。

我的解决方案是将轴传递给进行计算的函数,然后该函数可以绘制到轴上。这可行,但是在发生这种情况时,按钮不会切换到“停止”,直到绘图完成。我可以使功能非阻塞吗?我什至要这样做是最好的方法吗?如何使用“停止”按钮停止计算?我只需要为此创建一个线程(matlab 是否支持线程)?

我一直在用一个简单的函数来测试我的想法来绘制正弦

function [ t,y ] = slowSin(ax)
%Plot a sin curve slowly
t = [0:0.06:4*pi];
y = sin(1.5*t);

for i = 1:length(t)
    plot(ax, t(1:i), y(1:i))
    pause(0.1)

end

直到现在我还没有想到线程。我会尽快调查,但感谢所有帮助。

4

1 回答 1

1

首先,MATLAB 不对任何图形进行多线程处理,因此您必须发挥创造力。

drawnow此外,如果您尝试在计算过程中进行一些绘图,您将希望使用它来刷新回调和渲染事件。

至于知道何时停止,您可以将按钮的图形句柄传递给您的计算,并且它可以检查每次迭代的值?

我有一个使用持久变量来跟踪当前迭代并允许用户通过取消单击切换按钮来“暂停”计算的示例。

function guiThing()

    figure();
    hbutton = uicontrol('style', 'toggle', 'String', 'Start');

    hplot = plot(NaN, NaN);

    nIterations = 1000;
    set(gca, 'xlim', [1 nIterations], 'ylim', [1 nIterations])

    set(hbutton, 'callback', @(s,e)buttonCallback())

    function buttonCallback()
        % If the button is depressed, calculate the thing
        if get(hbutton, 'value')
            calculateThing(hbutton, hplot, nIterations);
        end
    end
end

% This function can live anywhere on the path!
function calculateThing(hbutton, hplot, nIterations)

    % Keep track of data with persistent variables
    persistent iteration

    % First time to call this function, start at 1
    if isempty(iteration); iteration = 1; end

    for k = iteration:nIterations
        iteration = k;

        % If the button is not depressed then stop this
        if ~get(hbutton, 'value')
            return
        end

        % Update plotting in some way
        curdata = get(hplot);
        set(hplot, 'XData', [curdata.XData k], ...
                   'YData', [curdata.YData, k])

        % Flush drawing queue
        drawnow

        fprintf('Iteration: %d\n', iteration);
    end
end

您可以使用持久变量来跟踪需要在迭代(以及停止和启动)之间持久存在的任何其他数据。

于 2016-03-04T19:32:25.307 回答