解説5

dlmwrite(fileName, results, 'delimiter', ',', 'precision', 6);

実験の結果をファイルに出力している部分です。実験の結果は行列resultsに入っています。区切り文字(delimiter)としてカンマを使います。数値の精度(precision)は6で、6桁の10進数という意味です。

dlmwriteコマンドの代わりに、xlswriteコマンドを使うこともできます。

performance_errors=mean(results(results(:,9)~=66,9));

performance_errorsには、正答率が代入されます。

行列resultsの9列目には、回答が正解だったら1、不正解だったら0、"s"または"d"以外の回答だったら66が代入されています。

results(:,9)~=66

は行列resultsの9列目が66だったら0を、66以外の値だったら1を返す。

したがって、results(results(:,9)~=66,9)は、行列resultsの9列目において、66以外の値(つまり、正解、不正解に関わらず適切に回答した場合)だけを抽出して列ベクトルとして返します。

例えば簡単な例として、Matlabのコマンドウィンドウで次のようなことをしてみると意味が分かると思います。これは行列aの1列目のうち、行列aの2列目が3となっていない値を返します。

a=[1,2,3; 2,3,4; 3,4,5]

a(:,2)~=3

a(a(:,2)~=3,1)

meanは、引数のベクトルの平均値を返します。例えば10試行中の8試行を正しく回答した場合、meanの引数となるベクトルは、1を8個、0を2個持っています。ベクトルの平均値 8 / 10 が正答率になりますね。

解説4で触れていますが、anscorrect = 66; の代わりに anscorrect = subID; としている場合は、

performance_errors=mean(results(results(:,9)~=subID,9));

とする必要がありますのでご注意ください。

DrawFormattedText(expWin, ['You were correct in ' num2str(performance_errors*100,2) '% of trials.\nThank you for participating!'], 'center', 'center');
Screen('Flip', expWin);
KbWait([], 2); %wait for keystroke

実験参加者に正答率を告げるメッセージを呈示します。KbWaitを呼び出すことで、実験参加者がいずれかのキーを押すまでメッセージを呈示し続けることができます。

num2str(performance_errors*100,2) は、performance_errorsを100倍した値(%で呈示するために100倍にしている)、2桁の数値精度で文字列に変換します。

ShowCursor;

HideCursorでカーソルを消していた場合は、ShowCursorを呼び出してカーソルが見えるようにします。

sca;

実験で使用したウィンドウを閉じます。Screen('CloseAll');と同じ意味です。

ListenChar(0);

プログラムの前半で、ListenChar(2);としてキーボードの入力を受け付けない状態にしていますから、ここでキーボードの入力を有効にします。

Screen('Preference', 'VisualDebuglevel', olddebuglevel);

olddebuglevel=Screen('Preference', 'VisualDebuglevel', 3);を呼び出したときには、このようにして元のデバッグレベルに戻します。

以上で、MullerLyerのサンプルプログラムの解説を終わります。お疲れさまでした。

このプログラムを元にすれば、大部分の心理学実験のプログラムを作成することができるかと思います。

がんばってオリジナルのプログラムを作成してくださいね。