就功能与效率而言,Matlab+PsychToolBox足以击败任何一款心理学实验程序开发工具。
本文将以如下顺序展开:
Q1,Matlab是什么?
Q2,PsychToolBox是什么?
Q3,如何在Matlab中加入PsychToolBox?
Q4,如何编写PsychToolBox第一个入门程序“Hello World”?
Q1,Matlab是什么?
Matlab 是MatrixLaboratory(矩阵实验室)的缩写,顾名思义,它的工作与矩阵有关。Matlab 最早是由美国新墨西哥大学的Cleve Moler教授开发出来的,主要用于数学计算与教学,最初版本只能做一些简单的矩阵运算。
1983年的春天,Cleve Moler跑到斯坦福(离硅谷很近哦)做了一次讲座,他把自己的一个想法说出来了。作为大学老师,Cleve Moler不忍心看到自己的学生去接触底层的代码,枯燥而艰涩,他经常自己把底层写好,封装成函数,方便学生来调用(大学老师,大爱无边!)。John Little听到了这个想法,觉得这绝对是一个非常好的idea:通过寻找这个星球上最聪明的数学家和工程师,开发一个基于数学计算的,算法开发的和数据分析和可视化的交互开发工具,会是一款用户体验极好的爆品。
于是,Cleve Moler和John Little,他们拉上另外一位计算机达人Steve Bangert,一起创办了MathWorks公司,其主营业务就是Matlab产品。经过多年的版本迭代更新,Matlab 不仅完善了它的数学功能,更重要的是还可以在它上面写代码。
Matlab的体量很大(安装好之后有10G+),但是它绝不笨重,它是个特别灵活的胖子。更重要的是,它现在不仅可以跑它自己的脚本代码,还可以调用其它语言写的程序(例如,Python, C, C++ 等)。众所周知,写程序的目的是操控电脑,让它帮我们干活,所以Matlab成为一个可编程的平台以后,就变得几乎无所不能。除了生孩子,它什么都可以做☺。
Matlab 还有一个很重要的特性就是它有很多的扩展包,这个东西在 Matlab 里面被称作工具箱。它节省了大量的程序开发时间,也让 Matlab变得易用&友好。对心理学背景的同学来说,非常幸运的是,在Matlab上有一个专门针对心理学专业的工具箱——Psychtoolbox(简称PTB)。
Q2,PsychToolBox是什么?
我们先来膜拜一下,PsychToolBox的开发者Mario。
PsychToolBox(PTB)是免费的可在MATLAB环境下运行的心理学实验编程工具包,它能够使我们很方便地精确控制视觉和听觉刺激的呈现和同步,并且能够简化与用户的交互操作。在过去,实验程序开发一般的方法是利用简易的开发工具,比如如E-Prime,Inquisit,DMDX和Presentation等;另外一种方法是利用诸如C或Pascal这样的可以对硬件设备实施底层控制的语言。前者相对而言简单易学,不需要太多的编程经验;后者则需要具有丰富的编程经验,而且还要熟悉底层硬件的参数知识。MATLAB属于高级解释性语言,它本身缺少对硬件进行精密控制的能力。
PsychToolBox在Matlab与计算机硬件中间提供一个接口,让Matlab可以直接操纵计算机硬件。这样,我们就可以自由地要求计算机输出图像、文字或声音,并且精确计时(支持毫秒级的计时精度)。PsychToolBox是介于简单开发工具(然不够灵活)vs.复杂开发工具(但学习时间成本太高)的一种中间状态,即使你之前没有太多的编程语言方面的基础,也有充分的理由转向MATLAB+PsychToolBox的学习。
国内现在介绍PsychToolBox的中文参考书还比较少,在这里比较推荐的是苏州大学冯成志老师出的《PsychToolBox工具箱及Matlab编程实例》和北京大学陈立翰老师出的《心理学研究方法:基于MATLAB和PSYCHTOOLBOX》。
Q3,如何在Matlab中加入PsychToolBox?
Windows有版本控制,MacOS有版本控制,Linux也有版本控制。像MacOS里边的软件安装,我们一般会用HomeBrew这个版本控制软件;同理,PsychToolBox工具集也有版本控制,它叫做SVN,全称是Subversion,具体的链接一般会写成类似这样“Windows: Subversion 1.7.x command-line client”。
·第一步,为了安装PsychToolBox,它的版本控制程序Subversion是必须先要安装的。
打开百度,搜索PsychToolBox这个关键词。第一个一般就是PsychToolBox的官方网站,点进去或者在浏览器的地址栏输入http://PsychToolBox.Org敲回车。
点击左边Getting Started的DownLoad选项,右边会在Contents看到Installation Instructions,Mac + Linux + Windows。如果你的机器是Windows,点击Windows选项,进入到下面这个界面👇
我们真正要下载的SVN的内容是:
点击 Windows: Subversion 1.7.x command-line client这个链接,切换到另外一个dimension空间里边:
一般现在的机器都是64位,所以会选择SVN 1.12.0 64bit这个靠右的版本,下载到指定的某个文件夹(比如,如下图所示我会专门建一个PsychToolBox的文件夹),解压安装即可。
·第二步,下载PsychToolBox installer到本地,官方规定的位置是在c盘,所以,我会在c盘根目录下面新建一个toolbox的文件夹,把文件直接下载保存在这个文件夹里边,就如下图所示:
接下来,我们要打开我们的Matlab程序。
然后把当前目录调整为C:\toolbox
以管理员身份运行Matlab,在命令窗输入以下代码:
然后等待,大概需要10-20mins... 耐心等待... 再耐心一会... 第一次安装失败了,不要气馁,这个世界就是这样,失败是成功之母;再来一次,安装成功,欧耶✌️
如何确认你的安装成功了呢?请在你的Matlab里边输入'PsychtoolboxVersion',如果它的答案是如下这般,说明安装成功了(热泪盈眶)。
还有一种确认的方法是输入‘Screen’,如果呈现的是如下信息,说明安装成功了:
Q4,如何编写PsychToolBox第一个入门程序“Hello World”?
还记得第一堂讲解Matlab的时候,我曾经提问说,哪个命令是最优价值的?对了,是Help命令。我为什么这个时候专门提它呢?因为对于每个工具箱的学习最好之前要学会如何查询它的帮助文档,由于PsychTtoolBox的很多函数编写并不是基于Matlab的,所以,查询各种函数也不能简单地使用help或者doc来查看。那可怎么办?
在安装好PsychToolBox工具箱之后,可以在Matlab的命令行中输入Screen,这个时候就会将PsychToolBox的一些主要函数罗列出来,并且每个分类都会比较详细。如果想知道其中一些函数的具体用法,可以使用Screen ‘函数名’。比如,为了让图片居中,我们可以使用CenterRect这个命令。那么,我们就可以在命令窗口中输入 Screen CenterRect,然后,你会发现你的命令窗口被各种Screen命令刷屏了。
有没有觉得Screen函数的写法和我们之前接触的很多函数的用法不太一样。
以前的画面,一般是这样:
输出 = 函数名(输入)
现在画面完全变了:
输出 = Screen('函数名',参数1,参数2)
这是为什么呢?说明作者从一开始就是围绕Screen这个函数进行开发的,Screen属于一个更高阶的函数,而里面的输入的第一个参数才是这个函数要实现的功能。
当你已经很好的掌握了Matlab入门课程,...
蒋挺:Matlab初学者课程:零基础入门与项目实战zhuanlan.zhihu.com
那么,学习PTB这个工具箱就变成一种非常easy的事情了,你们可以看看PTB-3里边的自带的Demo。这些Demo的位置在这个工具箱路径下的PsychDemos文件夹,这里面会有一些简单的演示程序。运行这些程序再对应看看这些程序是怎么写的,相信会进步飞速。
我们接下来,试着写一个最简单的“Hello World!”的Matlab + PTB程序。
为了实现这个目标,我们需要对任务做一个拆分:
(1)如何利用Screen函数打开一个窗口;
(2)填充指定的背景颜色;
(3)如何将文字呈现在屏幕上?
(4)文字在屏幕上停留,直到按键跳出。
点击运行键或者按F5运行以上程序,你会看到新开出一个屏幕,随后出现如下文字和注视点,按任意键,程序退出。
这里我们选择了一个try----catch----end结构,目的是希望在程序运行过程中因为某些原因报错强制退出时,程序能够把光标重新显示,然后把屏幕都关闭掉,最后能够抛出错误提示信息。
(1)如何利用Screen函数打开一个窗口
[w, wRect] = Screen('OpenWindow', ScreenNum);
这句话利用Screen的'OpenWindow'函数打开一个窗口。
(2)填充指定的背景颜色
black=BlackIndex(w);
white=WhiteIndex(w);
gray=(white+black)/2;
Screen('FillRect',w,gray); %把屏幕w涂成gray颜色
Screen('Flip',w); %需要flip上面对屏幕的操作才会显现出来
这一步是把屏幕填充为灰色的意思,这个灰色是黑色和白色的综合。
(3)如何将文字呈现在屏幕上
Text='Hello World!'; %需要呈现的文字
oldTextSize=Screen('TextSize',w,36); %调整文字的大小为36号
Screen('DrawText', w, Text, 420, 340,[0,0,255]); %呈现文字在屏幕上的函数,颜色为蓝色
Screen('Flip',w); %同上面。需要flip对屏幕的操作才会显现出来
这句话利用Screen的'DrawText'函数在屏幕上呈现文字,在这之前要先把文字和它的参数准备好。
(4)文字在屏幕上停留,直到按键跳出
KbWait; %按任意键继续
Waitsecs(2); %屏幕2秒
Screen('CloseAll'); %结束,关闭屏幕