Използване на цикли за получаване на множество стойности в клетка

Имам 31 теми (S1, S2, S3, S4 и т.н.). Всеки обект има 3 изображения, контраст1.img, контраст2.img и контраст3.img. Бих искал да използвам цикъл, за да получа всички пътища към контрастите от всички субекти в клетка nx1, наречена P. P трябва да бъде нещо подобно:

Data/S1/contrast1.img

Data/S1/contrast2.img

Data/S1/contrast3.img

Data/S2/contrast1.img

Data/S2/contrast2.img

Data/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