I'm not afraid this question might be too obscure, but here it goes!
I have limited experience with scripting, and I wrote this script to sum two neural maps (that contain "c1" or "c2" in their names) with 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!')
However, for some reason, the for loop keeps getting skipped, and the fileName variables are empty every time I run the script.
Can you spot any obvious mistakes with my script?
I think you're right and that spm_select
returns an empty array.
So spm_select
is used to select a 'c1' and 'c2' image of one subject? If you know that there's always a 'c2' for every 'c1' then it would be easier just to use 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
As you can see, you need to manipulate the output of the 'ls' command a bit (as well as the command itself, depending on how many directories down you are): it is just a matrix of characters, that textscan
can turn into a cell array of file names. (it's actually a nested array, that's why the other line is needed).
But then you have a list of 'c1' files from which you can build the 'c2' files. You may want to print its size just in case it's 0. Hopefully the modified call to spm_imcalc
still works - the syntax should be ok, not sure what the shape of tpm
is.