В чем проблема моего короткого скрипта 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 является.

Другие вопросы по тегам