改进内存效率低下的脚本



我必须从 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

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

我想记忆是你的瓶颈?

无需将所有图像加载到内存中然后计算平均值,您可以在循环中添加体素映射并最终归一化。这样,在任何给定点,内存中只需要一个图像:

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(),我的意思是要么用正确的尺寸初始化一个空矩阵,要么加载一个示例图像并乘以零,在你的情况下更容易。

最新更新