2012-02-22 2 views
2

У меня есть эта программа, которая, как вы можете видеть, вытаскивает случайные снимки из каталога и просит пользователя сравнить их. После установки значения с помощью ползунка пользователь нажимает кнопку «Next Trial», которая сбрасывает ползунок и пару случайных картинок. Как мне изменить код, чтобы после определенного количества повторений (нажатия кнопок) программа автоматически заканчивалась (желательно с сообщением «Эксперимент»)?Программа остановки MATLAB после X повторений?

Я не могу найти ничего о том, как это сделать в документации 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

Вы пытаетесь повторно реализовать [Hot или нет] (http://en.wikipedia.org/wiki/Hot_or_Not)? – yuk

ответ

3

Одна проблема, которую я вижу в том, что обратный вызов для вашей кнопки «Next» Trial просто вызывает функцию 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)); 
+0

Спасибо! (Я уже изменил часть значения слайдера, я случайно отправил старую версию моего кода, хех). Во всяком случае, отличные предложения, я увижу, как они работают. –

Смежные вопросы