В чем проблема моего короткого скрипта SPM12 - он должен суммировать две нейронные карты (.nii)?
Я не боюсь, что этот вопрос может быть слишком непонятным, но вот оно!
У меня ограниченный опыт написания сценариев, и я написал этот сценарий, чтобы суммировать две нейронные карты (которые содержат «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 пусты каждый раз, когда я запускаю скрипт.
Можете ли вы заметить какие-нибудь очевидные ошибки в моем сценарии?
2 ответа
Мне удалось исправить это, удалив первые четыре строки и напрямую подставив значения в команду 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
используется для выбора изображения «c1» и «c2» одного объекта? Если вы знаете, что всегда есть 'c2' для каждого 'c1', тогда было бы проще использовать
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
является.