Matlab 使用循环将多个值放入单元格

Matlab 使用循环将多个值放入单元格,matlab,loops,cell,Matlab,Loops,Cell,我有31个科目(S1、S2、S3、S4等)。每个受试者有3幅图像,对比度1.img、对比度2.img和对比度3.img。我想使用一个循环,将所有对象的对比度的所有路径放入一个名为P的nx1单元格中。P应该是这样的: 数据/S1/1.img 数据/S1/2.img 数据/S1/3.img 数据/S2/1.img 数据/S2/2.img 数据/S2/3.img Data/S31/contast3.img 这就是我尝试过的: A={'S1','S2','S3',...,'S31'}; % all t

我有31个科目(S1、S2、S3、S4等)。每个受试者有3幅图像,对比度1.img、对比度2.img和对比度3.img。我想使用一个循环,将所有对象的对比度的所有路径放入一个名为P的nx1单元格中。P应该是这样的:

数据/S1/1.img

数据/S1/2.img

数据/S1/3.img

数据/S2/1.img

数据/S2/2.img

数据/S2/3.img

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

然而,这只给了我最后一个对象的3张对比度图像的p。以前的主题会被覆盖。这表明循环是错误的,但我不确定如何修复它。有人能帮忙吗?

问题是在哪里分配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

我将使用一个单元格矩阵,它直接表示主题索引和对比度索引

要预先分配使用
p=cell(长度(A),长度(C))
并填充它,请使用
p{i,j}=…

当您想要访问第五个对象的第三个图像时,请使用
p{5,3}

无需循环。用于生成数字组合,使用左对齐方式转换为字符串,并在没有尾随空格的情况下连接:

M = 31;
N = 3;

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

谢谢你的回复!这几乎是可行的,但P必须是一个93x1单元,并且图像的顺序必须与我在原始消息中提到的相同(即按主题排序,然后按对比度排序)。感谢您的回复。你确定P{i+3*(i-1)+j}吗?很好,应该是P{3*(i-1)+j},我在回答中更新了它。