改进内存效率低下的脚本

时间:2016-02-05 15:18:12

标签: matlab loops image-processing memory

我必须从5个单独的地图创建一个概率体素地图,这些地图是包含1或0的二进制地图。让我们称这些单独的地图 X1,X2,x3,X4,X5 。为了得到概率图,我做Y = (X1 + X2 + X3 + X4 + X5)/5。因此,每个体素将给出具有1作为该体素的值的各个地图的百分比。例如,如果Y中的体素值为0.4,则告诉我40%的单个地图(2个单独的地图)具有1作为该特定体素的值。我的问题是,当单个地图的数量增加时,我的脚本变得非常笨重。这就是我所拥有的

maindir=<where my individual maps are>
P={};
subj={'subj1','subj2','subj3','subj4','subj5'}

for a = 1:length(subj)
   indv_roi=spm_select('FPList',fullfile(maindir),sprintf('^%s.*\\.img$',subj{a}));
   P.(subj{a}) = spm_read_vols(spm_vol(indv_roi),1);
   P.(subj{a})(isnan(P.(subj{a})))=0;
end

Y = (P.subj1+P.subj2+P.subj3+P.subj4+P.subj5)/5

显然这是非常低效的。有没有人有如何改进我的代码的建议?谢谢。

1 个答案:

答案 0 :(得分:3)

我认为记忆是你的瓶颈?

不是将所有图像加载到内存然后计算平均值,而是可以在循环中添加体素贴图并在最后进行标准化。这样,在任何给定点只需要一个图像存储在内存中:

Y = init_empty_volume()

subj={'subj1','subj2','subj3','subj4','subj5'}

for a = 1:length(subj)
   indv_roi=spm_select('FPList',fullfile(maindir),sprintf('^%s.*\\.img$',subj{a}));

   X = spm_read_vols(spm_vol(indv_roi),1);
   X(isnan(X))=0;

   Y = Y + X;

end

Y = Y ./ length(subj)

使用init_empty_volume()我的意思是初始化具有正确尺寸的空矩阵,或者加载示例图像并乘以零,无论您的情况更容易。