问题描述
假设我们有以下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继续处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!