我有这个程序,正如您所看到的那样,将随机图片从目录中拉出来,并要求用户对它们进行比较。用滑块设置值后,用户按下“下一个试用”按钮,重置滑块和随机图片对。如何修改代码,以便在重复一定次数(按下按钮)后,程序自动结束(最好带有“实验结束”消息)?
我在MATLAB文档中找不到任何关于如何执行此操作的内容。我是否需要设置变量,以便每次按下按钮时“1”都会添加到变量的值中,这样当它达到某个数字(比如说“100”)时它会终止?这是最简单的方法吗?
这是脚本:
function trials
files = dir(fullfile('samples','*.png'));
nFiles = numel(files);
combos = nchoosek(1:nFiles, 2);
index = combos(randperm(size(combos, 1)), :);
picture1 = files(index(1)).name;
picture2 = files(index(2)).name;
image1 = fullfile('samples',picture1);
image2 = fullfile('samples',picture2);
subplot(1,2,1); imshow(image1);
subplot(1,2,2); imshow(image2);
uicontrol('Style', 'text',...
'Position', [200 375 200 20],...
'String','How related are these pictures?');
uicontrol('Style', 'text',...
'Position', [50 375 100 20],...
'String','Unrelated');
uicontrol('Style', 'text',...
'Position', [450 375 100 20],...
'String','Closely related');
uicontrol('Style','pushbutton','String','Next Trial',...
'Position', [250 45 100 20],...
'Callback','clf; trials()');
h = uicontrol(gcf,...
'Style','slider',...
'Min' ,0,'Max',50, ...
'Position',[100 350 400 20], ...
'Value', 25,...
'SliderStep',[0.02 0.1], ...
'BackgroundColor',[0.8,0.8,0.8]);
set(gcf, 'WindowButtonMotionFcn', @cb);
lastVal = get(h, 'Value');
function cb(s,e)
if get(h, 'Value') ~= lastVal
lastVal = get(h, 'Value');
fprintf('Slider value: %f\n', lastVal);
end
end
end
答案 0 :(得分:3)
我在这里看到的一个问题是,“下一个试用”按钮的回调只是再次调用函数trials
。这将再次生成图像组合,您只需要/需要做一次。您应该将回调设置为另一个嵌套函数(如cb
),以便它可以访问已生成的组合。
另一个问题是如何初始化picture1
和picture2
。您应该像这样进行索引:
picture1 = files(index(1,1)).name; %# Note that index is 2-dimensional!
picture2 = files(index(1,2)).name;
现在,您首先要初始化变量以跟踪函数trials
内的试验次数以及最大试验次数:
nReps = 1;
maxReps = 100;
然后你的“Next Trial”按钮回调看起来像这样:
function newTrial(s, e)
%# I assume you need the slider value for each trial, so fetch it
%# and save/store it here.
%# Check the number of trials:
if (nReps == maxReps)
close(gcf); %# Close the figure window
else
nReps = nReps + 1;
end
%# Get the new images:
picture1 = files(index(nReps, 1)).name;
picture2 = files(index(nReps, 2)).name;
image1 = fullfile('samples', picture1);
image2 = fullfile('samples', picture2);
%# Plot the new images:
subplot(1,2,1);
imshow(image1);
subplot(1,2,2);
imshow(image2);
%# Reset the slider to the default value:
set(h, 'Value', 25);
end
一个额外的建议...我不是使用FPRINTF在屏幕上显示滑块值,而是在GUI中创建一个文本对象,只需更新其字符串值:
hText = uicontrol('Style', 'text', ...
'String', 'Slider value: 25', ... );
%# And in function cb...
set(hText, 'String', sprintf('Slider value: %f', lastVal));