心理学实验编程分为四个步骤:
(1)准备指导语和刺激材料;
(2)刺激矩阵生成;
(3)大框架和每个试次的实验流程;
(4)实验文件和文件夹分发。
我的研究兴趣主要集中在数学认知(Mathematical Cognition)和二语学习(Second-language Learning)。
这次我就以语言学习领域中的词图选择任务为例,带大家把整个实验编程的流程过一遍。
(1)准备指导语和刺激材料;
·指导语·
我们先来看这个词图选择任务的指导语的样子:
具体实现的代码:
% filename is:: generateInstruction_Start.m
% clear
clc; clear; close all;
% prepare picFolderName
picFolderName = 'PicturesR';
if ~exist(picFolderName, 'dir')
mkdir(picFolderName);
end
% create a figure
hFigure = figure(1);
set(hFigure, 'position',[100 50 900 600], 'color','w');
% create a uicontrol
hText_Kaishi = uicontrol('Style','Text', 'String','指导语', 'Fontname','Microsoft Yahei', 'Position',[351 500 200 60], 'Fontsize',36, 'Backgroundcolor','w');
%
tmpInstr = sprintf('请您根据上方呈现的单词按键选择对应的图片:n如果是左边图片的意思跟单词对应,请按向左箭头;如果是中间,请按向下箭头;如果是右边,请按向右箭头。');
hText_Content = uicontrol('style','text', 'String',tmpInstr, 'fontname','Microsoft Yahei', 'position',[101 150 700 300], 'fontsize',24, 'backgroundcolor','w', 'HorizontalAlign','left');
tmpGo = '请点击按钮开始正式实验';
hText_Go = uicontrol('style','text', 'HorizontalAlign','center', 'String',tmpGo, 'fontname','Microsoft Yahei', 'position',[101 150 700 40], 'fontsize',24, 'backgroundcolor','w');
% snapshot
hFrame = getframe(gcf);
imgInstruction = hFrame.cdata;
jpgFileName_instruction = 'Instruction_Start_Test.jpg';
jpgPathName_instruction = sprintf('%s/%s', picFolderName, jpgFileName_instruction);
imwrite(imgInstruction, jpgPathName_instruction, 'jpg');
·刺激材料·
在词图选择任务中,图片是事先就准备好的,我们只需要把图片材料拷贝到当前任务的文件夹中即可。这次的图片材料是分10房间保存的,我们选择其中一个房间Kitchen的图片做任务的刺激材料。
(2)刺激矩阵生成
刺激矩阵生成的代码分享如下:
% function --> generate_cjMatrix
function cjMatrix = generate_cjMatrix(ItemNo)
% clear
% clc; clear; close all;
while 1
% define columns
Column_Trial_ID = 1; %
Column_Word_ID = 2; %
Column_Filler1_ID = 3; %
Column_Filler2_ID = 4; %
Column_CorrectA = 5; %
Column_Filler1_Pos = 6; %
Column_Filler2_Pos = 7; %
% define variables
% default
% repeatNo = 1
rFileNo = 10;
ColumnNo = 7;
% ItemNo = 54; % 之后要改成函数的话,项目数是输入参数,是变化的,因此从一开始就要把它的不确定考虑进来
tmpMod = mod(ItemNo,3);
KronNo = (ItemNo - tmpMod)/3;
% 准备第一列 trialID
array_TrialID = 1:ItemNo; array_TrialID = array_TrialID';
% 准备单词列(等同于目标图片列)的项目内容,要求项目ID随机 + filler1图片的项目内容 + filler2图片的项目内容
% get the 3 rand arrays
rand_Array_word = randperm(ItemNo); rand_Array_word = rand_Array_word';
rand_Array_filler1 = randperm(ItemNo); rand_Array_filler1 = rand_Array_filler1';
rand_Array_filler2 = randperm(ItemNo); rand_Array_filler2 = rand_Array_filler2';
% 确定目标和filler1 + filler2的位置信息这一步要稍微复杂一些,因为我们要考虑取余数的问题
% get the Array_CorrectA_Pos
correctA_3 = [1; 2; 3] ;
correctA_3_rand = randperm(3); correctA_3_rand = correctA_3_rand';
modNum = mod(ItemNo,3);
correctA_3_rand_mod = correctA_3_rand(1:modNum);
correctA_array = kron(ones(KronNo,1), correctA_3);
correctA_array_withMod = [correctA_array; correctA_3_rand_mod];
rand_Array = randperm(ItemNo); rand_Array = rand_Array';
tmp_Mat = [correctA_array_withMod rand_Array];
tmp_Mat = sortrows(tmp_Mat,2);
Array_CorrectA_Pos = tmp_Mat(:,1);
% get the Array_Filler1_Pos and Array_Filler2_Pos
Array_Filler1_Pos = Array_CorrectA_Pos + 1;
Array_Filler2_Pos = Array_CorrectA_Pos + 2;
Array_Filler1_Pos(find(Array_Filler1_Pos == 4)) = 1;
Array_Filler2_Pos(find(Array_Filler2_Pos == 4)) = 1;
Array_Filler2_Pos(find(Array_Filler2_Pos == 5)) = 2;
% Matrix
Matrix_7Columns = zeros(ItemNo, ColumnNo);
Matrix_7Columns(:,1) = array_TrialID;
Matrix_7Columns(:,2) = rand_Array_word;
Matrix_7Columns(:,3) = rand_Array_filler1;
Matrix_7Columns(:,4) = rand_Array_filler2;
Matrix_7Columns(:,5) = Array_CorrectA_Pos;
Matrix_7Columns(:,6) = Array_Filler1_Pos;
Matrix_7Columns(:,7) = Array_Filler2_Pos;
%
State_Check = 0;
for i_Line = 1:ItemNo
if (Matrix_7Columns(i_Line, Column_Word_ID) == Matrix_7Columns(i_Line, Column_Filler1_ID) || Matrix_7Columns(i_Line, Column_Word_ID) == Matrix_7Columns(i_Line, Column_Filler2_ID) || Matrix_7Columns(i_Line, Column_Filler1_ID) == Matrix_7Columns(i_Line, Column_Filler2_ID))
State_Check = State_Check + 1;
end
end
if State_Check == 0
break;
end
end
cjMatrix = Matrix_7Columns;
end
(3)大框架和每个试次的实验流程
词图匹配任务的大框架,如图所示:
每个试次的实验流程,如图所示:
接下来,我们看看怎么通过Matlab GUI来实现大框架的搭建和单个试次的呈现。
先来看大框架的初始化阶段,我们需要在实验一开始呈现一张准备好的指导语图片,这段代码我截了个图:
因为一开始需要呈现指导语,所以要准备一个文件夹,这里是‘Instructions’来放置指导语图片;
Line6. 新建一个窗口&