X重复后MATLAB停止程序?

时间:2012-02-22 16:30:43

标签: matlab terminate trial repeat

我有这个程序,正如您所看到的那样,将随机图片从目录中拉出来,并要求用户对它们进行比较。用滑块设置值后,用户按下“下一个试用”按钮,重置滑块和随机图片对。如何修改代码,以便在重复一定次数(按下按钮)后,程序自动结束(最好带有“实验结束”消息)?

我在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

1 个答案:

答案 0 :(得分:3)

我在这里看到的一个问题是,“下一个试用”按钮的回调只是再次调用函数trials。这将再次生成图像组合,您只需要/需要做一次。您应该将回调设置为另一个嵌套函数(如cb),以便它可以访问已生成的组合。

另一个问题是如何初始化picture1picture2。您应该像这样进行索引:

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));