我有以下结构:
T = struct('Time',{20, 40, 50, 80, 120, 150, 190, 210, 250, 260, 270, 320, 350, 380, 385, 390, 395},...
'Trial',{'correct','incorrect','incorrect','correct','correct','correct','incorrect','incorrect','correct','correct','correct','incorrect','incorrect','correct','correct','incorrect','incorrect'});
我想执行以下两项任务:
我想得到每100毫秒时间窗口(间隔)有'incorrect'
的概率。
例如,对于第一个时间窗口,前100毫秒,有4个试验,2个是'incorrect'
,因此它将是2/4 = 0.5
我想绘制每个100毫秒时间窗口概率的条形图。 x
轴是时间,每个条的宽度为100毫秒,其高度是该特定窗口的概率。
我非常感谢任何帮助。
答案 0 :(得分:6)
这违背了我在回答问题时没有做出任何问题的政策,但这似乎是一个有趣的问题,所以我会例外。
首先,拆分每个Time
和Trial
字段,使它们位于不同的数组中。对于Trial
字段,我要将它们转换为标签1和2以表示correct
和incorrect
以便于实施:
time = [T.Time].';
trial = {T.Trial}.';
[~,~,trial_ID] = unique(trial);
接下来,您可以做的是获取时间数组中的每个条目,并在发言时除以100。属于同一ID的值意味着它们属于100 ms的组。请注意,我们还需要为下一步添加1 ...您将看到原因:
groups = floor(time/100) + 1;
现在,这可能是您在MATLAB中可以使用的最美丽的函数之一:accumarray
。 accumarray
根据ID对数组的某些部分进行分组,并将函数应用于每个组的所有值。在我们的例子中,我们希望根据groups
数组对所有正确和不正确的ID进行分组,然后从那里我们确定每组不正确的值的总分数。
具体来说,我们要做的是针对groups
中指定的每组值,我们将查看correct
和incorrect
数字标签并确定多少通过总结每组中等于2的数量是不正确的,然后除以每组的数量。这些组需要从索引1开始,这就是我们必须向groups
添加1的原因。没有它,第一组实际上从0开始,MATLAB开始索引为1,因此偏移:
per = accumarray(groups, trial_ID, [], @(x) sum(x == 2) / numel(x));
per
包含每组正确的分数,我们得到:
>> per
per =
0.5000
0.3333
0.2500
0.6667
非常好!快速手动计算将证明您获得了正确的结果。
现在最后一部分是在条形图上绘制概率。这很简单:
bar(100*(1:numel(per)), per);
xlabel('Time (ms)');
ylabel('Probability');
我创建一个从100开始的向量,并以100的倍数上升,直到我们拥有多个组。在我们的例子中,我们有4个,时间长达395毫秒。
因此,我们得到: