Question

J'ai ce programme qui, comme vous pouvez le voir, retire des images aléatoires d'un répertoire et demande à l'utilisateur de les comparer. Après avoir réglé la valeur avec le curseur, l'utilisateur appuye sur un bouton "essai suivant", qui réinitialise le curseur et la paire d'images aléatoires. Comment modifier le code afin qu'après un certain nombre de répétitions (pressions sur les bouton), le programme se termine automatiquement (de préférence avec un message "Expérience terminé")?

Je ne trouve rien sur la façon de procéder dans la documentation MATLAB. Dois-je définir une variable, de sorte que chaque fois que le bouton est enfoncé "1" est ajouté à la valeur de la variable, de sorte que lorsqu'il atteint un certain nombre (dire "100"), il se termine? Est-ce la façon la plus simple de faire cela?

Voici le 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
Était-ce utile?

La solution

Un problème que je vois ici est que le rappel de votre bouton "prochain essai" appelle simplement la fonction trials encore. Cela va générer à nouveau les combinaisons d'images, ce que vous voulez / devez faire une seule fois. Vous devez définir le rappel pour être une autre fonction imbriquée (comme cb) afin qu'il puisse accéder aux combinaisons déjà générées.

Un autre problème est la façon dont vous initialisez picture1 et picture2. Vous devriez faire votre indexation comme tel:

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

Maintenant, vous voudrez d'abord initialiser une variable pour suivre le nombre d'essais à l'intérieur de la fonction trials, ainsi qu'un nombre maximum d'essais:

nReps = 1;
maxReps = 100;

Ensuite, votre rappel de bouton "Next Trial" ressemblerait à ceci:

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


Une suggestion supplémentaire ... au lieu d'afficher la valeur du curseur à l'écran en utilisant Fprintf, Je créerais un objet texte dans votre interface graphique et je mets simplement à jour sa valeur de chaîne:

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

%# And in function cb...
set(hText, 'String', sprintf('Slider value: %f', lastVal));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top