Pergunta

Tenho este programa que, como você pode ver, extrai imagens aleatórias de um diretório e pede ao usuário para compará-las.Depois de definir o valor com o controle deslizante, o usuário pressiona o botão "Próximo teste", que redefine o controle deslizante e o par de imagens aleatórias.Como modifico o código para que, após um certo número de repetições (pressionamentos de botões), o programa termine automaticamente (de preferência com uma mensagem "Experiência encerrada")?

Não consigo encontrar nada sobre como fazer isso na documentação do MATLAB.Preciso definir uma variável, de modo que toda vez que o botão for pressionado "1" seja adicionado ao valor da variável, de modo que quando atingir um certo número (digamos "100") ela termine?Essa é a maneira mais fácil de fazer isso?

Este é o script:

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
Foi útil?

Solução

Um problema que vejo aqui é que o retorno de chamada para o botão "Próxima avaliação" simplesmente chama a função trials novamente. Isso vai gerar as combinações de imagens novamente, o que você só deseja / precisa fazer uma vez. Você deve definir o retorno de chamada para ser outra função aninhada (como cb) para que ele possa acessar as combinações já geradas.

Outro problema é como inicializar picture1 e picture2. Você deve fazer sua indexação assim:

picture1 = files(index(1,1)).name;  %# Note that index is 2-dimensional!
picture2 = files(index(1,2)).name;

Agora, você deseja primeiro inicializar uma variável para rastrear o número de tentativas dentro da função trials, bem como um número máximo de tentativas:

nReps = 1;
maxReps = 100;

Então, o retorno de chamada do botão "Próxima avaliação" seria mais ou menos assim:

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


Uma sugestão adicional ... em vez de exibir o valor do controle deslizante na tela usando FPRINTF , eu criaria um objeto de texto em sua GUI e simplesmente atualizaria seu valor de string:

hText = uicontrol('Style', 'text', ...
                  'String', 'Slider value: 25', ... );

%# And in function cb...
set(hText, 'String', sprintf('Slider value: %f', lastVal));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top