2015-03-30 6 views
0

Я очень новичок в Matlab, но очень хочу улучшить. Для моего эксперимента я хочу показать картинку, на которую ответчик да/нет, используя два разных ключа (f & g), и затем отображается следующая фотография, и она повторяется так далее.Повторные испытания в MatLab

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

это мой код до сих пор

function try1_6() 

cleanupObj= onCleanup(@() myCleanupFxn); 

% PRETEST 
% Initialize screen with black background 
winID = Screen('openWindow',0, [0 0 0]); 

%Parameter 
backcol=255; 
textcol=0; 

% Load image file(s) 
structimages= []; 
TheImagesdir = dir('theImagesdir/*.jpg'); 
for i=1: length(TheImagesdir); 
    TheImages = imread(['theImagesdir/' TheImagesdir(i).name], 'JPEG'); 

    % Get width and height 
    imageX = size(TheImages,2); 
    imageY = size(TheImages,1); 

    % Convert to texture 
    myTexture = Screen('MakeTexture', winID, TheImages); 

    % Set destination rectangle 
    destRect = [50 100 50+imageX 100+imageY]; 

    %save to structure 
    structimages(end+1).filename=TheImagesdir(i).name; 
    structimages(end).destRect= destRect; 
    structimages(end).texture= myTexture; 
end 

%Make triallist 
numberOfItems= [5]; %list of all possible items 
Nrepeats=4; 
Response=0; 
TrialList=HH_mkTrialList({numberOfItems Response},Nrepeats); 


%PRESENTATION 

for trialnum=1:size(TrialList,1) 
    nitems = TrialList(trialnum,1); 

    Screen('FillRect', winID,backcol); % makes the screen blank 

    %displays text 
    DrawFormattedText(winID,'dkjfghaslkdfglksdjgfh','center','center',textcol); 
    Screen('Flip', winID) 
    HH_waitForKeyPress({'space'}); % waits for spacebar to be pressed 
    Screen('FillRect',winID,backcol); 
    Screen('Flip',winID); 
    WaitSecs(1); 

    %display picture 
    whichTheImages= randi(length(TheImagesdir)); % randomly selects image for directory 
    Screen('FillRect',winID,backcol); 
    Screen('DrawTexture', winID, myTexture, [], destRect); 

    Screen('Flip', winID); 
    HH_waitForKeyPress({'f','j'},5) 

    if resp==-1 
     break 
    end 

    TrialList(trialnum,4)= response; %records response 

end 

end 

function myCleanupFxn() 
    Screen('CloseAll') 
end 
+1

Одна очень важная вещь, которую вы забыли упомянуть о том, что вы используете [Psychtoolbox] (http://psychtoolbox.org/) для материала экрана. – Setsu

+0

Кроме того, введите свой код правильно. Тело блоков 'try' и' for' должно быть отступом на вкладке. Кроме того, не оберните все это гигантской «попыткой». – Setsu

+0

Это не полный вопрос.'HH_mkTrialList' и' HH_waitForKeyPress' являются и обычными методами, которые вы не объяснили, что они делают. См. [This] (http://stackoverflow.com/help/how-to-ask) руководство для размещения вопросов на этом сайте. – Setsu

ответ

0

Есть целый ряд проблем, связанных с вами код, который вам нужно обратиться. Прежде всего, TrialList используется до того, как он будет объявлен/инициализирован. Блок кода Make triallist кажется неуместным в корпусе петли for и, вероятно, должен быть помещен перед вашим циклом TrialList.

Ваша вторая проблема - это внутренний цикл for, который загружает изображения. Прямо сейчас, он загружает каждое изображение, найденное в каталоге, на каждом испытании! Нет причин для этого, и вы должны помещать этот цикл for вне пробного цикла. Кроме того, ваш исходный код никогда не работал так, как предполагалось, потому что вы никогда не сохраняете загруженную текстуру нигде; myTexture будет перезаписано последним изображением в вашей папке, и это единственная текстура, которую вы когда-либо получите. Поэтому в дополнение к предварительной загрузке изображений перед циклом вам необходимо сохранить их в структуре данных, чтобы вы могли использовать их позже в тестовом цикле. Простой struct будет работать хорошо здесь:

structImages = []; 
TheImagesdir = dir('theImagesdir/*.jpg'); 
for i = 1:length(TheImagesdir); 
    TheImages = imread(['theImagesdir/' TheImagesdir(i).name], 'JPEG'); 

    % Get width and height 
    imageX = size(TheImages,2); 
    imageY = size(TheImages,1); 

    % Convert to texture 
    myTexture = Screen('MakeTexture', winID, TheImages); 

    % Set destination rectangle 
    destRect = [50 100 50+imageX 100+imageY]; 

    %save to structure 
    structImages(end+1).filename = TheImagesdir(i).name; 
    structImages(end).destRect = destRect; 
    structImages(end).texture = myTexture; 
end 

Есть и другие несоответствия в коде:

  1. whichTheIamges определен, но не используется
  2. resp используется в сравнении if resp==-1, но не определен
  3. response сохраняется до TrialList до его определения

И, наконец, самая большая проблема: Screen('CloseAll', winID); находится внутри пробного цикла, поэтому после первого испытания вы сбрасываете всю платформу презентации.

FYI, как отмечено в моем комментарии, обертывание всего вашего скрипта в блоке try - это действительно плохая практика. Я подозреваю, что вы это делаете, потому что хотите иметь возможность Ctrl + C mid-task, но есть лучший способ сделать это. Если вы сделаете весь свой скрипт функцией, вы можете использовать метод onCleanup для выполнения кода всякий раз, когда ваша функция завершается (как правило, по ошибке, или по прерыванию). Метод выглядит следующим образом:

function myScript() 
%//make your script a function. There is an additional advantages to doing this: 
%//function performance is better than script performance. 

%//blah-blah-blah 

%//setup the cleanup object before opening screen 
cleanupObj = onCleanup(@() myCleanupFxn); 

%//open the screen 
winID = Screen('openWindow',0, [0 0 0]); 

%//blah-blah-blah 

end 

function myCleanupFxn() 
    %//local function, not visible outside of this file 
    Screen('CloseAll'); 
end 
+0

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

+0

@MDruyvesteyn Пожалуйста, ознакомьтесь с практическим руководством по заданию вопросов. Каждый вопрос должен иметь что-то конкретное, а не только «мой код не работает». – Setsu

+0

oke, плохо повторите попытку: как я могу получить программу для повторения/цикла моего пробного периода? в конечном счете, я хочу, чтобы изображение + нажало клавишу, повторяйте это несколько раз и запишите ответ нажатия клавиши –

Смежные вопросы