画像ファイルの呈示に変更点を加えて、実験らしくしたものです。
スペースキーを押すと凝視点が呈示され、指定した時間後に画像が呈示されます。
FまたはJのキーを押すと、どちらのキーを押したか、その反応時間が記録されます。
特定のフォルダ(以下のサンプルではimages)に保存しているすべてのJPEG画像を呈示すると実験が終わります。
(繰り返しも可能)
画像のファイル名をプログラム内で指定せずに、自動的に取得しています。あるディレクトリ(フォルダ)内のファイルのリストを取得する を参照してください。
function imageRT% スペースキーを押すと凝視点が呈示され、指定した時間後に画像が呈示される。% FまたはJのキーを押すと、どちらのキーを押したか、その反応時間が記録される。%% 画像(ファイル形式はJPEG)はプログラムと同じ場所に「images」という名前のフォルダを作り、その中に保存しておくこと。% 1ブロックの試行数はフォルダ内の画像数で、repeatNumを使って繰り返し回数を指定可能。%----------------------------------------%  以下の変数を必要に応じて変更してください%% 背景色 bgColor = [128 128 128]; %RGBの値% 画像を拡大縮小して呈示するときの割合。1のときオリジナルのサイズ(小数点OK)imgRatio = 1; % 繰り返し回数repeatNum = 1;% 何試行ごとに休憩メッセージを表示するかrestNum = 4;%---------------------------------% 凝視点fixTime = 0.75; %凝視点の提示時間(単位は秒。小数点OK)fixLength = 30; %凝視点線分の長さ(単位はピクセル。整数)%凝視点の座標fixApex = [  fixLength/2, -fixLength/2, 0, 0;  0, 0, fixLength/2, -fixLength/2];fontSize = 30; % 文字サイズ(整数)%---------------------------------% 実験参加者名の入力SubName = input('Name? ', 's'); % 名前をたずねるif isempty(SubName) % 名前の入力がなかったらプログラムを終了    return;end;% 出力ファイルの上書き確認を行うSaveFileName=[SubName '.csv']; % 出力ファイル名if exist(SaveFileName, 'file') % すでに同じ名前のファイルが存在していないかの確認    resp=input([SaveFileName 'はすでに存在します。上書きをしてよい場合は y を入力してエンターキーを押してください。'], 's');    if ~strcmp(resp,'y')         disp('プログラムを強制終了しました。')        return    endend% 呼び出しておいたほうがよい関数たち。AssertOpenGL; KbName('UnifyKeyNames');ListenChar(2); % Matlabに対するキー入力を無効%myKeyCheck; % 外部ファイルGetSecs;WaitSecs(0.1);rand('state', sum(100*clock)); % 古いMatlab%rng('shuffle') % 新しいMatlab    HideCursor;%---------------------------------try      % 刺激を呈示するディスプレイ(ウィンドウ)の設定    screenNumber = max(Screen('Screens'));        % デバッグ用。ウィンドウでの呈示    %[windowPtr, windowRect] = Screen('OpenWindow', screenNumber, bgColor, [10 50 750 550]);    % 実験用。フルスクリーン    [windowPtr, windowRect] = Screen('OpenWindow', screenNumber, bgColor);      % 1フレームの時間 (inter flame interval)    ifi = Screen('GetFlipInterval', windowPtr);        %画面の中央の座標    [centerPos(1), centerPos(2)] = RectCenter(windowRect);       % 画像はimagesという名前のフォルダに保存しておくこと。    imgFolder = ['images' filesep]; % 画像を保存しているフォルダ名    imgFileList = dir([imgFolder '*.jpg']);       imgNum = size(imgFileList, 1); % フォルダ内の画像の枚数               %------------------------------    % フォント設定    if IsWin        %Screen('TextFont', windowPtr, 'メイリオ');        Screen('TextFont', windowPtr, 'Courier New');    end;       if IsOSX        % DrawHighQualityUnicodeTextDemoを参照。        allFonts = FontInfo('Fonts');        foundfont = 0;        for idx = 1:length(allFonts)            %if strcmpi(allFonts(idx).name, 'Hiragino Mincho Pro W3')            if strcmpi(allFonts(idx).name, 'Hiragino Kaku Gothic Pro W3')                foundfont = 1;                break;            end        end        if ~foundfont            error('Could not find wanted japanese font on OS/X !');        end        Screen('TextFont', windowPtr, allFonts(idx).number);         end;    %------------------------------                  % 出力ファイルを開く    Fid = fopen(SaveFileName, 'wt');        fprintf(Fid, '%s\n', SubName);    fprintf(Fid, '%s\n', datestr(now, 'yy-mmdd-HH:MM'));    fprintf(Fid, '%s\n', '');    fprintf(Fid, 'imgRatio,%f\n', imgRatio);    fprintf(Fid, 'fixTime,%f\n', fixTime);    fprintf(Fid, 'fontSize,%d\n', fontSize);    fprintf(Fid, 'ifi (ms),%f\n', ifi * 1000);    fprintf(Fid, '%s\n', '');    tmpStr = '繰り返し,試行,ファイル名,反応時間(ms),凝視点(ms)';    fprintf(Fid, '%s\n', tmpStr);        trialNum = 0; % 現在の試行数        for k = 1: repeatNum % ブロックの繰り返し        order = randperm(imgNum); % ランダムに呈示するため                for i = 1 : imgNum % 1ブロックの試行数はフォルダ内の画像数                        % ファイル名の設定            imgFileName = char(imgFileList(order(i)).name); % 画像のファイル名(フォルダ情報なし)            imgFileName2 = [imgFolder imgFileName]; % 画像のファイル名(フォルダ情報あり)                                 %画像の読み込み            imdata = imread(imgFileName2, 'jpg');            %画像サイズの幅(ix)が列の数に相当し、画像サイズの高さ(iy)が行の数の相当。            [iy, ix, id] = size(imdata);            % 画像の情報をテクスチャに。            imagetex = Screen('MakeTexture', windowPtr, imdata);                        Screen('TextSize', windowPtr, fontSize);            if (trialNum ~= 0) && mod(trialNum, restNum) == 0 % 条件を満たしたら休憩。                DrawFormattedText(windowPtr, double('休憩をして下さい。スペースキーで再開です。'), 'center', 'center', [255 255 255]);            else                DrawFormattedText(windowPtr, double('スペースキーを押して下さい。'), 'center', 'center', [255 255 255]);            end;                            Screen('Flip', windowPtr); % 画面にメッセージを呈示                        while KbCheck; end; % いずれのキーも押していないことを確認            while 1 % while 文の中をぐるぐる回ります。                [ keyIsDown, keyTime, keyCode ] = KbCheck; % キーが押されたか、そのときの時間、どのキーか、の情報を取得する                if keyIsDown                    if keyCode(KbName('ESCAPE'))                        error('ESCキーが押されました'); % 強制終了                    end                    if keyCode(KbName('SPACE')) %                         break; % while文を抜ける。                    end;                    while KbCheck; end;                                    end;            end;                                  % 凝視点の呈示            Screen('DrawLines', windowPtr, fixApex, 4, [0 0 0], centerPos, 0);            vbl1 = Screen('Flip', windowPtr); % vbl1は凝視点を呈示した時間            % 画像の呈示            tmp = [ix, iy]*imgRatio;            Screen('DrawTexture', windowPtr, imagetex, [], [centerPos - tmp/2, centerPos + tmp/2]);            vbl2 = Screen('Flip', windowPtr, vbl1 + fixTime - ifi / 2); % vbl1からfixTime秒後に刺激画像を画面に呈示                        % 回答を待つ            while KbCheck; end; % いずれのキーも押していないことを確認            while 1 % while 文の中をぐるぐる回ります。                [ keyIsDown, keyTime, keyCode ] = KbCheck; % キーが押されたか、そのときの時間、どのキーか、の情報を取得する                if keyIsDown                    if keyCode(KbName('F'))                        kaito = 1;                        break;                    end;                                        if keyCode(KbName('J'))                        kaito = 2;                        break;                    end;                                        % キーを離したかどうかの確認                    while KbCheck; end                end;            end;                                    % データの記録(1行にまとめて書いてもよい)            fprintf(Fid, '%d,%d,%s,%d', k, i, imgFileName, kaito);            fprintf(Fid, '%f,%f\n', (keyTime - vbl2) * 1000, (vbl2 - vbl1) * 1000);                        trialNum = trialNum + 1;            Screen('Close'); % テクスチャ情報を破棄        end;    end;    DrawFormattedText(windowPtr, double('実験は終わりです。'), 'center', 'center');    Screen('Flip', windowPtr);    KbWait([], 3);     %終了処理    fclose(Fid); % ファイルを閉じる。    Screen('CloseAll');    ShowCursor;    ListenChar(0); catch % 以下はプログラムを中断したときのみ実行される。    if exist('Fid', 'var') % ファイルを開いていたら閉じる。        fclose(Fid);        disp('fclose');    end;        Screen('CloseAll');    ShowCursor;    ListenChar(0);    psychrethrow(psychlasterror);end