Как заставить петли работать быстрее - Psychtoolbox в matlab - PullRequest
0 голосов
/ 04 сентября 2018

Я создал код MATLAB, используя Psychtoolbox, чтобы провести эксперимент. Все работает как я задумал, но кажется, что первоначальная загрузка эксперимента занимает слишком много времени. Задача представляет собой простую задачу ответа «да / нет», появилось ли целевое слово («зонд») в предыдущем наборе слов стимулов.

Я помещаю основной вводный текст в виде изображения, а затем жду, пока любое нажатие клавиши не начнет эксперимент, но на самом деле потребуется около 40 секунд, чтобы начать первое испытание после любого нажатия клавиши. Я хочу, чтобы все работало без задержек. Он должен начать свое первое испытание сразу после любого нажатия клавиши.

Я проверил временные вершины с помощью GetSecs () на многочисленных позициях в коде, и это не имело никакого отношения к загрузке стимулов или начальной настройке эксперимента перед циклом for, который я прикрепил ниже.

Чтобы все выглядело проще, я изменил некоторые переменные на фактические числа, которые я использовал. Я могу гарантировать, что это не из-за большого размера стимулов, так как это всего 1500 слов. Как только цикл for запускается, он идет гладко, но на самом деле для начала первого испытания требуется 40 секунд, поэтому я думаю, что это связано с определенной функцией в цикле for или способом, которым я ее построил.

Пожалуйста, дайте мне знать, если что-то слишком расплывчато или неясно. Я сделаю все возможное, чтобы все стало лучше.

Редактировать: я минимизировал код, оставив только имена функций, используемые в Psychtoolbox. Я оставил функции между циклами, чтобы вы знали, могут ли они вызвать задержку. Это не будет возможно выполнить без установленного Psychtoolbox, поэтому я думаю, что вы можете кратко изучить структуру кода.

for trial = 1:250
    for i = 1:6 
        DrawFormattedText();
        Screen();
        WaitSecs(0.5);
    end
    DrawFormattedText();      
    flipTime = Screen();
    WaitSecs(0.5);
    DrawFormattedText();
    flipTime = Screen();
    rt = 0;
    resp = 0;
        while GetSecs - flipTime < 3
            clear keyCode;
            RestrictKeysForKbCheck();
            [keyIsDown,secs,keyCode] = KbCheck;
            respTime = GetSecs;
            pressedKeys = find(keyCode);
            % ESC key quits the experiment
            if keyCode(KbName('ESCAPE')) == 1
                clear all
                close all
                sca
                return
            end
            % Check for response keys
            if ~isempty(pressedKeys)
                for i = 1:2
                    if KbName(i) == pressedKeys(1)
                        resp = i;
                        rt = respTime - flipTime;
                    end
                end
            end
            % Exit loop once a response is recorded
            if rt > 0
                break;
            end
        end
    if rt == 0 || rt > 3 % 3 second limit for subjects to react to the probe stimuli
       DrawFormattedText(); 
       Screen();
       WaitSecs(1);
    end
    Screen();
    vbl = Screen();
    WaitSecs(1);
    % Record the trial data into output data matrix
    respMat{1, trial} = trial;
    respMat{2, trial} = resp;
    respMat{3, trial} = rt;
end
...