我对Matlab还是很陌生,但真的想改进。 对于我的实验,我想显示一张图片,参与者使用两个不同的键(f&g)对是/否做出响应,然后显示下一张图片,然后重复进行。

展示图片,使用按键可以工作很长时间,但是我无法重复进行尝试。 因此,我的问题是我如何才能使程序重复/循环进行试验? 到目前为止,我的代码有什么问题吗?还是我应该使用其他代码?

到目前为止,这是我的代码

function try1_6()

cleanupObj= onCleanup(@() myCleanupFxn);

% PRETEST
% Initialize screen with black background
winID = Screen('openWindow',0, [0 0 0]);

%Parameter
backcol=255;
textcol=0;

% Load image file(s)
structimages= [];
TheImagesdir = dir('theImagesdir/*.jpg');
for i=1: length(TheImagesdir);
    TheImages  = imread(['theImagesdir/' TheImagesdir(i).name], 'JPEG');

    % Get width and height
    imageX = size(TheImages,2);
    imageY = size(TheImages,1);

    % Convert to texture
    myTexture = Screen('MakeTexture', winID, TheImages);

    % Set destination rectangle
    destRect = [50  100  50+imageX  100+imageY];

    %save to structure
    structimages(end+1).filename=TheImagesdir(i).name;
    structimages(end).destRect= destRect;
    structimages(end).texture= myTexture;
end

%Make triallist
numberOfItems= [5]; %list of all possible items
Nrepeats=4;
Response=0;
TrialList=HH_mkTrialList({numberOfItems Response},Nrepeats); 


%PRESENTATION

for trialnum=1:size(TrialList,1)
    nitems = TrialList(trialnum,1);

    Screen('FillRect', winID,backcol); % makes the screen blank

    %displays text
    DrawFormattedText(winID,'dkjfghaslkdfglksdjgfh','center','center',textcol);
    Screen('Flip', winID)
    HH_waitForKeyPress({'space'}); % waits for spacebar to be pressed
    Screen('FillRect',winID,backcol);
    Screen('Flip',winID);
    WaitSecs(1);

    %display picture
    whichTheImages= randi(length(TheImagesdir)); % randomly selects image for directory
    Screen('FillRect',winID,backcol);
    Screen('DrawTexture', winID, myTexture, [], destRect);

    Screen('Flip', winID);
    HH_waitForKeyPress({'f','j'},5)

    if resp==-1
       break
    end 

    TrialList(trialnum,4)= response; %records response

end

end

function myCleanupFxn()
    Screen('CloseAll')
end

#1楼 票数:0

您的代码有很多问题需要解决。 首先,在声明/初始化之前使用TrialList Make triallist代码块似乎在for循环的主体中TrialList ,应该在循环TrialList之前将其放置。

您的第二个问题是加载图像的内部for循环。 现在,它将在每次试用时加载在目录中找到的所有图像 您没有理由这样做,您也应该将此for循环放置在试用循环之外。 此外,您的原始代码从未按预期工作,因为您从未将加载的纹理保存在任何地方。 myTexture被文件夹中的最后一个图像覆盖,这是您将获得的唯一纹理。 因此,除了在循环之前预加载图像外,您还需要将它们保存在数据结构中,以便以后可以在试用循环中使用它们。 一个简单的struct在这里可以很好地工作:

structImages = [];
TheImagesdir = dir('theImagesdir/*.jpg');
for i = 1:length(TheImagesdir);
    TheImages  = imread(['theImagesdir/' TheImagesdir(i).name], 'JPEG');

    % Get width and height
    imageX = size(TheImages,2);
    imageY = size(TheImages,1);

    % Convert to texture
    myTexture = Screen('MakeTexture', winID, TheImages);

    % Set destination rectangle
    destRect = [50  100  50+imageX  100+imageY];

    %save to structure
    structImages(end+1).filename = TheImagesdir(i).name;
    structImages(end).destRect = destRect;
    structImages(end).texture = myTexture;
end

您的代码中还有其他不一致之处:

  1. whichTheIamges已定义但未使用
  2. resp在比较中使用的if resp==-1但不限定
  3. response在定义之前已保存到TrialList

最后,最大的问题是Screen('CloseAll', winID); 在试用循环中,因此您在第一次试用后便会拆除整个演示平台。

仅供参考,正如我在评论中指出的那样,将整个脚本包装在try块中确实是一种糟糕的做法。 我怀疑您这样做是因为您希望能够使用Ctrl + C进行中间任务,但是有一种更好的方法。 如果使整个脚本成为一个函数,则只要函数退出(无论是正常,错误还是中断),都可以使用onCleanup方法执行代码。 方法如下:

function myScript()
%//make your script a function. There is an additional advantages to doing this: 
%//function performance is better than script performance.

%//blah-blah-blah

%//setup the cleanup object before opening screen
cleanupObj = onCleanup(@() myCleanupFxn);

%//open the screen
winID = Screen('openWindow',0, [0 0 0]);

%//blah-blah-blah

end

function myCleanupFxn()
    %//local function, not visible outside of this file
    Screen('CloseAll');
end

  ask by M Druyvesteyn translate from so

未解决问题?本站智能推荐:

1回复

在试验结构中重复编号

如何告诉Matlab再使用数字? 我有10个试用版,但只有8个数字,我想告诉Matlab以随机顺序重复数字。 我怎样才能做到这一点? 数字= {0 1 2 3 4 5 6 7 8};
1回复

Matlab:如何在不连续呈现相同试验的情况下随机化试验

我是 Matlab 的初学者,在 Matlab 的 Psychtoolbox 任务中,我正在努力进行随机试验。 我的试验包括 5 次重复 12 次的语言刺激(总共 60 次试验)。 我有 2 次练习试验,然后是 60 次测试试验。 我想要做的是以固定顺序呈现练习试验,以随机顺序呈现测试试验,而不是连
1回复

如何使用列表选择试验?

我有6个.abf文件,每个文件的尺寸为150000 by 2 by x ,其中x从1 to 10变化。 x代表录音的尝试。 因此,我必须在MATLAB中处理这6个文件,这是通过遍历每个文件并对每个文件进行后续处理的循环来完成的。 但是对于每个试验,即使记录了10个试验,也不是全部10个都具
1回复

加速轮-MATLAB中的Psychtoolbox

我正在尝试编写一个显示加速轮的代码。 只要用户按下“ a”,车轮就应逆时针加速。 关键是它会朝着正确的方向转动,但不会加速。 这是我正在使用的代码(在PTB-3和Windows XP中): 如果有人知道为什么它不加速,我将非常感激。
1回复

MatlabPsychtoolboxfprintf错误,在试验中有多个按键

我有一个实验,它收集按键(“ x”或“ n”)和响应时间以响应刺激显示。 如果参与者在每次尝试中按下任一按钮一次,则实验运行良好。 但是,如果他们反复按键盘或按住某个键,则经常会崩溃。 (我与孩子们一起工作,即使我们不要求他们这样做,这种情况仍然经常发生)。 当其崩溃时出现的错误是:
1回复

在Matlab/Psychtoolbox中访问USB端口

我正在尝试访问按钮框以在matlab中记录主题回复,但无法访问USB端口或连接的设备。 我已经尝试了以下代码的许多变体。 我目前拥有的是: 我一直收到所有错误消息,要么是我使用了错误的参数类型(在第二行中引用了第三个arg'port'),要么是不存在这样的串行端口设备(再次引用了“ po
1回复

在Matlab中创建平滑的网格

我正在使用Matlab函数checkerboard创建棋盘,然后将其显示为圆形而不是正方形或矩形。 我已经编写了下面的代码来执行此操作,但是由于我的网状网格看起来太粗糙了,因此当我执行imshow(checks)您可以看到圆的边缘呈锯齿状,而根本不平滑。 谁能告诉我如何克服这个问题? 另
3回复

如何在MATLAB中并行输入和显示?

我在MATLAB中使用Psychtoolbox来运行行为心理学范例。 作为范例的一部分,用户必须查看视觉刺激并使用某种输入机制对其进行响应。 对于键盘,其工作原理如下: 显示刺激 轮询键盘以进行响应 如果未检测到响应,则循环回1 如果检测到响应,则使用脚本