0

我不担心这个问题可能太晦涩难懂,但它就是这样!

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

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 变量都是空的。

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

4

2 回答 2

0

我设法通过删除前四行并直接替换 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');

我仍然不完全确定为什么会这样,但现在可以了。

于 2021-06-03T06:54:00.287 回答
0

我认为你是对的,它spm_select返回一个空数组。

那么spm_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是什么。

于 2021-06-18T04:37:36.003 回答