【发布时间】:2019-03-13 09:34:56
【问题描述】:
我有一个实验,收集按键(“x”或“n”)和响应时间以响应刺激显示。如果参与者在每次试验中按下任一按钮一次,则实验运行良好。但是,如果他们反复按下键盘或按住一个键,它往往会崩溃。 (我和孩子一起工作,即使我们要求他们不要这样做,这种情况仍然会经常发生)。
崩溃时出现的错误是:
没有为“单元”输入定义函数。
实验错误(第 682 行)
fprintf(dataFile, formatString, SJNB, Date, Age, block, trial, trialFaceLabel, trialLoadLabel, Target, keyStroke, tStart, keyTime, Correct, RT, FaceGen);
虽然它说“没有为“单元”输入定义函数”(这与 this 帖子有关),但这个函数似乎在所有其他时间都能正常工作,所以我看不出它只是没有正确定义。只有当连续按下太多按键时(例如,如果按键被按住),才会发生此错误。
我可以进行哪些更改以确保实验稳健且不会崩溃,即使每次试验有多个按键?任何帮助,将不胜感激。
我已包含以下代码。
以下是一些附加信息,以防有用:
在实验之前,有一个练习循环,它的设置方式非常相似,但有两个主要区别:1) 显示在屏幕上的刺激不同,2) 未记录按键.这个循环似乎永远不会崩溃。
崩溃后,按键响应会打印到命令行。
我看过其他类似的帖子,例如@ 987654322@ post,但据我了解,我编写的按键循环也应该在按下键后立即退出 - 所以我不确定为什么我的工作方式不同。
下面的代码都包含在一个实验循环中。它正在做的是: 1)搜索按键 2)根据按键计算响应时间 3)如果响应不正确,发出哔哔声 4)打印到文件(这是在试用结束之前)(这是错误引用的行)
%searching for keypress
timedout = false;
pressed = 0;
%while pressed < 1;
while ~timedout && ~pressed
[keyIsDown, keyTime, keyCode] = KbCheck;
if keyIsDown && ((keyTime-tStart) < max_stimulus_shown)
keyStroke = KbName(keyCode);
if any(strcmpi(keyStroke,leftKey)) || any(strcmpi(keyStroke,rightKey)) %|| any(strcmpi(keyStroke,exitKey))
pressed = 1;
WaitSecs(remainer-(keyTime-stimulus_shown));
break;
elseif any(strcmpi(keyStroke,exitKey))
disp('*** Experiment terminated ***');
break;
sca;
end
elseif ((keyTime-tStart) > max_stimulus_shown)
keyStroke = 'None';
timedout = true;
RT = 0;
Correct = 0;
pressed = 2; % 2 = not pressed
KbQueueStop();
end
end
%calculate response times
if pressed == 1 && (~timedout)
RT = round((keyTime-tStart)*1000); % RT in ms
if any(strcmpi(keyStroke,leftKey)) % pressed left (X)
if any(strcmpi(Target, 'X')) % target was an X
Correct = 1;
else % target was X, but pressed right (N)
Correct = 0;
end
elseif any(strcmpi(keyStroke,rightKey)) % they pressed right
if any(strcmpi(Target, 'N')) % target was an N
Correct = 1;
else % target was N, but pressed right
Correct = 0;
end
elseif any(strcmpi(keyStroke,exitKey))
disp('ESC');
break;
end
end
Screen('TextSize',Screen_wid, star_size);
DrawFormattedText(Screen_wid, '.', 'center', 'center');
WaitSecs(feedback);
Screen('Flip', Screen_wid);
%say when to beep
if Correct == 0 && ~timedout
PsychPortAudio('Start', pahandle, repetitions, startCue, waitForDeviceStart);
WaitSecs(remainer-beepLengthSecs);
elseif Correct == 0 && timedout
PsychPortAudio('Start', pahandle, repetitions, startCue, waitForDeviceStart);
Screen('TextSize',Screen_wid, text_size);
DrawFormattedText(Screen_wid, 'missed trial', 'center', 'center');
Screen('Flip', Screen_wid);
WaitSecs(beepLengthSecs+feedback);
elseif Correct == 1
WaitSecs(remainer+beepLengthSecs);
end
%WaitSecs(stimulus_shown); %stimulus shown for 0.2 seconds
Screen('Flip', Screen_wid);
dataFile = fopen(dataFileName, 'a');
fprintf(dataFile, formatString, SJNB, Date, Age, block, trial, trialFaceLabel, trialLoadLabel, Target, keyStroke, tStart, keyTime, Correct, RT, FaceGen);
fclose(dataFile);
【问题讨论】:
-
您对上述
fprintf方法的输入很可能是一个元胞数组,您必须找出哪一个,因为这只有在整个上下文中才有可能。当持续按下键时,可能收集按键的变量之一变成一个元胞数组,但当短时间按下键时,它是一个单一的值!?
标签: matlab psychtoolbox