被试内设计:自变量1(阶段:辨别学习阶段/反转阶段)*自变量2(框架:积极/消极)*自变量3(反馈程度:部分反馈/完全反馈) •总共有4组两两成对出现的图片,组合1为积极框架下完全反馈的刺激,组合2是积极框架下部分反馈的刺激,组合3是消极框架下完全反馈的刺激,组合4是消极框架下部分反馈的刺激,电脑会一左一右的呈现图片刺激,被试按“F”键代表选择左边,按“J”键代表选择右边。第一个Run为辨别学习阶段,选择pos_1和pos_3是高奖赏概率,选择neg_1和neg_3是高惩罚概率。第二个Run为反转阶段,选择pos_1和pos_3是低奖赏概率,选择neg_1和neg_3是低惩罚概率。且每种组合中的两张图片收入或损失情况是独立的,如一个trial中pos_1收入+10并不代表pos_2就一定+0。 %% This is a main function to call other functions %% step01: collect information of participants name=inputdlg('请输入姓名','被试姓名',[1 60],{'abc'}); ID=inputdlg('请输入编号','被试id',[1 60],{'101'}); gender=inputdlg('请输入性别,男1,女2','被试性别',[1 60],{'2'}); ID=str2num(char(ID)); gender=str2num(char(gender)); %% step02: creat a main window [wname,HC,VC,slack]=creat_mainwindow; %% step03: to get initial parameters [stim_w,exp_seq,RT,ACC,tn,stim_dur,j_dur,startK,redK,greenK]=predata(wname); %% step04: present instructions getready(startK,HC,VC,wname); %% step05: present stimuli t=GetSecs;%获取当前时刻 end %% step 06: save data to the disk abc=fix(clock); path=pwd; if gender==1 fidraw=fopen([path '\Data\stroop_' char(name) '_' num2str(ID) '_' num2str(abc(4)) '_' num2str(abc(5)) '_Male.txt'],'a'); elseif gender==2 fidraw=fopen([path '\Data\stroop_' char(name) '_' num2str(ID) '_' num2str(abc(4)) '_' num2str(abc(5)) '_Female.txt'],'a'); end fprintf(fidraw,'Date \t Name \t ID \t Gender \t Trial \t condition \t stim_id \t color_id \t RT \t ACC \t ITI \t \n'); collect_data(name,ID,gender,RT,ACC,exp_seq,tn,j_dur,fidraw); %% step07: close window Screen('CloseAll'); sca fclose('all'); 根据题目,修改以上的主函数编码以及补充step05主函数的编码,Matlab
时间: 2024-01-29 20:03:25 浏览: 133
根据题目描述,需要编写一个被试内设计的实验程序。以下是主函数的修改和补充:
```
function main()
% Collect participant information
name = inputdlg('请输入姓名', '被试姓名', [1 60], {'abc'});
ID = inputdlg('请输入编号', '被试id', [1 60], {'101'});
gender = inputdlg('请输入性别,男1,女2', '被试性别', [1 60], {'2'});
ID = str2num(char(ID));
gender = str2num(char(gender));
% Create a main window
[wname,HC,VC,slack] = creat_mainwindow();
% Get initial parameters
[stim_w, exp_seq, RT, ACC, tn, stim_dur, j_dur, startK, redK, greenK] = predata(wname);
% Present instructions
getready(startK,HC,VC,wname);
% Present stimuli
for i = 1:length(exp_seq)
% Get current time
t = GetSecs();
% Present stimulus
stim_id = exp_seq(i);
[color_id, condition] = get_stim_info(stim_id);
present_stimulus(stim_w, stim_id, color_id, stim_dur);
% Get response and record data
[response, rt, acc] = get_response(color_id, RT);
iti = present_feedback(acc, j_dur, redK, greenK);
record_data(name, ID, gender, i, condition, stim_id, color_id, rt, acc, iti);
end
% Close window and save data to disk
Screen('CloseAll');
sca;
fclose('all');
function [color_id, condition] = get_stim_info(stim_id)
% Get color and condition information for current stimulus
if stim_id == 1 || stim_id == 3
condition = 'positive';
else
condition = 'negative';
end
if mod(stim_id, 2) == 1
color_id = 'left';
else
color_id = 'right';
end
function present_stimulus(stim_w, stim_id, color_id, stim_dur)
% Present stimulus on screen
if strcmp(color_id, 'left')
Screen('DrawTexture',stim_w{1},stim_id,[],HC,VC);
Screen('Flip',stim_w{1});
else
Screen('DrawTexture',stim_w{2},stim_id,[],HC,VC);
Screen('Flip',stim_w{2});
end
WaitSecs(stim_dur);
function [response, rt, acc] = get_response(color_id, RT)
% Get participant response
while 1
[keyIsDown, t, keyCode] = KbCheck;
if keyIsDown
response = KbName(keyCode);
rt = t - RT;
if strcmp(color_id, 'left')
if strcmp(response, 'f')
acc = 1;
else
acc = 0;
end
else
if strcmp(response, 'j')
acc = 1;
else
acc = 0;
end
end
break;
end
end
function iti = present_feedback(acc, j_dur, redK, greenK)
% Present feedback on screen
if acc == 1
Screen('DrawTexture',greenK);
else
Screen('DrawTexture',redK);
end
Screen('Flip');
WaitSecs(j_dur);
iti = j_dur;
function record_data(name, ID, gender, trial, condition, stim_id, color_id, rt, acc, iti)
% Save trial data to disk
abc = fix(clock);
path = pwd;
if gender == 1
fidraw = fopen([path '\Data\stroop_' char(name) '_' num2str(ID) '_' num2str(abc(4)) '_' num2str(abc(5)) '_Male.txt'],'a');
else
fidraw = fopen([path '\Data\stroop_' char(name) '_' num2str(ID) '_' num2str(abc(4)) '_' num2str(abc(5)) '_Female.txt'],'a');
end
fprintf(fidraw, '%s \t %s \t %d \t %d \t %d \t %s \t %d \t %s \t %f \t %d \t %f \t \n', date, char(name), ID, gender, trial, condition, stim_id, color_id, rt, acc, iti);
fclose(fidraw);
```
在以上代码中,我们添加了一个 `get_stim_info` 函数,用于根据当前刺激的编号获取其颜色和条件信息。然后,我们编写了一个 `present_stimulus` 函数,用于在屏幕上呈现刺激,并且根据颜色信息在左边或右边的窗口中呈现。接着,我们编写了一个 `get_response` 函数,用于获取被试的反应,并且计算其响应时长和准确率。然后,我们编写了一个 `present_feedback` 函数,用于在屏幕上呈现反馈。最后,我们编写了一个 `record_data` 函数,用于将每个试次的数据保存到磁盘上。
需要注意的是,在 `present_stimulus` 函数中,我们使用了 `strcmp` 函数来比较字符串,而在 `get_response` 函数中,我们使用了 `KbName` 函数来将按键码转换为按键名。此外,在 `record_data` 函数中,我们使用了 `date` 函数来获取当前日期。
在 `step05` 中,我们需要编写一个主函数调用 `present_stimulus` 函数呈现刺激。具体代码如下:
```
function step05(stim_w, exp_seq, stim_dur)
% Present stimuli
for i = 1:length(exp_seq)
% Get current time
t = GetSecs();
% Present stimulus
stim_id = exp_seq(i);
[color_id, condition] = get_stim_info(stim_id);
present_stimulus(stim_w, stim_id, color_id, stim_dur);
end
```
在以上代码中,我们循环遍历每个刺激,获取其颜色和条件信息,然后调用 `present_stimulus` 函数呈现刺激。
需要注意的是,在主函数中,我们使用了 `sca` 函数关闭了所有的屏幕窗口。这个函数用于结束屏幕呈现,并且释放所有的屏幕资源。此外,我们还使用了 `fclose('all')` 函数关闭了所有的文件句柄。这个函数用于关闭所有打开的文件,防止数据丢失。
完整的程序代码如下:
阅读全文