SPM12短脚本无法实现两个.nii神经图谱相加,问题出在哪?
基于SPM12的脑图谱相加脚本错误排查
明确存在的错误项
- 路径拼接错误:
fullfile(dataPath,'/MATLAB Drive/Target Files')中第二个参数开头带斜杠,会被MATLAB识别为根绝对路径,直接覆盖前面fileparts(pwd)得到的父目录,导致实际扫描的路径与预期不符,无法匹配到任何c1/c2开头的nii文件,fileNameC1返回空矩阵,for循环执行范围为1:0直接跳过,这也是fileName变量为空的根本原因。 - 变量拼写错误:循环内
spm_imcalc输入参数中fileNameC1(iSubjs,:)的变量名拼写错误,多写了末尾的s,应为iSubj,即便路径正确运行到此处也会报变量未定义错误。 - 匹配规则与需求不符:正则匹配规则
^c1为匹配文件名开头为c1的文件,若需求是文件名任意位置包含c1则需要去掉开头的^;同时未限制.nii后缀,可能匹配到非影像文件导致后续报错。 - 缺少数据一致性校验:未校验
fileNameC1和fileNameC2的行数是否一致,若存在某被试仅存在c1或c2单张图谱的情况,会触发数组索引报错。
修正后参考代码
% 路径拼接修正,去掉开头斜杠让fullfile自动拼接 dataPath=fileparts(pwd); dataPath=fullfile(dataPath,'MATLAB Drive','Target Files'); % 匹配规则调整,适配“包含c1/c2”需求,同时限制nii后缀 filterStrC1='c1.*\.nii$'; filterStrC2='c2.*\.nii$'; fileNameC1=spm_select('FPListRec',dataPath,filterStrC1); fileNameC2=spm_select('FPListRec',dataPath,filterStrC2); % 新增一致性校验 if size(fileNameC1,1) ~= size(fileNameC2,1) error('c1和c2图谱数量不匹配,请检查文件目录!'); end for iSubj=1:size(fileNameC1,1) disp(iSubj); [filePath, fileName]=fileparts(fileNameC1(iSubj,:)); % 这里如果匹配规则调整为包含的话,需要对应调整截取逻辑,原逻辑是适配开头c1的情况 fileName=fileName(3:end); V0_fileName=[ filePath, filesep, 'sum_c12_' ,fileName, '.nii']; % 修正变量拼写错误 tpm(iSubj)=spm_imcalc([fileNameC1(iSubj,:) ;fileNameC2(iSubj,:)], V0_fileName,'i1+i2'); end disp('sum done!')
内容的提问来源于stack exchange,提问作者Shaun Ivan
相关产品推荐
相关产品推荐

