如何在等待用户输入的同时让Matlab继续处理 [英] How to matlab continue processing while waiting for user input

查看:964
本文介绍了如何在等待用户输入的同时让Matlab继续处理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我们有以下for循环:

for i=1:100
    % image processing calculation
    % show image to the user and ask for his rating
    rating(i) = input('Enter rating of the shown image\n');
end

很明显,input命令将等待用户输入,并且for循环直到用户提供输入后才会继续.我在for循环中运行的图像处理代码很耗时,所以我想知道是否有一种方法可以让MATLAB在后台继续进行计算,以便在等待用户输入时进行以下循环迭代.

Obviously, the input command will wait for the user input and the for loop won't continue until the user has provided his input. The image processing code I'm running in the for loop is time consuming so I'd like to know if there's a way to make MATLAB continue calculations - in the background - for the following loop iteration while waiting for the user's input.

推荐答案

这是我在评论中提到的想法.

This is the idea I mentioned in my comment.

num_im = 3; % Number of images

% Initialize
rating = zeros(num_im,1);
fig = zeros(num_im,1);
txt = zeros(num_im,1);

% Main loop
for i = 1:num_im
    % image processing calculation
    pause(1); % a dummy calculation
    % Open a figure
    fig(i) = figure('Name', ['Image #' num2str(i)],...
        'CloseRequestFcn', [... % read the text edit
        'temp = str2double(get(txt(' num2str(i) '), ''String'')); ',...
        'if isnan(temp), errordlg(''Please enter the rating.''); ',... % Error if invalid
        'else, rating(' num2str(i) ') = temp; delete(fig(' num2str(i) ')); end']);

    subplot(2,1,1, 'position', [0 0.5 1 0.5]);

    % Show your image
    [im, map] = imread('trees.tif');
    imshow(im, map);
    % Text edit
    txt(i) = uicontrol('Units','Normalized',...
        'Style','edit',...
        'Position', [0.3 0.2 0.4 0.2]); 
end

输入评分后,请确保单击其他地方,以便text box检测到您的输入.

Make sure to click somewhere else after you enter the ratings so that the text box detects your input.

它将所有等级存储在rating矩阵中.

It will store all the ratings in rating matrix.

但是,这不会限制未结数字的数量. 如果要限制它们,请参考编辑.

However this does not limit the number of open figures. Refer to the Edit if you want to limit them.

限制打开的数字的数量.建议您将计算后的所有图像放入一个队列中,并设置一个计时器在后台询问用户等级,直到询问所有等级为止.

To limit the number of opened figures. I suggest you to put all the images after calculation in a Queue and set a timer to ask the user rating in the background until all the ratings are asked.

num_im = 4; % Number of images
max_num_figs = 2; % maximum number of open figures

% Initialize
rating = zeros(num_im,1);
fig = zeros(num_im,1);
txt = zeros(num_im,1);
show_idx = 0; % Number of shown images
Calc_idx = 0; % Number of images in Queue
num_open_figs = 0; % number of open figures

Queue = cell(num_im, 1);
% Main loop

% Start a timer for asking the user rating in background
tmr = timer('ExecutionMode', 'fixedRate',...
    'Period', 0.5, 'TimerFcn', 'tmr_callback');
start(tmr);

for k = 1:num_im
    % image processing calculation
    pause(1); % a dummy calculation

    % Put the image and its data into a Queue ith
    [im, map] = imread('trees.tif');
    Queue{Calc_idx+1} = {im, map};
    Calc_idx = Calc_idx + 1;
end

tmr_callback.m

% Create a GUI if there is any unshown images in the Queue
% and if open figures are less than maximum number of figures
if show_idx < Calc_idx && num_open_figs < max_num_figs
    num_open_figs = num_open_figs + 1;
    show_idx = show_idx + 1; % Number of shown images
    % Open a figure
    fig(show_idx) = figure('Name', ['Image #' num2str(show_idx)],...
        'CloseRequestFcn', [...
        'temp = str2double(get(txt(' num2str(show_idx) '), ''String'')); ',... % Read the text edit
        'if isnan(temp), errordlg(''Please enter the rating.''); ',... % Error if invalid
        'else, rating(' num2str(show_idx) ') = temp; delete(fig(' num2str(show_idx) ')); ',...
        'num_open_figs  = num_open_figs - 1; end']);

    subplot(2,1,1, 'position', [0 0.5 1 0.5]);
    imshow(Queue{show_idx}{:});
    % Text edit
    txt(show_idx) = uicontrol('Units','Normalized',...
        'Style','edit',...
        'Position', [0.3 0.2 0.4 0.2]);
    % turn off the timer if all ratings are asked.
    if (show_idx == num_im)
        stop(tmr);
    end
end

我还建议在用户输入数据(等级)后将其写入文件.例如,您可以使用 dlmwrite .

I also suggest to write the data(rating) into a file after the user enters each of them. You can use dlmwrite for example.

这篇关于如何在等待用户输入的同时让Matlab继续处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆