Pregunta

Tengo este programa que, como puede ver, extrae imágenes aleatorias de un directorio y le pide al usuario que las compare.Después de establecer el valor con el control deslizante, el usuario presiona el botón "Siguiente prueba", que restablece el control deslizante y el par de imágenes al azar.¿Cómo modifico el código para que, después de un cierto número de repeticiones (pulsaciones de botones), el programa finalice automáticamente (preferiblemente con un mensaje de "Experimento terminado")?

No puedo encontrar nada sobre cómo hacer esto en la documentación de MATLAB.¿Necesito establecer una variable, de modo que cada vez que se presione el botón "1" se agregue al valor de la variable, de modo que cuando alcance un cierto número (digamos "100") termine?¿Es esa la forma más sencilla de hacer esto?

Aquí está el guión:

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
¿Fue útil?

Solución

Un problema que veo aquí es que la devolución de llamada para el botón "Siguiente prueba" simplemente vuelve a llamar a la función trials. Esto generará las combinaciones de imágenes nuevamente, lo que solo desea / necesita hacer una vez. Debe configurar la devolución de llamada para que sea otra función anidada (como cb) para que pueda acceder a las combinaciones ya generadas.

Otro problema es cómo se inicializa picture1 y picture2. Debería hacer su indexación así:

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

Ahora, primero querrá inicializar una variable para rastrear el número de intentos dentro de la función trials, así como un número máximo de intentos:

nReps = 1;
maxReps = 100;

Entonces la devolución de llamada del botón "Siguiente prueba" se vería así:

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


Una sugerencia adicional ... en lugar de mostrar el valor del control deslizante en la pantalla mediante FPRINTF , crearía un objeto de texto en su GUI y simplemente actualizaría su valor de cadena:

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

%# And in function cb...
set(hText, 'String', sprintf('Slider value: %f', lastVal));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top