我的简短 SPM12 脚本似乎有什么问题 - 它应该对两个神经映射 (.nii) 求和?

What seems to be the problem with my short SPM12 script - it's supposed to sum two neural maps (.nii)?

我不怕这个问题可能太晦涩,但就这样吧!

我编写脚本的经验有限,我编写了这个脚本来用 SPM12 对两个神经图(名称中包含“c1”或“c2”)求和:

dataPath=fileparts(pwd);
dataPath=fullfile(dataPath,'/MATLAB Drive/Target Files');
filterStrC1='^c1';
filterStrC2='^c2';

fileNameC1=spm_select('FPListRec',dataPath,filterStrC1);
fileNameC2=spm_select('FPListRec',dataPath,filterStrC2);

for iSubj=1:size(fileNameC1,1)
    disp(iSubj);
    [filePath, fileName]=fileparts(fileNameC1(iSubj,:));
    fileName=fileName(3:end);
    
    V0_fileName=[ filePath, filesep, 'sum_c12_' ,fileName, '.nii'];
    tpm(iSubj)=spm_imcalc([fileNameC1(iSubjs,:) ;fileNameC2(iSubj,:)], V0_fileName,'i1+i2');
end

disp('sum done!')

但是,由于某些原因,for 循环不断被跳过,每次我 运行 脚本时,fileName 变量都是空的。

你能发现我的脚本有什么明显的错误吗?

我设法通过删除前四行并直接替换 spm_select 命令中的值来修复它。我怀疑 dataPath 变量有问题。 此外,在下一行中有一个额外的“s”,创建一个新变量 iSubjs 而不是使用 iSubj:

    tpm(iSubj)=spm_imcalc([fileNameC1(iSubjs,:) ;fileNameC2(iSubj,:)], V0_fileName,'i1+i2');

我删除了,所以变成了:

    tpm(iSubj)=spm_imcalc([fileNameC1(iSubj,:) ;fileNameC2(iSubj,:)], V0_fileName,'i1+i2');

我仍然不完全确定为什么 有效,但现在它有效了。

我认为你是对的 spm_select returns 一个空数组。

所以spm_select是用来select一个'c1'和'c2'一个主题的图像?如果你知道每个 'c1' 总是有一个 'c2' 那么使用 ls:

会更容易
c1files = ls ( [ DataPath '/*/*/c1*.nii' ] ); % depending on tree depth
c1files = textscan ( c1files, '%s' );
c1files = c1files {1};

for i = 1: length ( c1files )
    c1 = c1files { i };
    c2 = strrrep ( c1, 'c1', 'c2' );
    tpm ( i ) = spm_imcalc ( [ c1; c2 ], 'i1+i2' );
end

如您所见,您需要稍微操作一下 'ls' 命令的输出(以及命令本身,具体取决于您所在的目录数):它只是一个矩阵字符,textscan 可以变成文件名元胞数组。 (它实际上是一个嵌套数组,这就是为什么需要另一行)。

但是您有一个 'c1' 文件列表,您可以从中构建 'c2' 文件。您可能想要打印它的大小以防它为 0。希望对 spm_imcalc 的修改后的调用仍然有效 - 语法应该没问题,不确定 tpm 的形状是什么。