我已经编写了一段MATLAB代码,(希望)计算CECT。我有两个心理生理学度量矩阵-一个用于大脑数据,一个用于心率;两者都是格式的历次(即10秒长间隔的多个历元)。假设的结果是用窄箱计算短窗的EEG与用较宽的垃圾箱计算较长窗的心率之间的相关性。基本的想法是,早期的大脑效应可以预测几秒钟后心率的加快。用作者的话(来自链接中的付费文件):
为了能在350-420个试验中计算出每个人在伪影筛查后可以进行的分析,脑电图片段被分成50箱,每箱15.625 ms,从0 ms (刺激起效)到781.25 ms不等。将HP片段划分为5 0 0 ms的10个桶,范围为0~5 S,再用相关(Pearson‘s r)方法计算每个脑电箱与每一HP脑电垃圾箱的相互关系,得到10×50互相关的CECT矩阵。
我的代码与此有一点不同,因为我计算的是重叠滑动窗口,而不是不重叠的连续回收箱。而且,我的窗户也略有不同。然而,我最关心的是,我有预感我的代码是非常次优的。
目前,程序是在脑数据箱上进行I-循环,使用For循环收集心率数据向量,在心本向量和单个脑桶之间进行相关,存储产生的相关向量,然后继续到下一个向量。
重要的是,心脏和大脑数据的搜索窗口和存储窗口有不同的长度(心率变化比大脑效应慢)。此外,这最终将被计算为多个主题;我省略了数据的这个维度。
% data is a matrix of format (channels * times * epochs)
% times is a matrix of time points corresponding to sampling points
% CECT is supposed to be a matrix of correlation coefficients,
% dimensions (braintime * hearttime)
scalefac = 1000/samplingrate;
brainchannel = 12; % channel # for brain data
heartchannel = 62; % channel # for heart data
brainbin = 10; % bin length for brain data (symmetric, in msec)
heartbin = 250; % bin length for heart data (= 500 msec window)
heart = 5500; % max point (from zero, in msec) for heart data
brain = 2500; % max point (from zero, in msec) for brain data
first = -500; % first point (from zero, in msec)
yy = 1; % counter for looping over brain data
for x = find(times>first,1):find(times>brain,1)
t0 = (x-brainbin/scalefac);
t1 = (x+brainbin/scalefac);
eeg = mean(squeeze(data(brainchannel,t0:t1,:)),1);
p=1;
clear hps
for y = find(times>first,1):find(times>heart,1)
t0 = (y-heartbin/scalefac);
t1 = (y+heartbin/scalefac);
hps(p,:) = mean(squeeze(data(heartchannel,t0:t1,:)),1);
p = p+1; % counter for looping over heart data
end
CECT(yy,:) = corr(squeeze(eeg).',hps.');
yy = yy+1;
end我如何使这段代码不那么糟糕(更快,更结构化)?
发布于 2014-05-18 19:12:26
有了这些随机数据和几周时间,我的时间减少了大约30倍。内环可以外接,这是最大的区别。
clear all
n=800;
data = randn(2,n,30);
times=linspace(-1900,8600,n);
tic;
samplingrate = 200;
scalefac = 1000/samplingrate;
brainchannel = 12; % channel # for brain data
heartchannel = 62; % channel # for heart data
brainchannel = 1;
heartchannel = 2; %adjusted for test data
brainbin = 10; % bin length for brain data (symmetric, in msec)
heartbin = 250; % bin length for heart data (= 500 msec window)
heart = 5500; % max point (from zero, in msec) for heart data
brain = 2500; % max point (from zero, in msec) for brain data
first = -500; % first point (from zero, in msec)
xvec=find(times>first,1):find(times>brain,1);
yvec=find(times>first,1):find(times>heart,1);
CECT=zeros(length(xvec),length(yvec)); %initialize
braindata=squeeze(data(brainchannel,(xvec(1)-heartbin/scalefac):(xvec(end)+brainbin/scalefac),:));
bn=length((xvec(1)-brainbin/scalefac):(xvec(1)+brainbin/scalefac));
heartdata=squeeze(data(heartchannel,(yvec(1)-heartbin/scalefac):(yvec(end)+heartbin/scalefac),:));
hn=length((yvec(1)-heartbin/scalefac):(yvec(1)+heartbin/scalefac));
hps=zeros(length(yvec),size(data,3));
p=1;
for y = yvec
hps(p,:) = mean(heartdata(p:p-1+hn,:),1);
p = p+1; % counter for looping over heart data
end
yy = 1; % counter for looping over brain data
for x = xvec
eeg = mean(braindata(yy:yy-1+bn,:),1);
CECT(yy,:) = corr(squeeze(eeg).',hps.');
%%CECT(yy,:) = eeg * hps.'; %for testing
yy = yy+1;
end
tochttps://codereview.stackexchange.com/questions/50932
复制相似问题