Использование циклов для получения нескольких значений в ячейке

У меня 31 предмет (S1, S2, S3, S4 и т. д.). У каждого объекта есть 3 изображения: контраст1.img, контраст2.img и контраст3.img. Я хотел бы использовать цикл, чтобы получить все пути к контрастам от всех субъектов в ячейку nx1 с именем P. P должен быть примерно таким:

Данные/S1/contrast1.img

Данные/S1/contrast2.img

Данные/S1/contrast3.img

Данные/S2/contrast1.img

Данные/S2/contrast2.img

Данные/S2/contrast3.img ...

Данные/S31/contast3.img

Это то, что я пробовал:

A={'S1','S2','S3',...,'S31'}; % all the subjects 
C={'contrast1.img','contrast2.img','contrast3.img'}; % contrast images needed for each subject

P=cell(31*3,1)

for i=1:length(A)

    for j=1:length(C)

     P{j}=spm_select('FPList', fullfile(data_path, Q{i}) sprintf('%s',cell2mat(C(j)))); % this is to select the three contrast images for each subject. It works in my script. It might not be 100% correct here since I had to simplify for this example.

    end

end

Это, однако, дает мне только P с 3 контрастными изображениями последнего объекта. Предыдущие темы перезаписываются. Это указывает на то, что петля неверна, но я не уверен, как это исправить. Может ли кто-нибудь помочь?


person A.Rainer    schedule 25.04.2014    source источник


Ответы (3)


Не нужна петля. Используйте ndgrid для создания комбинаций чисел, num2str с выравниванием по левому краю для преобразования в строки и strcat для объединения без завершающих пробелов:

M = 31;
N = 3;

[jj ii] = ndgrid(1:N, 1:M);
P = strcat('Data/S',num2str(ii(:),'%-i'),'/contrast',num2str(jj(:),'%-i'),'.img')
person Luis Mendo    schedule 25.04.2014

Я бы использовал матрицу ячеек, которая напрямую представляет предметный индекс и контрастный индекс.

Для предварительного выделения используйте P=cell(length(A),length(C)), а для заполнения используйте P{i,j}=...

Если вы хотите получить доступ к 3-му изображению 5-го субъекта, используйте P{5,3}

person Daniel    schedule 25.04.2014
comment
Благодарю за ваш ответ! Это почти работает, но P должен быть ячейкой 93x1, а изображения должны быть в том же порядке, как я упомянул в своем исходном сообщении (т.е. отсортированы по темам, а затем отсортированы по контрастам). - person A.Rainer; 26.04.2014

Проблема в том, где вы назначаете P{j}.

Поскольку j зацикливается только 1:3 и не заботится о i, вы просто переписываете все три значения для P{j}. Я думаю, вы хотите вместо этого объединить новые значения в массив ячеек

for i=1:length(A)

    for j=1:length(C)

        P ={P; spm_select('FPList', fullfile(data_path, Q{i}) sprintf('%s',cell2mat(C(j))));}

    end

end

или вы можете назначить каждое значение напрямую, например

for i=1:length(A)

    for j=1:length(C)

        P{3*(i-1)+j} =spm_select('FPList', fullfile(data_path, Q{i}) sprintf('%s',cell2mat(C(j))));

    end

end
person Suneth Attygalle    schedule 25.04.2014
comment
Спасибо за ответ. Вы уверены насчет P{i+3*(i-1)+j}? - person A.Rainer; 26.04.2014
comment
Хороший улов, это должно быть просто P{3*(i-1)+j}, которое я обновил в своем ответе. - person Suneth Attygalle; 28.04.2014