微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决我的简短 SPM12 脚本似乎有什么问题——它应该对两个神经映射 (.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',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,'i1+i2');

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

,

我认为你是对的,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”命令的输出(以及命令本身,具体取决于您所在的目录数量):它只是一个字符矩阵,即 { {1}} 可以变成文件名的元胞数组。 (它实际上是一个嵌套数组,这就是为什么需要另一行的原因)。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。