You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab Psychtoolbox无阻塞限时3秒识别鼠标左右键点击方案咨询

解决方案

Psychtoolbox的GetMouse函数返回的第三个输出buttons是长度为3的逻辑数组,对应按键规则如下:

  • buttons(1)为1代表鼠标左键被按下
  • buttons(2)为1代表鼠标中键被按下
  • buttons(3)为1代表鼠标右键被按下

你之前只通过any(buttons)判断是否有按键触发,只需要读取数组对应位置的取值即可识别左右键,同时保留非阻塞轮询、3秒超时的逻辑。

修正后完整实现代码
clc
clear;
SamplingRate=48000;
wait4resTime = 3; % 3秒响应窗口期
F=[250 500 1000 2000 4000];
t=linspace(0,1,SamplingRate);
trialNum = length(F);

% 预分配存储变量,提升运行稳定性
memory = cell(1,trialNum); % 存储各试次音频
resRecord = NaN(1,trialNum); % 存储响应结果:1=左键 2=右键 0=超时
rtRecord = NaN(1,trialNum); % 存储各试次反应时

for ind=1:trialNum
    Frequency = F(ind);
    y=sin(t*2*pi*Frequency);
    tStart=GetSecs;
    sound(y,SamplingRate); 
    % 注:正式实验建议替换为Psychtoolbox原生PsychPortAudio接口,播放延迟更低、更稳定
    
    gotResponse = 0; % 响应状态标记
    while ~gotResponse && (GetSecs - tStart) < wait4resTime
        [~,~,buttons] = GetMouse();
        if buttons(1) % 检测到左键按下
            resRecord(ind) = 1;
            rtRecord(ind) = GetSecs - tStart;
            gotResponse = 1;
        elseif buttons(3) % 检测到右键按下
            resRecord(ind) = 2;
            rtRecord(ind) = GetSecs - tStart;
            gotResponse = 1;
        end
        WaitSecs(0.001); % 加1ms延时降低CPU占用,不影响检测精度
    end
    
    % 标记超时无响应试次
    if ~gotResponse
        resRecord(ind) = 0;
    end
    
    pause(4); % 试次间间隔
    memory{ind} = y';
end
改动说明
  • 补全了左右键识别逻辑,直接读取buttons数组对应索引即可区分按键类型
  • 预分配了响应结果、反应时存储变量,避免循环动态扩容影响运行性能
  • 增加了1ms轮询间隔,大幅降低空转时的CPU占用
  • 修正了原代码中未定义jnd变量的错误

内容的提问来源于stack exchange,提问作者mohadeseh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:45:00