我必须从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
显然这是非常低效的。有没有人有如何改进我的代码的建议?谢谢。
答案 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()
我的意思是初始化具有正确尺寸的空矩阵,或者加载示例图像并乘以零,无论您的情况更容易。