仅执行部分代码,并且不显示任何错误消息

问题描述

我在Mac OS上使用MATLAB 2020 Psychtoolbox,每次运行此代码时,它们的屏幕都会变灰,然后发出错误声音,但是,命令窗口中没有显示错误消息。如何使所有代码执行?

% Clear the workspace
close all;
clearvars;
sca;

% Setup PTB with some default values
PsychDefaultSetup(2);

% Seed the random number generator. Here we use the an older way to be
% compatible with older systems. Newer syntax would be rng('shuffle'). Look
% at the help function of rand "help rand" for more information
rand('seed',sum(100 * clock));

  % Set the screen number to the external secondary monitor if there is one
% connected
screenNumber = max(Screen('Screens'));

% Define white,grey and black
white = WhiteIndex(screenNumber);
grey = white / 2;
black = BlackIndex(screenNumber);

% Open an on screen window
[window,windowRect] = PsychImaging('OpenWindow',screenNumber,grey);

% Get the size of the on screen window
[screenXpixels,screenYpixels] = Screen('WindowSize',window);

% Query the frame duration
ifi = Screen('GetFlipInterval',window);

% Set up alpha-blending for smooth (anti-aliased) lines
Screen('BlendFunction',window,'GL_SRC_ALPHA','GL_ONE_MINUS_SRC_ALPHA');

% Setup the text type for the window
Screen('TextFont','Ariel');
Screen('TextSize',36);

% Get the centre coordinate of the window
[xCenter,yCenter] = RectCenter(windowRect);


%----------------------------------------------------------------------
%                       Keyboard information
%----------------------------------------------------------------------

% Define the keyboard keys that are listened for. We will be using the left
% and right arrow keys as response keys for the task and the escape key as
% a exit/reset key
escapeKey = KbName('ESCAPE');
leftKey = KbName('LeftArrow');
rightKey = KbName('RightArrow');
downKey = KbName('DownArrow');

%----------------------------------------------------------------------
%                       Fixation cross
%----------------------------------------------------------------------

% Here we set the size of the arms of our fixation cross
fixCrossDimPix = 10;

% Now we set the coordinates (these are all relative to zero we will let
% the drawing routine center the cross in the center of our monitor for us)
xCoords = [-fixCrossDimPix fixCrossDimPix 0 0];
yCoords = [0 0 -fixCrossDimPix fixCrossDimPix];
allCoords = [xCoords; yCoords];

% Set the line width for our fixation cross
lineWidthPix = 4;

%----------------------------------------------------------------------
%                            Colors
%----------------------------------------------------------------------

% We are going to use three colors for this demo. Red,Green and blue.
wordList = {'Green','Magenta','Orange'};
Colors = [0 1 0; 1 0 1; 0.8500 0.3250 0.0980];

%----------------------------------------------------------------------
%                  Define positions of sequences
%----------------------------------------------------------------------

leftX = screenXpixels/2.5;
leftY = screenXpixels/1.6;
rightX = screenXpixels/1.7;
rightY = screenYpixels/1.6;
upX = screenXpixels/2.1;
upY = screenYpixels/2.6;

left = [leftX leftY];
right = [rightX rightY];
up = [upX upY];

%----------------------------------------------------------------------
%                  Randomise temporal order of trials
%----------------------------------------------------------------------
 
trialorder = [1 0 0 0 0];
randtemp = shuffle(trialorder);

%----------------------------------------------------------------------
%                           Trial loop
%----------------------------------------------------------------------
nTrials = 5;

for trial = 1:randtemp
    
    % randomise position of sequences
    randpos = shuffle(left,right,up);
    
    % fixation cross
    % Draw the fixation cross in white,set it to the center of our screen and
    % set good quality antialiasing
    Screen('DrawLines',allCoords,...
    lineWidthPix,white,[xCenter yCenter],2);

    % Derive distributions
    seq1 = distribution(0.02,0.126,0.146,0.106,5); % high variance
    seq2 = distribution(0.02,5); % low variance
    seq3 = distribution(0.02,5); % low variance
    
    seq4 = distribution(0.02,5);
    seq5 = distribution(0.02,5);
    seq6 = distribution(0.02,5);
    
    seq7 = distribution(0.02,5);
    seq8 = distribution(0.02,5);
    seq9 = distribution(0.02,5);
    
    seq10 = distribution(0.02,5);
    seq11 = distribution(0.02,5);
    seq12 = distribution(0.02,5);
    
    seq13 = distribution(0.02,5);
    seq14 = distribution(0.02,5);
    seq15 = distribution(0.02,5);

    if trial == 1 
       DrawFormattedText(window,'Name the color \n\n Press Any Key To Begin',...
       'center','center',black);
       Screen('Flip',window);
       KbStrokeWait;
    end
    
    if randtemp() == 0
        % trail 1
        Screen('DrawText',num2str(seq1),randpos(1));
        Screen('DrawText',num2str(seq2),randpos(2));
        Screen('DrawText',num2str(seq3),randpos(3));
        WaitSecs(0.75)
        Screen('Flip',window);
        KbStrokeWait;
           
        Screen('DrawText',randpos(2));
        WaitSecs(0.75)
        Screen('Flip',window);
        KbStrokeWait;
        
        %trial 2
        %repeat
        
    else 
        Screen('DrawText',num2str(seq13),num2str(seq14),num2str(seq15),window);
        KbStrokeWait;
    end
end       

        

      

% Flip to the screen
Screen('Flip',window);

% Wait for a key press
KbStrokeWait;

% Clear the screen
sca

“分布”函数是一个自制函数,可生成具有指定均值,方差,上限,下限和给定数量的随机数的高斯分布:

function distribution(va,mu,ul,ll,nvals)
 multiplier=10;
 x = mu + randi(multiplier*nvals,1)*sqrt(va); % Generate sufficient random numbers
 idx = (ll <= x) & (x <= ul); % Extract the value in the given range [min max]
 while sum(idx)<nvals
    multiplier=multiplier+1;
    x = mu + randi(multiplier*nvals,1)*sqrt(va); % Generate sufficient random numbers
    idx = (ll <= x) & (x <= ul); % Extract the value in the given range [min max]
 end
 x = x(idx);
 x = x(1:nvals); % Extract numbers

解决方法

您只会看到灰色屏幕,因为该错误不会导致Psychtoolbox窗口(您已将其设置为灰色背景)关闭。要关闭屏幕并显示错误,请在try,catch语句中包装代码,如果遇到该问题,它将关闭屏幕并重新抛出错误。

例如(这里的CODE只是一个占位符,请替换为您的实际代码)

try
    CODE
catch e
    sca;
    rethrow(e)
end

在这种情况下,如果在try语句的主体中遇到错误,它将转到catch语句,并调用错误e。首先使用sca关闭屏幕,然后通过rethrow实际显示错误。

就您遇到的实际错误而言,我认为您当前的代码至少有几个问题:

  1. Psychtoolbox中的随机播放功能大写-“随机播放”和 有一个输入。在这里,您正在使用“随机播放”,并提供 三个单独的输入。

    与其提供“左”,“右”和“上”作为单独的输入, 将它们组合成单个单元格数组的元素:

    替换:randpos = shuffle(left,right,up);

    使用:randpos = Shuffle({left,up});

    并选择它们作为单元格数组的元素:

    替换:Screen('DrawText',num2str(seq1),white,randpos(1));

    使用:Screen('DrawText',window,[],black,randpos{1}(1),randpos{1}(2));

  2. 在您定义的分布函数中,没有包括输出参数。将当前的第一个功能行替换为:function x = distribution(va,mu,ul,ll,nvals)

  3. 没有输入参数的
  4. KbStrokeWait仅检查连接的第一个键盘。例如,如果您在笔记本电脑上使用外部键盘,这可能会忽略按键。使用KbStrokeWait(-3)将检查所有连接的设备。

  5. 您的分布函数似乎没有收敛于解决方案,或者花费很长时间来确定解决方案,因为它似乎是随机生成值,然后检查在所需的时间间隔内是否足够。相反,我将从构建函数开始以生成随机法线值。例如,以下将根据平均值为0.02,方差为0.126的分布生成5个值。但是,它不会实现检查所有生成的值都在给定范围内的方法:randn(1,5) * sqrt(0.126) + 0.02;

  6. 在调用DrawText时缺少窗口指针。

也许还有其他问题,但是解决这些问题会使您入门。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...