有关于心理学实验的编程,现在比较主流的是使用eprime软件。但我对eprime确实印象不佳,首先eprime对mac的支持并不友好;其次它的迁移性很差;最后就是eprime实现的功能也比较有限。当然,以上都只是个人观点。在本科毕设决定做实验后,我果断选择了matlab+psychtoolbox进行编程。中间经历了很多问题,在这里把遇到的问题和我的编程源代码分享出来,做抛转引玉之用,也希望和各路大神交流。
我的matlab基础一般,加上很久没有操作,这次基本是从零开始。由于学习周期较短。我在编程时用的是面向过程的方式,如果基础较好推荐面向对象的方式,修改起来较为方便。
首先安装matlab+psychtoolbox,安装方法自行百度。随后附上我的实验的示意图。

1. 信息录入

这里主要用的是inputdlg函数。具体用法见:inputdlg用法(学习中的小伙伴不要偷懒,百度勤快用起来
)
随后将信息从info提取到SubInfo,并转换类型。
然后判断是否复合要求。
最后返回到y即可。
2. 指导语

这里用的函数的主要思路是将图片封装到mat类型文件中。
代码中默认将图片放在工作目录下的Ins文件夹中。
然后读取Ins文件夹内的文件。获得文件个数。NumIns减二的原因是读取文件个数的时候会默认多两个,具体情况可以根据自己的电脑进行测试,总之得到文件数量即可(其实是我记不太清了...
)。然后批量将文件读取(先获得文件名,再用strcat拼接路径和文件名,最后用imread这个函数读取)保存到PicIns这个struct中,然后储存为Instructions.mat这个文件中。接下来,再主程序中引用即可。

前三句用于将mat中的图片拿出来,然后通过wptr传递呈现。这个具体的实现方式很复杂。好像是先在缓存界面加载,然后再切换,以此呈现图片。总之复制这三句代码就可以成功呈现图片1了。
KbPressWait; :按任意键跳过
3. 其他一些准备工作

前三句初始化偏好。
第四局设置窗口的颜色。
五六七用于设置字体和大小。
最后三句我不太记得了
,好像是隐藏鼠标指针,锁定键盘等,感兴趣自行百度
。

读取mat,为指导语做准备,这一步请在指导语前。
4. 数据的处理方式
建议使用矩阵来处理数据,举例而言。
我的程序分实验一及实验二。实验一中有两个自变量,第一个自变量是两个刺激是否变化,变化和不变化两个level。第二个自变量是两个刺激之间的间隔时间,有三个level。
这样共有2x3=6组不同的条件。共有120个trial。我开始的想法是随机数,若随机到1则变化,随机到2则不变化。但这样的问题是无法平衡。例如120个trial中可能随机到57个变化,63个不变化。极端条件下120个变化0个不变化也有可能。在老师的提醒下,建议先建立一个design矩阵,建立后就可以很方便的录入数据了。


生成的design。
这段就不定义函数了...因为不同的自变量对应不同level,我暂时不太会怎么写一个通用的函数。大家可以读懂我的代码然后自己实现,也可以直接做一些更改。
甚至再简单一点,你可以直接用excel做好再复制进.mat,然后保存
。
5. 练习组
我的实验简单来说,是要在一个圆形范围内,随机位置呈现四个随机颜色的方块。方块颜色从七种颜色中随机。因此主要的两个问题是随机位置呈现,和随机方块颜色。














(作者手稿:逻辑)
再说一下我是如何实现四个位置在圆上的。
首先get(0,'ScreenSize')得到自己的屏幕分辨率,我是1440x720。然后如下图(可能解释的不是非常清楚,辛苦大家领会!!)。总之是很简单的一个数学问题,这里因自己实验情况自己发挥就可以了。

(作者手稿:位置解释)
6. 正式组
正式组基本和练习组一致,鸽了
7. 结束语
和指导语一致,鸽了
8. 数据收集

参照之前练习组的代码,把最后的部分替换。还记得design吗,将反应时存在第五列。
然后if 如果按键正确,则保存1到第六列,否则保存0到第六列。9是matlab中F(还是J,不记得了)对应的数字,这个可以自行百度,每个按键有一个对应的数字。这里需要注意mac版和windows版对应按键不一致,请仔细查询。
9. 数据分析


(结果打开)
如此一来你就会得到一个表格,然后复制到spss就可以分析数据惹。可以先复制到excel按第一列重新排序成顺序,这样方便一些。

今天给大家分享的是我自己在做实验编程时的一点总结,大家看完我的程序加上自己的一些思考,基本可以编程大多数的实验了。非常希望这篇文章能帮到各位基本0基础却又想学习使用matlab的同学。此外,文章中代码的缩进没有正常显示,对八起辣
PS:在写这篇文章的同时重新看了看自己的代码,发现了很多的漏洞和可以提升的地方,譬如这个程序确实不够简洁。附上源代码有些露怯了,还希望水平高的同学不要嘲笑我==
图文:江震宇
编辑:卢偲瑶
「往期精彩内容」
种草BNUX/UX教师招聘
微软UI课程/唐·诺曼来访
中美创客大赛/用户研究课程
欧洲实践行/2018美国实践行
