Domanda

Ho questo programma, che come puoi vedere estrae immagini casuali da una directory e chiede all'utente di confrontarle.Dopo aver impostato il valore con lo slider, l'utente preme un pulsante "Next Trial", che azzera lo slider e la coppia di immagini casuali.Come modifico il codice in modo che, dopo un certo numero di ripetizioni (pressioni di pulsanti), il programma termini automaticamente (preferibilmente con un messaggio "Esperimento terminato")?

Non riesco a trovare nulla su come farlo nella documentazione di MATLAB.Devo impostare una variabile, in modo che ogni volta che si preme il pulsante "1" venga aggiunto al valore della variabile, in modo che quando raggiunge un certo numero (diciamo "100") termina?È questo il modo più semplice per farlo?

Ecco lo 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
È stato utile?

Soluzione

Un problema che vedo qui è che la richiamata per il pulsante "Prossima prova" chiama semplicemente di nuovo la funzione trials. Questo genererà nuovamente le combinazioni di immagini, che vuoi / devi fare solo una volta. Dovresti impostare il callback come un'altra funzione nidificata (come cb) in modo che possa accedere alle combinazioni già generate.

Un altro problema è come inizializzare picture1 e picture2. Dovresti eseguire l'indicizzazione in questo modo:

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

Ora, dovrai prima inizializzare una variabile per tenere traccia del numero di prove all'interno della funzione trials, nonché un numero massimo di prove:

nReps = 1;
maxReps = 100;

Quindi la richiamata del pulsante "Prossima prova" sarebbe simile a questa:

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


Un ulteriore suggerimento ... invece di visualizzare il valore del cursore sullo schermo utilizzando FPRINTF , creerei un oggetto di testo nella tua GUI e aggiornerei semplicemente il suo valore di stringa:

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

%# And in function cb...
set(hText, 'String', sprintf('Slider value: %f', lastVal));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top