首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >少了,多了MATLABesque?

少了,多了MATLABesque?
EN

Code Review用户
提问于 2014-05-16 15:54:32
回答 1查看 67关注 0票数 2

我已经编写了一段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循环收集心率数据向量,在心本向量和单个脑桶之间进行相关,存储产生的相关向量,然后继续到下一个向量。

重要的是,心脏和大脑数据的搜索窗口和存储窗口有不同的长度(心率变化比大脑效应慢)。此外,这最终将被计算为多个主题;我省略了数据的这个维度。

代码语言:javascript
复制
% 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

我如何使这段代码不那么糟糕(更快,更结构化)?

EN

回答 1

Code Review用户

回答已采纳

发布于 2014-05-18 19:12:26

有了这些随机数据和几周时间,我的时间减少了大约30倍。内环可以外接,这是最大的区别。

代码语言:javascript
复制
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

toc
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/50932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档