matlab的gui输入矩阵_如何用Matlab GUI编写心理学实验:以词图选择任务为例

本文介绍了如何使用Matlab GUI编写心理学实验,以词图选择任务为例,涵盖实验编程的四个步骤:指导语和刺激材料准备、刺激矩阵生成、实验流程设计及文件分发。通过详细代码示例展示了实验框架和按键响应处理,包括反应时间和正确率的记录以及防止连续按键的控制机制。
摘要由CSDN通过智能技术生成

cb4dc170b28ba6cc2b7eac4c99cfa65c.png

心理学实验编程分为四个步骤:

(1)准备指导语和刺激材料;

(2)刺激矩阵生成;

(3)大框架和每个试次的实验流程;

(4)实验文件和文件夹分发。

我的研究兴趣主要集中在数学认知(Mathematical Cognition)和二语学习(Second-language Learning)。

d8ddb880b89057e5e2a77b99c1f30d76.png

这次我就以语言学习领域中的词图选择任务为例,带大家把整个实验编程的流程过一遍。

(1)准备指导语和刺激材料;

·指导语·

我们先来看这个词图选择任务的指导语的样子:

1464bebcdce7d25756f9e861ca91a2e2.png
词图选择任务的指导语

具体实现的代码:

% 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的图片做任务的刺激材料。

e5c5f0a8cc9f08293fc7a5b36da4bb2a.png
词图选择任务的图片刺激材料

(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)大框架和每个试次的实验流程

词图匹配任务的大框架,如图所示:

3efbfc300e3714c406040f665d84b3f8.png

每个试次的实验流程,如图所示:

9a2922993237ea8f9c2664bc123fa2ce.png

接下来,我们看看怎么通过Matlab GUI来实现大框架的搭建和单个试次的呈现。

先来看大框架的初始化阶段,我们需要在实验一开始呈现一张准备好的指导语图片,这段代码我截了个图:

c2eb4e7691e747b2a0a1a5b07cf36a80.png

因为一开始需要呈现指导语,所以要准备一个文件夹,这里是‘Instructions’来放置指导语图片;

Line6. 新建一个窗口&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值