我有一个尖峰时间向量(来自神经元的动作电位)和一个刺激事件时间戳记向量。我想创建一个PSTH,以查看刺激是否影响神经元的尖峰频率。我可以通过遍历每个刺激事件来做到这一点(请参阅下面的简单示例),但是对于长时间的实验来说,这是非常缓慢的,因为长期实验中存在30,000多个刺激事件,并且记录了许多神经元。
没有for循环怎么办?
慢速方式示例:
% set variables
spikeTimes = [0.9 1.1 1.2 2.5 2.8 3.1];
stimTimes = [1 2 3 4 5];
preStimTime = 0.2;
postStimTime = 0.3;
for iStim = 1:length(stimTimes)
% find spikes within time window
inds = find((spikeTimes > (stimTimes(iStim) - preStimTime)) & (spikeTimes < (stimTimes(iStim) + postStimTime)));
% align spike times to stimulus onset
stimONtimes = spikeTimes(inds) - stimTimes(iStim);
% store times in array for plotting
PSTH_array(iStim,1:length(stimONtimes)) = stimONtimes;
end
最好的方法是仅使用现有的直方图函数。它们的速度非常快,可以为您提供所需的所有信息。当然,这假定垃圾箱不重叠。给定您的示例数据:
spikeTimes = [0.9 1.1 1.2 2.5 2.8 3.1];
stimTimes = [1 2 3 4 5];
preStimTime = 0.2;
postStimTime = 0.3;
您可以像这样构造垃圾箱:
bins = sort([stimTimes - preStimTime, stimTimes + postStimTime])
或者
bins = [stimTimes - preStimTime; stimTimes + postStimTime];
bins = bins(:).'
bins =
0.80000 1.30000 1.80000 2.30000 2.80000 3.30000 3.80000 4.30000 4.80000 5.30000
然后,可以根据需要的结果以及所用的MATLAB版本来使用histcounts
,,discretize
或histc
。我将使用histc
(因为我没有所有花哨的东西),但是所有三个函数的输入都相同。您有一个额外的输出histcounts
(edges
对我们没有用),而有一个额外的输出discretize
(对实际计数)。
[N, IDX] = histc(spikeTimes, bins)
N =
3 0 0 1 2 0 0 0 0 0
IDX =
1 1 1 4 5 5
由于垃圾箱包括之间的时间,(T(i) + postStimTime)
因此(T(i+1) - preStimTime)
我们需要使用其他所有垃圾箱:
N = N(1:2:end)
N =
3 0 2 0 0
同样,我们只对奇数时隙中发生的尖峰感兴趣,我们需要调整索引以匹配新的IDX
:
v = mod(IDX, 2)
v =
1 1 1 0 1 1
IDX = ((IDX+1)/2).*v
IDX =
1 1 1 0 3 3
结果与我们最初得到的结果一致:1号仓中有3个尖峰,3号仓中有2个尖峰。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句