Frage

Ich habe dieses Programm, das, wie Sie sehen, zufällige Bilder aus einem Verzeichnis holt und den Benutzer auffordert, sie zu vergleichen.Nachdem der Wert mit dem Schieberegler eingestellt wurde, drückt der Benutzer die Schaltfläche „Nächster Versuch“, wodurch der Schieberegler und das zufällige Bildpaar zurückgesetzt werden.Wie ändere ich den Code so, dass das Programm nach einer bestimmten Anzahl von Wiederholungen (Tastendrücken) automatisch endet (vorzugsweise mit der Meldung „Experiment beendet“)?

Ich kann in der MATLAB-Dokumentation nichts darüber finden, wie das geht.Muss ich eine Variable so festlegen, dass bei jedem Drücken der Schaltfläche „1“ zum Wert der Variablen addiert wird, sodass sie beendet wird, wenn sie eine bestimmte Zahl (z. B. „100“) erreicht?Ist das der einfachste Weg, dies zu tun?

Hier ist das Skript:

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
War es hilfreich?

Lösung

Ein Problem, das ich hier sehe, ist, dass der Rückruf für Ihre Schaltfläche „Nächster Test“ einfach die Funktion aufruft trials wieder.Dadurch werden die Bildkombinationen erneut generiert, was Sie nur einmal tun möchten/müssen.Sie sollten den Rückruf auf eine andere verschachtelte Funktion festlegen (z. B cb), damit auf die bereits generierten Kombinationen zugegriffen werden kann.

Ein weiteres Problem besteht darin, wie Sie initialisieren picture1 Und picture2.Sie sollten Ihre Indizierung folgendermaßen durchführen:

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

Nun möchten Sie zunächst eine Variable initialisieren, um die Anzahl der Versuche innerhalb der Funktion zu verfolgen trials, sowie eine maximale Anzahl von Versuchen:

nReps = 1;
maxReps = 100;

Dann würde Ihr Rückruf auf die Schaltfläche „Nächster Test“ etwa so aussehen:

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


Noch ein zusätzlicher Vorschlag...anstatt den Schiebereglerwert mit auf dem Bildschirm anzuzeigen FPRINTF, würde ich ein Textobjekt in Ihrer GUI erstellen und einfach seinen String-Wert aktualisieren:

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

%# And in function cb...
set(hText, 'String', sprintf('Slider value: %f', lastVal));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top